C#SQL Server查询
这是我用C#编写的代码段C#SQL Server查询,c#,sql-server,C#,Sql Server,这是我用C#编写的代码段Mobile和Name是我的表中的列。 问题是我的查询格式有问题。如果我们想在C#中使用OR连接两个查询,语法是否正确 SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [Contact Management] WHERE Mobile='"+Convert.ToInt32(txtSearch.Text)+"' OR Name='"+txtSearch.Text+"'",con); 不,那个语法
Mobile
和Name
是我的表中的列。
问题是我的查询格式有问题。如果我们想在C#中使用OR连接两个查询,语法是否正确
SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM [Contact Management] WHERE
Mobile='"+Convert.ToInt32(txtSearch.Text)+"' OR Name='"+txtSearch.Text+"'",con);
不,那个语法不正确。它容易受到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)
与往常一样,切勿使用字符串连接来构建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注入攻击,但也会避免解析输入文本时出现问题。如果在搜索文本中有一个单引号怎么办?您将得到一个连接语法错误
但是,让我说,在此之前,您的代码将失败。如果您在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;
....
一点也不正确您不应该将
txtSearch.Text
包装在任何引号周围。。我个人也会考虑使用参数化查询
,但如果我在删除代码段之后或之后代码段开始工作……也就是说,在删除或部分之后,我至少可以选择mobile=某个值的位置……因此引号不会产生任何问题,我认为是这样……您需要使用参数将用户数据插入sql查询…将sql注入部分放在一边有没有不使用参数化查询的方法。。。。我是一个初学者,所以很难理解……参数化查询是唯一可以接受的方法,可以在不出现sql注入问题的情况下实现这一点,我不会帮助您编写易受攻击的代码。