Entity Framework ストアド プロシージャのテーブル値パラメーター
Entity Framework 自体は、ストアド プロシージャへのテーブル値パラメーターの受け渡しを直接サポートしていません。ただし、 ObjectContext
の ExecuteStoreQuery
メソッドを使用して回避策を実装できます。
上記のコードでは、リポジトリに共通の 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 には有効な型名が必要です」などのエラーが発生する場合があります。この問題を解決するには、SqlDbType
を Structured
として指定し、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>
制限事項
この拡張メソッドまたは同様のカスタム メソッドを使用する場合は、次の制限を考慮してください:
以上がEntity Framework のストアド プロシージャにテーブル値パラメーターを渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。