2012-12-22 3 views
6

Je suis un débutant en C# et SQL, j'ai cette instruction d'insertion SQL que je veux effectuer. Il demande le nom de la table parmi les autres variables que je veux insérer.Doit déclarer la variable de table @table

Mais quand je lance cette application console i obtenir cette erreur:

doit déclarer la table des variables @table

Ceci est une partie du code:

StreamReader my_reader = getFile(args); 
string CS = formCS(); 
try 
{ 
    using (SqlConnection con = new SqlConnection(CS)) 
    { 
     SqlCommand com = new SqlCommand("insert into @table (time, date, pin) values (@time, @date, @pin)", con);      
     con.Open(); 
     Console.WriteLine("Enter table name:"); 
     Console.Write(">> "); 
     string tblname = Console.ReadLine(); 
     com.Parameters.AddWithValue("@table", tblname); 

     string line = ""; 
     int count = 0; 
     while ((line = my_reader.ReadLine()) != null) 
     { 
      Dictionary<string, string> result = extractData(line);       
      com.Parameters.AddWithValue("@time", result["regTime"]); 
      com.Parameters.AddWithValue("@date", result["regDate"]); 
      com.Parameters.AddWithValue("@pin", result["regPin"]); 
      count += com.ExecuteNonQuery(); 
      com.Parameters.Clear();       

     } 
     Console.WriteLine("Recoreds added : {0}", count.ToString()); 
     Console.WriteLine("Press Enter to exit."); 
    } 
    Console.ReadLine(); 
} 
catch (SqlException ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message);     
} 
+5

Il n'est pas autorisé d'avoir le nom de table de votre insert statememt en tant que variable. Recherchez dans sp_exec si vous avez besoin de quelque chose comme cette. – rene

Répondre

11

Tu ne peux pas faire ça. Vous ne pouvez pas passer le nom de la table comme paramètre la façon dont vous avez fait:

SqlCommand com = new SqlCommand("insert into @table ..."); 
... 
com.Parameters.AddWithValue("@table", tblname); 

Vous pouvez le faire à la place:

Console.WriteLine("Enter table name:"); 
Console.Write(">> "); 
string tblname = Console.ReadLine(); 

string sql = String.Format("insert into {0} (time, date, pin) values ... ", tblname); 

SqlCommand com = new SqlCommand(sql, con);      

... 
+3

Est-ce que cela permet l'injection SQL de quelque façon que ce soit? –

+3

@RafaelAdel Oui c'est le cas. Vous devriez vérifier si 'tblname' est une table dans votre base de données (' SELECT * FROM INFORMATION_SCHEMA.TABLES'). – ctusch

+2

@RafaelAdel, je vérifie le nom de la table pour [et]. Si elle contient soit alors arrêtez. Puis entourez le nom de la table dans []. –

4

Le nom de la table ne peut pas être un paramètre d'entrée dans une requête SQL. Cependant, vous pouvez toujours « préparer la chaîne SQL avant de le transmettre au SqlCommand comme suit:

var sqlString = string.Format("insert into {0} (time, date, pin) values (@time, @date, @pin)", tblname) 

puis

SqlCommand com = new SqlCommand(sqlString); 
... 
Questions connexes