喜欢和= operater在信号查询中不能一起工作

时间:2017-05-31 09:18:27

标签: sql asp.net search

我正在使用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;
            }
        }
    }

2 个答案:

答案 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 St​​atus ='Active'“;

怎么样?