2009-08-11 47 views
10

Câu hỏi rất đơn giản (đáng ngạc nhiên là tôi không thể tìm thấy câu hỏi tương tự ở bất kỳ đâu): làm cách nào để thoát khỏi dữ liệu biểu mẫu trong VB.net? Tôi có các dòng khác nhau như sau:Thoát chuỗi (thêm dấu gạch chéo) trong VB.net?

Dim query As String = "exec sp_Message_insert @clientid='" + pClientId + "', @message='" + pMessage + "', @takenby='" + pUserId + "', @recipients='" + pRecipients + "'" 

Nếu tôi sử dụng dấu nháy đơn trong thông báo thì tất nhiên điều này sẽ làm tăng truy vấn. Tôi đã xem xét các chức năng intellisense trên chuỗi nhưng không thấy bất cứ điều gì thích hợp ...

Trả lời

16

Chính xác bạn có ý gì khi thoát? VB.NET không có 'thoát' theo cùng cách mà các ngôn ngữ kiểu c làm.

Bây giờ, nếu bạn muốn đảm bảo rằng không có đơn qoutes trong biến pClientId, sau đó bạn có hai lựa chọn:

Phương án 1 (không được khuyến khích cho kịch bản này): làm một cách đơn giản thay thế. I E.

pClientId = String.Replace(pClientId, "'","''") 

Nhưng, như đã lưu ý, tôi sẽ KHÔNG làm điều này cho những gì dường như là Lệnh SQL. Những gì tôi sẽ làm là Phương án 2: sử dụng các thông số dữ liệu để truyền tham số cho DB của bạn trong sql lệnh

Ví dụ:

Dim cn As New SqlConnection(connectionString) 
Dim cmd As New SqlCommand 
cn.Open 
cmd.Connection=cn 
cmd.CommandType=CommandType.StoredProcedure 
cmd.CommandText= "sp_Message_insert" 
cmd.Parameters.add(New SqlParameter("@clientid", pClientId) 
cmd.Parameters.add(New SqlParameter("@message", pMessage) 
cmd.Parameters.add(New SqlParameter("@takenby", pUserId) 
cmd.Parameters.add(New SqlParameter("@recipients", pRecipients) 
cmd.ExecuteNonQuery 
+1

'cmd.Parameters.AddWithValue ("@ ClientID", ClientId) 'cũng có sẵn. –

+0

Bạn thực sự nên quấn 'SqlConnection' và' SqlCommand' vào một khối 'Sử dụng': http://msdn.microsoft.com/en-us/library/htd05whh.aspx – LukeH

+0

Heh, ngay khi tôi đăng câu hỏi tôi nghĩ rằng tôi nên chuyển dữ liệu dưới dạng tham số thay vì một chuỗi. Đổ lỗi cho ông chủ cũ của tôi, anh ấy là người đã dạy tôi làm theo cách này;) Tôi sẽ sử dụng phương pháp đầu tiên * ngay bây giờ * vì khách hàng muốn điều này được sửa chữa nhanh chóng, nhưng sẽ bắt đầu tái cấu trúc ngay lập tức. – DisgruntledGoat

2

Tôi nghĩ rằng bạn chỉ có thể làm hai dấu nháy đơn để tạo một. Tôi xin lỗi nếu điều đó không hoạt động, nó đã được một thời gian kể từ khi tôi đã làm nó theo cách đó, tôi sẽ đề nghị sử dụng SQL Parameters, điều này sẽ tự động xử lý các ký tự đặc biệt của bạn và ngăn chặn SQL injection.

2

Không xây dựng chuỗi để thực thi như vậy.
Đó chính xác là lý do tại sao các cuộc tấn công SQL Injection là có thể.

Thay vì sử dụng Lớp truy cập dữ liệu, cho phép bạn tạo các đối tượng tham số và liên kết chúng với thủ tục được lưu trữ để thực thi.

5

Nếu bạn muốn thoát khỏi chuỗi thì trước tiên bạn phải nói với những gì cơ sở dữ liệu bạn đang sử dụng. Bạn phải sử dụng đúng cách thoát cho cơ sở dữ liệu cụ thể để thoát khỏi tất cả các ký tự mà bạn cần, nhưng chỉ những ký tự đó.

Tôi không biết bất kỳ cơ sở dữ liệu nào sử dụng dấu gạch chéo làm ký tự thoát. MySQL sử dụng dấu gạch chéo ngược, có lẽ đó là những gì bạn có nghĩa là gì?

Cách tốt nhất là không thoát chuỗi, nhưng sử dụng truy vấn được tham số hóa. Ví dụ:

Dim cmd As New SqlCommand("sp_Message_insert") 
cmd.Parameters.Add("@clientid").Value = pClientId 
cmd.Parameters.Add("@message").Value = pMessage 
cmd.Parameters.Add("@takenby").Value = pUserId 
cmd.Parameters.Add("@recipients").Value = pRecipients 
1

nếu bạn muốn thực hiện một String như một truy vấn bạn nên sử dụng đoạn mã sau:

Dim query as String 
query.Replace("/", "//") 
1

Vì vậy, muốn thêm một thông báo nhỏ về tên thông số sử dụng cùng với System.Data.Odbc.OdbcCommand, theo số http://msdn.microsoft.com/en-us/library/system.data.odbc.odbccommand.commandtype

Nhà cung cấp dữ liệu .NET Framework cho ODBC không hỗ trợ chuyển có tên paramet ers đến một câu lệnh SQL hoặc một thủ tục được lưu trữ được gọi là bởi một OdbcCommand. Trong một trong các trường hợp này, hãy sử dụng dấu chấm hỏi (?) trình giữ chỗ.

một ví dụ từ đây http://msdn.microsoft.com/en-us/library/system.data.odbc.odbcparametercollection(v=vs.80).aspx#Y800:

Dim command As OdbcCommand = connection.CreateCommand() 
command.CommandText = “{ call MoneyProcedure(?,?,?) ” 

command.Parameters.Add("", OdbcType.Int).Value = 1 
command.Parameters.Add("", OdbcType.Decimal).Value = 2 
command.Parameters.Add("", OdbcType.Decimal).Value = 3 
Các vấn đề liên quan