Lỗi khi dùng ADO.NET thực hiện truy vấn

Chào mọi người , em đang thực hiện việc sửa lỗi SQL Injection trong code C# thì được như sau :

void ExecuteQueryToTable(SqlCommand cmd)
{            
     using (SqlDataAdapter dta = new SqlDataAdapter(cmd))
     {
           DataTable dt = new DataTable();
           dta.Fill(dt);
           dgvResult.DataSource = dt;
     }            
}
//Các biến MSV và TableName là string đã được gán giá trị 
void Process()
{
     string query2 = @"SELECT TENMONHOC as 'Tên Môn Học',
                     SOTINCHI as 'Số Tín Chỉ',
                     CHUYENCAN as 'Chuyên Cần',
                     GIUAKY as 'Giữa kỳ',
                     CUOIKY as 'Cuối kỳ',                                    
                     FROM @TBN  
                     INNER JOIN SINHVIEN ON @TBN.MASINHVIEN=SINHVIEN.MASINHVIEN
                     INNER JOIN MONHOC ON @TBN.MAMONHOC=MONHOC.MAMONHOC
                     WHERE SINHVIEN.MASINHVIEN = @MSV";

      using (SqlCommand cmd = new SqlCommand(query2,con))
      {                    
                    cmd.Parameters.AddWithValue("@TBN", TableName);
                    cmd.Parameters.AddWithValue("@MSV", MSV);                   
                    ExecuteQueryToTable(cmd);
      }  
}              

Thì gặp phải Exeption sau : “Must declare the table variable “@TBN”.”
Em không hiểu vì sao lại bắt được lỗi như vậy @@ , vì em đã tra tài liệu và cả google , có áp dụng thử một vài cách khác nhưng đều gặp lỗi tương tự
Mong mọi người giải ngố giúp em với ạ , em xin cảm ơn

nhìn trong hàm bạn viết không thấy biến TableName khai báo ở đâu cả

4 Likes

2 biến đó là string đã có giá trị ạ :3

Em có chú thích ở Comment , em chỉ copy phần code chính lên đây thôi

Đây là ngoại lệ của SQL.
Mình nghĩ do 2 dòng:

Có thể phương thức AddWithValue() đã không thay thế 2 chuỗi @TBN tại đó nên khi truy vấn thì nó còn nguyên là @TBN.MASIHVIEN@TBN.MAMONHOC nên lỗi.

Nếu bạn muốn chống “tiêm chích” SQL thì nên dùng Thủ tục lưu trữ (Stored Procedure).

3 Likes

Em thắc mắc vì xem qua tài liệu và Youtube thì họ đều làm như vậy và không gặp lỗi @@,
lỗi ở đây là không Declare biến đó nhưng thử Search thì không tìm được cách khắc phục.
Do còn 1 số string khác ngắn hơn nên em nghĩ dùng Stored Procedure thì thêm rắc rối , em đã thử cách cộng các chuỗi với nhau thì chương trình không có lỗi nhưng như vậy thì vi phạm SQL Injection :3

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?