Paramètres table de la procédure stockée Entity Framework
Entity Framework lui-même ne prend pas directement en charge la transmission de paramètres table aux procédures stockées. Cependant, une solution de contournement peut être implémentée en utilisant la méthode ObjectContext
de ExecuteStoreQuery
.
Dans le code ci-dessus, il existe une méthode ExecuteStoredProcedure
courante dans le référentiel :
<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>
Lorsque vous transmettez des paramètres table à l'aide de cette méthode, vous pouvez obtenir des erreurs telles que "Le paramètre de type de table p6 doit avoir un nom de type valide". Pour résoudre ce problème, vous devez spécifier SqlDbType
comme Structured
et définir SqlParameter.TypeName
sur le nom du type défini par l'utilisateur (UDT) dans la base de données.
Cependant, même avec ces modifications, vous pouvez toujours rencontrer des erreurs liées à une syntaxe invalide.
Méthode d'extension personnalisée
Une méthode d'extension personnalisée de la classeObjectContext
peut simplifier ce processus :
<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>
Cette méthode d'extension vous permet d'appeler directement des procédures stockées avec des paramètres table. Un exemple d'utilisation est le suivant :
<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>
Restrictions
Lorsque vous utilisez cette méthode d'extension ou des méthodes personnalisées similaires, veuillez tenir compte des limitations suivantes :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!