How can I add user-supplied input to an SQL statement? How can I add user-supplied input to an SQL statement? sql sql

How can I add user-supplied input to an SQL statement?


Use parameterized SQL.

Examples

(These examples are in C#, see below for the VB.NET version.)

Replace your string concatenations with @... placeholders and, afterwards, add the values to your SqlCommand. You can choose the name of the placeholders freely, just make sure that they start with the @ sign. Your example would look like this:

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();}

The same pattern is used for other kinds of SQL statements:

var sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;";// see above, same as INSERT

or

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.}

A word of caution: AddWithValue is a good starting point and works fine in most cases. However, the value you pass in needs to exactly match the data type of the corresponding database field. Otherwise, you might end up in a situation where the conversion prevents your query from using an index. Note that some SQL Server data types, such as char/varchar (without preceding "n") or date do not have a corresponding .NET data type. In those cases, Add with the correct data type should be used instead.

Why should I do that?

Other database access libraries


VB.NET Example Code

This is the example code for the wiki answer in , assuming Option Strict On and Option Infer On.

INSERT

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

UPDATE

Dim sql = "UPDATE myTable SET myField1 = @newValue WHERE myField2 = @someValue;"' see above, same as INSERT

SELECT

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