首頁 >後端開發 >C++ >如何將表值參數傳遞給實體框架中的預存程序?

如何將表值參數傳遞給實體框架中的預存程序?

Patricia Arquette
Patricia Arquette原創
2025-01-12 22:06:43303瀏覽

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 必須具有有效的類型名稱」。若要解決此問題,必須將 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>

限制條件

使用此擴充方法或類似的自訂方法時,請考慮以下限制:

  • 預存程序參數必須依序排列,並與傳遞給擴充方法的參數相對應。
  • 必須指定 UDT 中的所有列,即使它們具有預設值。

以上是如何將表值參數傳遞給實體框架中的預存程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn