ホームページ > バックエンド開発 > C++ > Entity Framework のストアド プロシージャにテーブル値パラメーターを渡す方法

Entity Framework のストアド プロシージャにテーブル値パラメーターを渡す方法

Patricia Arquette
リリース: 2025-01-12 22:06:43
オリジナル
296 人が閲覧しました

How to Pass Table-Valued Parameters to Stored Procedures in Entity Framework?

Entity Framework ストアド プロシージャのテーブル値パラメーター

Entity Framework 自体は、ストアド プロシージャへのテーブル値パラメーターの受け渡しを直接サポートしていません。ただし、 ObjectContextExecuteStoreQuery メソッドを使用して回避策を実装できます。

上記のコードでは、リポジトリに共通の ExecuteStoredProcedure メソッドがあります:

<code class="language-csharp">public IEnumerable<T> ExecuteStoredProcedure<T>(string procedureName, params object[] parameters)
{
    StringBuilder command = new StringBuilder();
    command.Append("EXEC ");
    command.Append(procedureName);
    command.Append(" ");

    // 为每个传入的参数添加占位符
    for (int i = 0; i < parameters.Length; i++)
    {
        if (i > 0)
            command.Append(",");

        command.Append("{" + i + "}");
    }

    return this.context.ExecuteStoreQuery<T>(command.ToString(), parameters);
}</code>
ログイン後にコピー

このメソッドを使用してテーブル値パラメーターを渡すと、「テーブル型パラメーター p6 には有効な型名が必要です」などのエラーが発生する場合があります。この問題を解決するには、SqlDbTypeStructured として指定し、SqlParameter.TypeName をデータベース内のユーザー定義型 (UDT) の名前に設定する必要があります。

ただし、これらの変更を行っても、無効な構文に関連するエラーが発生する可能性があります。

カスタム拡張メソッド

ObjectContext クラスのカスタム拡張メソッドを使用すると、このプロセスを簡素化できます:

<code class="language-csharp">public static void ExecuteStoredProcedure(this ObjectContext context, string storedProcName, params object[] parameters)
{
    string command = "EXEC " + storedProcName + " @caseid, @userid, @warnings";

    context.ExecuteStoreCommand(command, parameters);
}</code>
ログイン後にコピー

この拡張メソッドを使用すると、テーブル値パラメーターを使用してストアド プロシージャを直接呼び出すことができます。使用例は次のとおりです:

<code class="language-csharp">var entities = new NewBusinessEntities();

var dt = new DataTable();
dt.Columns.Add("WarningCode");
dt.Columns.Add("StatusID");
dt.Columns.Add("DecisionID");
dt.Columns.Add("Criticality");

dt.Rows.Add("EO01", 9, 4, 0);
dt.Rows.Add("EO00", 9, 4, 0);
dt.Rows.Add("EO02", 9, 4, 0);

var caseId = new SqlParameter("caseid", SqlDbType.Int);
caseId.Value = 1;

var userId = new SqlParameter("userid", SqlDbType.UniqueIdentifier);
userId.Value = Guid.Parse("846454D9-DE72-4EF4-ABE2-16EC3710EA0F");

var warnings = new SqlParameter("warnings", SqlDbType.Structured);
warnings.Value = dt;
warnings.TypeName = "dbo.udt_Warnings";

entities.ExecuteStoredProcedure("usp_RaiseWarnings_rs", userId, warnings, caseId);</code>
ログイン後にコピー

制限事項

この拡張メソッドまたは同様のカスタム メソッドを使用する場合は、次の制限を考慮してください:

  • ストアド プロシージャのパラメーターは順序どおりに配置され、拡張メソッドに渡されるパラメーターに対応している必要があります。
  • デフォルト値がある場合でも、UDT 内のすべての列を指定する必要があります。

以上がEntity Framework のストアド プロシージャにテーブル値パラメーターを渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート