2012-06-21 30 views
6

Tôi có mã này để cập nhật cơ sở dữ liệu SQL của tôi từ dữ liệu trong một hộp văn bản, trong VB. Tôi cần phải sử dụng các thông số trong trường hợp các văn bản có chứa một dấu tic, ', hoặc một trích dẫn, ", vv Đây là những gì tôi có:Làm thế nào để sử dụng các tham số "@" trong một lệnh SQL trong VB

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") 
    dbConn.Open() 

    MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = '" & TicBoxText.Text & _ 
              "'WHERE Number = 1", dbConn) 

    MyDataReader = MyCommand.ExecuteReader() 
    MyDataReader.Close() 
    dbConn.Close() 

Và đây là nỗ lực què của tôi để thiết lập một tham số từ những gì tôi đã thấy trên web, mà tôi không hiểu tất cả những gì tốt.

dbConn = New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP") 
    dbConn.Open() 

    MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @'" & TicBoxText.Text & _ 
              "'WHERE Number = 1", dbConn) 

    MyDataReader = MyCommand.ExecuteReader() 
    MyDataReader.Close() 
    dbConn.Close() 

làm thế nào để bạn làm gì? Nguyên nhân nếu có một 'đánh dấu trong hộp này khi tôi chạy mã, nó bị treo.

này
+0

thể trùng lặp của [C# SQL tham số truy vấn xây dựng - NHƯ%] (http://stackoverflow.com/questions/664314/c-sharp-constructing -parameter-query-sql-like) – Ben

+0

[Xem thêm] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx#Y300) –

Trả lời

17

Bạn đang đi đúng hướng để tránh Bobby Tables, nhưng sự hiểu biết của bạn về thông số @ ers không đầy đủ.

thông số được đặt tên hành xử giống như biến trong một ngôn ngữ lập trình: đầu tiên, bạn sử dụng chúng trong lệnh SQL của bạn, và sau đó bạn cung cấp giá trị của họ trong VB.NET hoặc C# chương trình của bạn, như thế này:

MyCommand = New SqlCommand("UPDATE SeansMessage SET Message = @TicBoxText WHERE Number = 1", dbConn) 
MyCommand.Parameters.AddWithValue("@TicBoxText", TicBoxText.Text) 

Lưu ý cách văn bản lệnh của bạn trở nên độc lập: nó không còn phụ thuộc vào giá trị của văn bản từ hộp văn bản, do đó người dùng không thể ngắt SQL của bạn bằng cách chèn lệnh riêng của họ. @TicBoxText trở thành tên của biến viết tắt của giá trị trong văn bản lệnh; cuộc gọi đến số AddWithValue cung cấp giá trị. Sau đó, ExecuteReader của bạn đã sẵn sàng hoạt động.

+1

Không phải là một fan hâm mộ của phương thức AddWithValue(). Đôi khi nó đoán các loại tham số sai (ví dụ: ngày, varchar vs nvarchar), và đôi khi khi điều đó xảy ra truy vấn không còn dòng lên với một chỉ số mà nó nên, dẫn đến đôi khi vấn đề hiệu suất quyết liệt. –

+0

@ JoelCoehoorn Tôi cũng vậy, nhưng đó là cách nhanh nhất để mọi thứ diễn ra. – dasblinkenlight

+0

+1 giải thích tốt. – CaRDiaK

8

Có một số cải tiến ở đây:

Using dbConn As New SqlConnection("server=.\SQLEXPRESS;Integrated Security=SSPI; database=FATP"), _ 
     MyCommand As SqlCommand("UPDATE SeansMessage SET Message = @Message WHERE Number = 1", dbConn) 

    'Make sure to use your exact DbType (ie: VarChar vs NVarChar) and size 
    MyCommand.Parameters.Add("@Message", SqlDbType.VarChar).Value = TicBoxText.Text 

    dbConn.Open() 
    MyCommand.ExecuteNonQuery() ' don't open a data reader: just use ExecuteNonQuery 
End Using 'Using block will close the connection for you 
+0

Những cải tiến này có một số là gì? – PsychoData

+1

@PsychoData Đóng đúng kết nối trong trường hợp ngoại lệ được ném, sử dụng tham số truy vấn, executenonquery() thay cho executereader, loại thông số rõ ràng thay vì được suy luận –

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