C#SQL Server查询

use*_*245 0 c# sql-server

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

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

Joe*_*orn 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;
Run Code Online (Sandbox Code Playgroud)

您也可以这样编写查询:

SELECT * FROM [Contact Management] WHERE @Search IN (Mobile, Name) 
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 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);
Run Code Online (Sandbox Code Playgroud)

参数化查询将保存您的数据库免受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;
....
Run Code Online (Sandbox Code Playgroud)