我正在使用sap.net网络表单。在这个网络表单中,我有一个文本和一个按钮。用户输入名称或ID并点击搜索按钮。使用id搜索工作正常,但是名称不起作用。 我在这里失踪了请帮助我。
String Status = "Active";
String BDstring = ConfigurationManager.ConnectionStrings["CS"].ConnectionString;
using (SqlConnection conn = new SqlConnection(BDstring))
{
try
{
String query = "SELECT * from Driver where(Name LIKE '%' + @search + '%' OR DriverID = @search) AND Status = 'Active'";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@search", SearchTextBox.Text);
conn.Open();
SqlDataReader SDR = cmd.ExecuteReader();
DataTable DT = new DataTable();
if (SDR.HasRows)
{
DT.Load(SDR);
GridView.DataSource = DT;
GridView.DataBind();
}
}
catch (SqlException exe)
{
throw exe;
}
}
}
答案 0 :(得分:2)
代码正在生成异常。您没有意识到这一点的事实表明您在系统中的某处“错误处理”,实际上是“错误隐藏”。删除空的catch
块或无意义的catch
块,例如问题中的块,它只会破坏异常中的某些信息并重新抛出它。那些没有帮助你。
实际问题是DriverID
列为int
,您的参数为varchar
。只要varchar
包含一个可以转换为数字的字符串(这是由于precedence而转换的方向),查询就会格式正确。
只要参数包含无法隐式转换为数字的字符串,SQL Server就会生成一个错误,即.NET变为异常。
对于您的LIKE
变体,您强制进行相反方向的转换(数字 - > varchar),因为LIKE
仅对字符串进行操作。转换将始终成功,但这意味着您正在执行文本比较而不是数字,这也意味着此处没有可能的索引用法。
我建议您更改C#代码以在输入文本上尝试int.TryParse
,然后使用两个单独的参数来传递字符串和(可选)它们的数字等效于SQL服务器。然后在查询中使用适当的参数进行每次比较。
类似的东西:
String Status = "Active";
String BDstring = ConfigurationManager.ConnectionStrings["CS"].ConnectionString;
using (SqlConnection conn = new SqlConnection(BDstring))
{
String query = "SELECT * from Driver where(Name LIKE '%' + @search + '%' OR " +
"DriverID = @driverId) AND Status = 'Active'";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.Add("@search", SqlDbType.VarChar,50).Value = SearchTextBox.Text;
cmd.Parameters.Add("@driverId", SqlDbType.Int);
int driverId;
if(int.TryParse(SearchTextBox.Text, out driverId))
{
cmd.Parameters["@driverId"].Value = driverId;
}
conn.Open();
SqlDataReader SDR = cmd.ExecuteReader();
DataTable DT = new DataTable();
if (SDR.HasRows)
{
DT.Load(SDR);
GridView.DataSource = DT;
GridView.DataBind();
}
}
答案 1 :(得分:0)
“SELECT * from Driver where(Name LIKE'%”+ @search +“%' 或DriverID ='“+ @search +”')AND Status ='Active'“;
怎么样?