如何在sql语句中使用字符串变量

Vik*_*ice 10 c# sql-server-2008

我有一个WPF应用程序,我得到了

string someone = TextBox.text;
Run Code Online (Sandbox Code Playgroud)

我想在以下查询中使用它

query = " Select * From Table Where Title = someone "
Run Code Online (Sandbox Code Playgroud)

我该如何在查询中使用变量?

msa*_*het 22

你可以这样做

query = "Select * From Table Where Title = " + someone;
Run Code Online (Sandbox Code Playgroud)

但这很糟糕,并打开SQL注入

您应该只使用参数化查询

这样的事情应该让你开始

using (var cn = new SqlClient.SqlConnection(yourConnectionString))
using (var cmd = new SqlClient.SqlCommand())
{
   cn.Open();
   cmd.Connection = cn;
   cmd.CommandType = CommandType.Text;
   cmd.CommandText = "Select * From Table Where Title = @Title";
   cmd.Parameters.Add("@Title", someone);
}
Run Code Online (Sandbox Code Playgroud)

来自Jon Skeet的答案,因为他比我的更完整

有关更多信息,请参阅SqlCommand.Parameters的文档.

基本上,您不应出于各种原因将您的值嵌入SQL本身:

  • 混合代码和数据是不优雅的
  • 除非你非常小心转义,否则它会打开SQL注入攻击
  • 你必须担心数字,日期和时间等格式和i18n细节
  • 当查询保持相同且仅更改值时,优化器的工作量较少 - 它可以直接查找以前的优化查询,因为它在SQL方面是完美匹配.


Jon*_*eet 13

您应该使用参数化SQL查询:

query = "SELECT * From TableName WHERE Title = @Title";

command.Parameters.Add("@Title", SqlDbType.VarChar).Value = someone;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅SqlCommand.Parameters的文档.

基本上,您不应出于各种原因将您的值嵌入SQL本身:

  • 混合代码和数据是不优雅的
  • 除非你非常小心转义,否则它会打开SQL注入攻击
  • 你必须担心数字,日期和时间等格式和i18n细节
  • 当查询保持相同且仅更改值时,优化器的工作量较少 - 它可以直接查找以前的优化查询,因为它在SQL方面是完美匹配.

  • 自从我的答案被接受以来,我就把你的答案的核心内容吸进了我的答案中,所以至少有人在查看被接受的答案时会看到最完整的信息。 (2认同)