2017-08-13 4 views
0

Je rencontre des problèmes avec les noms de tables utilisés comme paramètres dans OleDb. En parcourant des forums avec des questions similaires, j'ai compris qu'il était impossible d'utiliser des paramètres de cette façon. Mais il n'y avait pas de solution à ce problème. Bien sûr, je peux utiliser des noms de tables réels, mais il y en a beaucoup, donc il serait plus facile de traiter les tables nécessaires séparément. Et j'ai essayé d'utiliser juste la concaténation de chaîne en utilisant SQL dynamique qui conduit à des problèmes d'injection SQL. Donc, voici mon codeRequête paramétrée dans C# OleDb. Problème de requête incomplet

foreach (String Data in tablelist) 
     { 
      if (Data == "Harvard") 
      { 
       cmd.Parameters.Add("@tablename", OleDbType.Char); 
       cmd.Parameters["@tablename"].Value = Data; 
       cmd1.Parameters.AddWithValue("@University", Data); 
       cmd.CommandText = "insert into @tablename ([Firstname],[Lastname]) values (?,?)"; 
      } 
     } 

Étant donné que je ne peux pas utiliser le paramètre dans INSERT INTO qui commande que je devrais utiliser ne pas avoir troublé de commandement. Comment cette difficulté peut-elle être surmontée? Merci à l'avance

+0

Où trouvez-vous les noms de table? Si vous fournissez une liste blanche de noms où l'utilisateur peut choisir sans aucune possibilité de les éditer, alors vous êtes assez à l'abri de Sql Injection basé sur une entrée utilisateur malveillante. Vous pouvez donc utiliser la concaténation de chaînes dans ce contexte. – Steve

+1

Vous ne pouvez pas paramétrer des identifiants dans sql. Même si vous le pouvez, votre code entraînerait une exception pour toute table qui ne contient pas les colonnes FirstName et LastName. En fait, le code dans votre question n'a aucun sens - Vous avez le nom de la table codé en dur, mais vous essayez de l'utiliser avec un paramètre nommé (bien que OleDb ne supporte pas les paramètres nommés), Et vous êtes insérer les mêmes données dans les deux paramètres. –

+0

Merci pour votre clarification. Que voulez-vous dire par la possibilité de modifier les noms des utilisateurs. Si je comprends bien, la seule façon d'y faire face est d'utiliser la concaténation de chaînes en utilisant la liste blanche des noms. Dans mon cas, les utilisateurs sélectionnent simplement le nom de la table dans la liste présentée (en fait, depuis combobox) et le code la traite. @Steve – PeterEliot

Répondre

0

Vous devrez concaténer le SQL et le nom de la table, comme:

cmd.CommandText = "insert into " + Data + " ([Firstname],[Lastname]) values (?,?)";