a

Câu hỏi Sự cố khi chèn chuỗi hoặc NULL vào cơ sở dữ liệu SQL Server


Tôi gặp khó khăn khi đưa ra cú pháp thích hợp để cho phép một chuỗi hoặc NULL được chuyển đến cơ sở dữ liệu. Đây là mã của tôi:

string insertString = String.Format(
    @"INSERT INTO upload_history (field1, field2, field3) 
    VALUES ('{0}', '{1}', '{2}')",
    varField1, varField2, varField3);

Tôi đã sử dụng dấu nháy đơn xung quanh trình giữ chỗ biến để cơ sở dữ liệu chấp nhận đúng giá trị chuỗi. Tuy nhiên, nếu NULL được thông qua, nó kết thúc vào cơ sở dữ liệu như chuỗi "NULL".

Có cách nào tôi có thể để lại dấu nháy đơn trong chuỗi InsertCommand và điều kiện thêm dấu nháy đơn cho các biến của tôi?


7
2017-12-17 13:27


gốc




Các câu trả lời:


Không nối chuỗi (string.Format) - tham số sử dụng (@p1 vv) - sau đó bạn có thể vượt qua DBNull.Value có nghĩa là null với SQL Server

SqlCommand cmd = new SqlCommand();
cmd.CommandText = @"INSERT INTO upload_history (field1, field2, field3) 
   VALUES (@p1, @p2, @p3)";
cmd.Parameters.AddWithValue("@p1", (object)someVar ?? DBNull.Value);
//...

Điều này cũng bảo vệ bạn khỏi việc tiêm SQL


22
2017-12-17 13:30



Tôi nhận được lỗi sau khi sử dụng "someVar ?? DBNull.Value" như trên: "Nhà điều hành '??' không thể được áp dụng cho các toán hạng cho chuỗi kiểu và System.DBNull "Bất kỳ suy nghĩ nào về cách thức này sẽ làm việc với một chuỗi? - buzzzzjay
@buzzzzjay thêm một (object) trước mặt họ. - Marc Gravell♦
Ngọt! Điều đó thực sự hữu ích! Cảm ơn! - buzzzzjay


Tập trung chuỗi với String.Format có thể là một nguy cơ bảo mật lớn (SQL Injection), và cũng có vấn đề nếu bạn muốn chèn ký tự.

Dung dịch:

cmd.CommandText = "INSERT INTO upload_history (field1, field2, field3) " +
    "VALUES (@p1, @p2, @p3)";
cmd.Parameters.AddWithValue("@p1", varField1);
cmd.Parameters.AddWithValue("@p2", varField2);
cmd.Parameters.AddWithValue("@p3", varField3);
cmd.ExecuteNonQuery();

5
2017-12-17 13:32



Ngoài ra một câu trả lời tuyệt vời nhưng Marc đánh bại bạn với nó. Cám ơn vì sự gợi ý. - beardog


Trong tinh thần trả lời câu hỏi khi được hỏi, và nhận thức đầy đủ rằng việc tái cấu trúc mã để paramaterizing các truy vấn là giải pháp đúng, bạn có thể viết một hàm trả về chuỗi đơn được trích dẫn hoặc giá trị chuỗi NULL không được trích dẫn , sau đó xóa các dấu nháy đơn khỏi chuỗi truy vấn.

string insertString = String.Format(    @"INSERT INTO upload_history (field1, field2, field3)     VALUES ({0}, {1}, {2})",    ToStringorNull(varField1), ToStringorNull(varField2), ToStringorNull(varField3));

Nếu bạn đang sử dụng VS 2008 bạn thậm chí có thể thực hiện nó như là một phương pháp mở rộng.

string insertString = String.Format(    @"INSERT INTO upload_history (field1, field2, field3)     VALUES ({0}, {1}, {2})",    varField1.ToStringorNull, varField2.ToStringorNull, varField3.ToStringorNull);

Tôi sẽ để lại việc tạo ra các ToStringorNull chức năng cho bạn - nó không phải là khó :-)


2
2017-12-17 13:51