我正在尝试使用用户提供的数据创建SQL语句。我在C#中使用与此类似的代码:
var sql = "INSERT INTO myTable (myField1, myField2) " +
"VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";
var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();
这在VB.NET中:
Dim sql = "INSERT INTO myTable (myField1, myField2) " &
"VALUES ('" & someVariable & "', '" & someTextBox.Text & "');"
Dim cmd As New SqlCommand(sql, myDbConnection)
cmd.ExecuteNonQuery()
然而,
O'Brien
),我该怎么做?#34;正确的方式"?
答案 0 :(得分:50)
使用参数化SQL。
<强>实施例强>
(这些示例在C#中,see below用于VB.NET版本。)
将您的字符串连接替换为@...
占位符,然后将值添加到SqlCommand。您可以自由选择占位符的名称,只需确保它们以@
符号开头即可。你的例子看起来像这样:
var sql = "INSERT INTO myTable (myField1, myField2) " +
"VALUES (@someValue, @someOtherValue);";
using (var cmd = new SqlCommand(sql, myDbConnection))
{
cmd.Parameters.AddWithValue("@someValue", someVariable);
cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text);
cmd.ExecuteNonQuery();
}
相同的模式用于其他类型的SQL语句:
var sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;";
// see above, same as INSERT
或
var sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;";
using (var cmd = new SqlCommand(sql, myDbConnection))
{
cmd.Parameters.AddWithValue("@someValue", someVariable);
using (var reader = cmd.ExecuteReader())
{
...
}
// Alternatively: object result = cmd.ExecuteScalar();
// if you are only interested in one value of one row.
}
提醒一句:AddWithValue
是一个很好的起点,在大多数情况下都可以正常使用。但是,传入的值需要与相应数据库字段的数据类型完全匹配。否则,您最终可能会遇到转换阻止您using an index查询的情况。请注意,某些SQL Server数据类型(如char / varchar(不包含&#34; n&#34;)或日期)没有相应的.NET数据类型。在这些情况下,Add
with the correct data type should be used instead。
我为什么要这样做?
It's more secure:停止SQL injection。 <子>(Bobby Tables won't delete your student records.)子>
它更容易:无需使用单引号和双引号,或查找日期文字的正确字符串表示。
它更稳定:O'Brien
因为他坚持保留他的陌生名字而不会使你的申请失败。
其他数据库访问库
如果您使用OleDbCommand而不是SqlCommand(例如,如果您使用的是MS Access数据库),请使用?
而不是@...
作为SQL中的占位符。在这种情况下,AddWithValue
的第一个参数是无关紧要的;相反,您需要以正确的顺序添加参数。 The same is true for OdbcCommand
答案 1 :(得分:2)
这是wiki answer中vb.net的示例代码,假设Option Strict On
和Option Infer On
。
插入强>
Dim sql = "INSERT INTO myTable (myField1, myField2) " &
"VALUES (@someValue, @someOtherValue);"
Using cmd As New SqlCommand(sql, myDbConnection)
cmd.Parameters.AddWithValue("@someValue", someVariable)
cmd.Parameters.AddWithValue("@someOtherValue", someTextBox.Text)
cmd.ExecuteNonQuery()
End Using
<强>更新强>
Dim sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;"
' see above, same as INSERT
选择强>
Dim sql = "SELECT myField1, myField2 FROM myTable WHERE myField3 = @someValue;"
Using cmd As New SqlCommand(sql, myDbConnection)
cmd.Parameters.AddWithValue("@someValue", someVariable)
Using reader = cmd.ExecuteReader()
' ...
End Using
' Alternatively: Dim result = cmd.ExecuteScalar()
' if you are only interested in one value of one row.
End Using