Entity Framework gespeicherte Prozedurtabellenwertparameter
Entity Framework selbst unterstützt die Übergabe von Tabellenwertparametern an gespeicherte Prozeduren nicht direkt. Eine Problemumgehung kann jedoch mithilfe der ObjectContext
-Methode von ExecuteStoreQuery
implementiert werden.
Im obigen Code gibt es eine allgemeine ExecuteStoredProcedure
-Methode im Repository:
<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>
Beim Übergeben von Tabellenwertparametern mit dieser Methode erhalten Sie möglicherweise Fehlermeldungen wie „Der Tabellentypparameter p6 muss einen gültigen Typnamen haben“. Um dieses Problem zu beheben, müssen Sie SqlDbType
als Structured
angeben und SqlParameter.TypeName
auf den Namen des benutzerdefinierten Typs (UDT) in der Datenbank festlegen.
Allerdings können trotz dieser Änderungen immer noch Fehler im Zusammenhang mit ungültiger Syntax auftreten.
Benutzerdefinierte Erweiterungsmethode
Eine benutzerdefinierte Erweiterungsmethode der KlasseObjectContext
kann diesen Prozess vereinfachen:
<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>
Mit dieser Erweiterungsmethode können Sie gespeicherte Prozeduren direkt mit Tabellenwertparametern aufrufen. Beispielverwendung ist wie folgt:
<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>
Einschränkungen
Wenn Sie diese Erweiterungsmethode oder ähnliche benutzerdefinierte Methoden verwenden, beachten Sie bitte die folgenden Einschränkungen:
Das obige ist der detaillierte Inhalt vonWie übergebe ich Tabellenwertparameter an gespeicherte Prozeduren im Entity Framework?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!