这是我用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)
不,这种语法不正确.它容易受到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)
像往常一样,永远不要使用字符串连接来构建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)
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |