2009-07-29 7 views
1

Je veux fournir le nom de la table pour une requête en tant que paramètres de commande, comme ceci:Comment puis-je fournir le nom de table pour une requête en tant que paramètre de commande dans Npgsql?

public class Foo 
{ 
    private const String myTableName = "mytable"; 

    public void Bar() 
    { 
     NpgsqlCommand command = new NpgsqlCommand("SELECT * from :tableName", connection); 
     command.Parameters.Add(new NpgsqlParameter("tableName", DbType.String)); 
     command.Parameters[0].Value = myTableName; 
    } 
} 

Cela semble conduire à cette requête: "SELECT * from E'mytable'" qui se traduit par une erreur (attention aux guillemets simples). Ai-je vraiment besoin de faire une concaténation de chaînes pour cela? Il n'a pas d'importance du point de vue de la sécurité, puisque le nom de la table ne peut pas être modifiée par la concaténation utilisateur mais chaîne pour la création de requêtes SQL me donne toujours la chair de poule ...

Merci, Eric

Répondre

3

noms de table ne peut pas être envoyé en tant que paramètres. Les noms des tables sont résolus au moment de l'analyse, car ils sont nécessaires pour la planification et de telles choses. Les paramètres ne sont remplacés qu'à l'exécution de l'exécuteur (ou de l'optimiseur si nécessaire).

Alors oui, vous aurez besoin d'utiliser un remplacement de chaîne pour cela. Ce n'est pas un problème de sécurité (ou même le risque de le devenir) tant que le nom de la table vient d'un const dans votre classe, bien sûr. Mais si vous construisez le nom de la table à partir de l'entrée de l'utilisateur, vous devez faire très attention. Mais généralement, si vous avez besoin de construire le nom de la table à partir de l'entrée de l'utilisateur, quelque chose est mal conçu dans la base de données et devrait être corrigé (oui, il y a bien sûr des exceptions).

+0

Les noms des tables sont toujours des constantes. Merci. – EricSchaefer

Questions connexes