Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#SQL Server查询_C#_Sql Server - Fatal编程技术网

C#SQL Server查询

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); 不,那个语法

这是我用C#编写的代码段
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注入问题的情况下实现这一点,我不会帮助您编写易受攻击的代码。