10
votes

Une question de SQLCOMMAND avec des paramètres pour

Apparemment, le code suivant n'imprime rien comme prévu. Je suis sûr qu'il est de faire avec le fait que j'ai essayé de mettre une liste d'éléments dans @Namelist . Clairement, ce n'est pas simplement un remplacement de texte.

Comment puis-je résoudre ce problème? Merci xxx


4 commentaires

Euh, vous ne faites rien avec @Namelist ?


Au lieu de "Tradename" dans votre addWithValue avez-vous essayé @Namelist


Ma solution personnelle est celle-ci La réponse inclut une méthode d'extension pour convertir ienumerable à iEnumerable


J'ai entendu parler de quelqu'un qu'il pourrait y avoir une question de sécurité si cela est autorisé. C'est SQL Server qui n'autorise pas cela plutôt que sur la couche DotNet. Quelqu'un a des commentaires sur cela?


3 Réponses :


-2
votes

Vous n'utilisez pas votre liste maintenant. Si vous n'en avez pas besoin pour quelque chose d'autre, vous pouvez simplement faire cela:

 using (var connection = new SqlConnection(_connectionString))
    {
        connection.Open();
        using (var cmd = connection.CreateCommand())
        {
            cmd.CommandText = @"select column_name, table_name from information_schema.columns where table_name in ('tradeName',  'tableOne', 'tableTwo')"

            var reader = cmd.ExecuteReader();

            while (reader.Read())
            {
              var a = reader[0];
              Console.WriteLine(a);
            }
        }


1 commentaires

Qu'est-ce qu'il y a avec le -1 et aucun commentaire?



9
votes

Malheureusement, les paramètres SQL ne sont pas résolus de cette façon, en d'autres termes, le backend ne consiste pas simplement à construire une chaîne de sécurité remplaçant chaque paramètre avec sa valeur. Au lieu de cela, vous devrez créer de manière dynamique une liste de paramètres: xxx

puis ajouter chaque paramètre: xxx

vous pouvez bien sûr ajouter ces paramètres dans une boucle si le nombre était inconnu jusqu'à l'exécution: xxx

si votre liste de tables a été stockée dans un Enum ou vous pouvez vous échapper les ou les valident avec une expression régulière, il serait également assez sûr de simplement construire le SQL brut vous-même et ne pas utiliser les paramètres du tout.

Ceci est, bien sûr, l'une des grandes raisons que j'utilise < un href = "http://www.postgresql.org/"> postgresql ; Support natif pour les tableaux.


2 commentaires

Oracle a des tableaux associatifs. SQL Server a des paramètres de valeur de table.


J'ai vérifié dans les paramètres de la valeur de table une fois et c'était trop déroutant pour moi. Ado.net ne ferait pas simplement le maréchal sur les données en tant que tableau, et dans la SPTP, vous avez dû participer à cette table TEMP ou de non-sens. Postgres vous permet de passer à une chaîne [] en tant que param et do où x in (: myarraray) - la façon dont vous vous attendez à fonctionner.



4
votes

Comme il a été noté, "dans" listes, etc. sont notoirement maladroits dans Ado.net; Pour cette raison, certains outils offrent des méthodes de commodité pour aider. Par exemple, DAPPER STRAND> offre une variante sur la syntaxe "IN" qu'il élargit automatiquement à la forme paramétrée correcte (sécurité d'injection toujours conditionnelle, etc.) - Utilisation "dynamique" de type et "dynamique". Par exemple:

string[] namelist = ...
foreach(var row in conn.Query(@"
    select column_name, table_name
    from information_schema.columns
    where table_name in @namelist",
        new { namelist } ))
{
    string col = row.column_name,
         table = row.table_name;
    // .. 
}


1 commentaires

Frick Man, qu'est-ce qui ne peut pas faire Dapper!