2010-01-07 36 views
7

Tôi biết tôi có thể sử dụng các tham số, nhưng cách đúng để thoát khỏi chuỗi chuỗi là gì? Truy vấn có thể là như thế này:Giá trị thoát trong truy vấn SQL (C# với trình kết nối SQL)

"INSERT INTO records (ReferenceID,Name,Note,Author) VALUES ('" + ID+ "','" + addlevel.textBox1.Text + "','"+addlevel.textBox2_note.Text+ "','"+Program.Username+"')"; 

Tôi CHỈ tò mò, chỉ muốn biết :)

EDIT: Nhưng những gì về điều đó? "CREATE TABLE '+ chuỗi' .... thông số không thể được sử dụng ở đây

+0

Khi xác định số nhận dạng (ví dụ: tên bảng), không thể thoát được. Bạn có thể đặt backticks xung quanh số nhận dạng để cho phép một số ký tự khác (ví dụ: dấu cách), nhưng bạn chỉ phải đảm bảo rằng chuỗi không chứa bất kỳ thứ gì có hại. – Guffa

Trả lời

15

Nếu bạn cần thực hiện các thao tác cơ sở dữ liệu, chẳng hạn như tạo bảng, thì bạn nên sử dụng SQL Server Management Objects thay vì thực hiện chuỗi SQL.

Đối với thông số hoạt động CRUD hoàn toàn là đường dẫn thực sự duy nhất.

CẬP NHẬT: Có vẻ như thư viện máy khách MySQL chứa phương thức trợ giúp cho tác vụ không được thông báo này. Bạn có thể gọi MySqlHelper.EscapeString (chuỗi).

+0

Err..thanks, nhưng tôi đang sử dụng MySQL. Bất kỳ cách nào trong trường hợp đó? – Snake

+0

Rất tiếc, tôi không nhận thấy thẻ. Tôi không biết về một thư viện tương tự fro MySQL. –

+0

Ok, cảm ơn! Ngoài ra tôi không thể làm tốt hơn. – Snake

12

Cách đúng sử dụng các thông số

!. 'Just Say No' để cố gắng làm thoát cho mình - đó là Tại sao bạn nghĩ rằng bạn muốn muốn để thoát chúng theo cách thủ công thay vì sử dụng các thông số?

+0

Hoàn toàn đúng - thông số giành chiến thắng trên mỗi lần đếm. –

+1

Tôi biết, tôi rất tò mò. BTW, tôi đã chỉnh sửa câu hỏi. Điều gì sẽ xảy ra nếu người dùng nhập tên bảng? Sau đó, tôi không thể sử dụng tham số. – Snake

+1

Bạn sẽ không muốn cho phép người dùng định nghĩa bảng mà họ đang chèn vào, điều đó sẽ dẫn đến một lỗ hổng bảo mật rất lớn. – Paolo

6

Nếu bạn thực sự, thực sự, thực sự cần phải tự thoát (không có dấu hiệu nào trong ví dụ của bạn):

string EncodeMySqlString(string value) { 
    return value.Replace(@"\", @"\\").Replace("'", @"\'") 
} 
+0

Không, không phải cho SQL. – erikkallen

+0

@erikkallen: Không, nó không dành cho MS SQL Server. Vui lòng kiểm tra xem câu hỏi là gì trước khi bỏ phiếu xuống ... – Guffa

+0

OK, xin lỗi. Thật không may, không thể loại bỏ downvote. – erikkallen

1

Tôi nghĩ rằng điều duy nhất bạn cần làm là value = value.Replace("'", "''")

Tất nhiên bạn không nên làm điều này, nhưng bạn có biết điều đó.

Chỉnh sửa: Thực hiện điều này là sai đối với MySQL. Nó sẽ làm việc cho PostgreSQL, MS SQL và Oracle.

+1

Lưu ý rằng đây là cho MySQL, không phải MS SQL Server. Phương pháp mà bạn đề xuất là TUYỆT ĐỐI KHÔNG đủ để thoát chuỗi cho MySQL. – Guffa

0

sử dụng tham số commnd thay thế. Nó tự chăm sóc thoát. Đó là giải pháp cũng chống lại tiêm sql.

Các vấn đề liên quan