2012-12-22 43 views
6

Tôi là người mới bắt đầu trong C# và SQL, tôi có câu lệnh chèn SQL này mà tôi muốn thực hiện. Nó yêu cầu tên bảng trong số các biến khác mà tôi muốn chèn.Phải khai báo biến bảng @table

Nhưng khi tôi chạy ứng dụng giao diện điều khiển này tôi nhận được lỗi này:

Phải khai báo bảng biến @table

Đây là một phần của mã:

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

Nó không được phép có tên bảng của statememt chèn của bạn như là một biến.Nhìn vào sp_exec nếu bạn cần một cái gì đó như cái đó. – rene

Trả lời

11

Bạn không thể làm điều này. Bạn không thể vượt qua các tên bảng như một tham số theo cách bạn đã làm:

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

Bạn có thể làm điều này thay vì:

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

Điều này có cho phép tiêm sql theo bất kỳ cách nào không? –

+3

@RafaelAdel Có. Bạn nên kiểm tra nếu 'tblname' là một bảng trong cơ sở dữ liệu của bạn (' SELECT * FROM INFORMATION_SCHEMA.TABLES'). – ctusch

+2

@RafaelAdel, tôi kiểm tra tên bảng cho [và]. Nếu nó có hoặc sau đó dừng lại. Sau đó, kèm theo tên bảng trong []. –

4

Tên bảng không thể là một tham số đầu vào trong một truy vấn sql. Tuy nhiên, bạn luôn có thể "lập chuỗi sql TRƯỚC đi qua nó để SqlCommand như sau:

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

và sau đó

SqlCommand com = new SqlCommand(sqlString); 
... 
Các vấn đề liên quan