2012-12-22 21 views
6

C# ve SQL'de yeni başlayan biriyim, gerçekleştirmeyi istediğim bu SQL insert ifadesine sahibim. Eklemek istediğim diğer değişkenler arasında tablo adını sorar.Tablo değişkenini @table olarak bildirmeliyim @table

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

Eklentinizin statüsü için bir değişken olarak tablo ismine sahip olmanıza izin verilmiyor gibi bir şeye ihtiyacınız varsa sp_exec'e bakın. söyledi. – rene

cevap

11

:

Bu kod parçasıdır

@ Tablo değişkeni tablo bildirmeniz gerekir: ben bu konsol uygulaması çalıştırdığınızda

Ama bu hatayı alıyorum Bunu yapamazsın. Bunun yerine bunu yapabilirsiniz

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

:

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

Bu, sql enjeksiyonuna herhangi bir şekilde izin veriyor mu? –

+3

@RafaelAdel Evet öyle. 'Tblname' veritabanınızdaki bir tablonun olup olmadığını kontrol etmelisiniz (' SELECT * FROM INFORMATION_SCHEMA.TABLES'). – ctusch

+2

@RafaelAdel, [ve] için tablo adını kontrol ediyorum. Eğer içeriyorsa o zaman durdurun. Daha sonra tablo adını [] içine alın. –

4

tablo adı bir sql sorgusunda girdi parametresi olamaz Bir parametre olarak o şekilde tablo adını geçemez. aşağıdaki gibi Ancak, her zaman "SqlCommand geçirmeden ÖNCE sql dizesi hazırlayabilirsiniz:

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

ve sonra

SqlCommand com = new SqlCommand(sqlString); 
... 
İlgili konular