0

这是我用 C# 编写的代码段。Mobile并且Name是我表中的列。问题是我的查询格式有问题。如果我们想在 C# 中使用 OR 连接两个查询,语法是否正确?

SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [Contact Management] WHERE
         Mobile='"+Convert.ToInt32(txtSearch.Text)+"' OR Name='"+txtSearch.Text+"'",con);
4

2 回答 2

9

不,该语法不正确。它容易受到 sql 注入攻击。您需要像这样构建它:

SqlCommand cmd = new SqlCommand("SELECT * FROM [Contact Management] WHERE
     Mobile= @Search OR Name= @Search")
SqlDataAdapter = new SqlDataAdapter(cmd);
cmd.Parameters.Add("@Search", SqlDbType.NVarChar, 50).Value = txtSearch.Text;

您也可以这样编写查询:

SELECT * FROM [Contact Management] WHERE @Search IN (Mobile, Name) 
于 2013-05-13T21:16:10.867 回答
5

像往常一样,永远不要使用字符串连接来构建 sql 命令。使用参数化查询

string query = "SELECT * FROM [Contact Management] WHERE Mobile=@mobile OR Name=@name";
SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@mobile", Convert.ToInt32(txtSearch.Text));
cmd.Parameters.AddWithValue("@name", txtSearch.Text);
SqlDataAdapter da= new SqlDataAdapter (cmd);

参数化查询将使您的数据库免受 Sql Injection Attacks 以及解析输入文本时出现的问题。如果在搜索文本中有一个单引号怎么办?连接时会出现语法错误。

但是,让我说您的代码在此之前会失败。如果您的 txtSearch 中有一个数字,那么一切都会正常工作,但如果您有一个字符串。使用 Convert.ToInt32 转换为数字将失败。更好用

SqlCommand cmd = new SqlCommand();
string query;
int numSearch;
if(Int32.TryParse(txtSearch.Text, out numSearch))
{
   query = "SELECT * FROM [Contact Management] WHERE Mobile=@p1";
   cmd.Parameters.AddWithValue("@p1", numSearch);
}
else
{
   query = "SELECT * FROM [Contact Management] WHERE Name=@p1";
   cmd.Parameters.AddWithValue("@p1", txtSearch.Text);
}
cmd.CommandText = query;
....
于 2013-05-13T21:18:01.533 回答