J'essaie d'appeler une procédure stockée qui accepte un tableau de valeur de paramètre. Je sais que ce n'est pas directement pris en charge dans le Cadre de l'Entité, mais encore de ce que je comprends, vous pouvez le faire en utilisant le ExecuteStoreQuery de commande hors de la ObjectContext. J'ai un générique de l'entité cadre référentiel dans lequel j'ai le texte suivant ExecuteStoredProcecdure méthode:
public IEnumerable<T> ExecuteStoredProcedure<T>(string procedureName, params object[] parameters)
{
StringBuilder command = new StringBuilder();
command.Append("EXEC ");
command.Append(procedureName);
command.Append(" ");
// Add a placeholder for each parameter passed in
for (int i = 0; i < parameters.Length; i++)
{
if (i > 0)
command.Append(",");
command.Append("{" + i + "}");
}
return this.context.ExecuteStoreQuery<T>(command.ToString(), parameters);
}
La chaîne de commande se termine comme ceci:
EXEC someStoredProcedureName {0},{1},{2},{3},{4},{5},{6},{7}
J'ai essayé cette méthode sur une procédure stockée qui accepte une table d'une valeur de paramètre et il se casse. J'ai lu ici que les paramètres nécessaires pour être de type SqlParameter et la table d'une valeur de paramètre doit avoir la SqlDbType ensemble Structuré. J'ai donc fait cela et je reçois un message d'erreur indiquant:
The table type parameter p6 must have a valid type name
Donc, j'ai mis le SqlParameter.TypeName pour le nom du type défini par l'utilisateur que j'ai créé sur la base de données et puis, quand j'exécute la requête j'ai le vraiment utile d'erreur:
Incorrect syntax near '0'.
Je peux obtenir l'exécution de la requête si je revenir à ADO.NET et et exécuter un lecteur de données, mais j'espérais pour le faire fonctionner en utilisant les données de contexte.
Est-il possible de passer un tableau de la valeur du paramètre à l'aide de ExecuteStoreQuery? Aussi, je me suis fait à l'aide de Entity Framework Code First et le casting du DbContext pour un ObjectContext pour obtenir le ExecuteStoreQuery méthode disponible. Est-ce nécessaire ou peut-on le faire à l'encontre de la DbConext ainsi?