Ce qui se passe dans le paramètre params de la .SqlQuery() méthode dans le Cadre de l'Entité?
La méthode prend une chaîne de la requête, et un tableau de Object []
pour les paramètres, sans doute pour éviter les Injection SQL.
Cependant nulle part sur la terre est-elle documentée de ce que vous devriez mettre dans le tableau d'objets.
Il y a une autre question sur de SORTE que vous demande c'est exactement la même chose, mais le a accepté de répondre ne fonctionne pas: Lors de l'utilisation de DbSet<T>.SqlQuery(), comment utiliser des paramètres nommés?
J'ai essayé toutes les formes de paramètre de remplacement je pense, et tous lancer une exception. Des idées?
Aurait-il été aussi simple que:
SqlQuery("SELECT * FROM @table", "Users")
Edit: Voici certaines choses que j'ai essayé (à l'Exception d'un SqlException
):
var result = context.Users.SqlQuery<T>("SELECT * FROM @p0 WHERE @p1 = '@p2'",
new SqlParameter("p0", tableName),
new SqlParameter("p1", propertyName),
new SqlParameter("p2", searchQuery));
Cela donne Must declare the table variable "@p0".
var result = context.Users.SqlQuery<T>("SELECT * FROM {0} WHERE {1} = '{2}'", tableName, propertyName, searchQuery);
Cela donne Must declare the table variable "@p0".
SqlQuery exécute SQL directe avec la base de données. Je reçois plusieurs erreurs en fonction de l'approche que j'ai essayer. Je vais en mettre dans la question.
Facile de référence: msdn.microsoft.com/en-us/library/...
Vous ne pouvez pas utiliser une variable comme nom de la table: stackoverflow.com/questions/14003241/.... Vous avez besoin de quelque chose comme:
var result = context.Users.SqlQuery<T>("SELECT * FROM " + tableName + " WHERE @p0 = '@p1'", new SqlParameter("p0", propertyName), new SqlParameter("p1", searchQuery));
Alors, quand j'ai dit "je ne savais même pas que vous pouvez utiliser un paramètre pour le nom de la table" je suppose que je ne devrais pas avoir été gêné de ne pas savoir que...
OriginalL'auteur NibblyPig | 2013-07-25
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de mal avec votre syntaxe de requête ou comment avez-vous créé et adopté dans le
SqlParameter
objets.Votre problème est que vous essayez d'utiliser une variable comme le nom de la table, ce que vous ne pouvez pas faire (voir: Devez déclarer la variable tableau @tableau), de sorte que vous devez manuellement "template" le nom de la table dans votre requête:
Quelque chose comme.
Assurez-vous de désinfecter la table de nom si cela vient de la saisie de l'utilisateur pour éviter les injection sql. Voir par exemple ici: stackoverflow.com/q/13887202/284111
OriginalL'auteur nemesv