SQL Server和C#WinForms错误

Ira*_*ili 2 c# sql sql-server winforms

我在表单load ivent GetProducts("")上调用此方法; 这个查询在sql中工作正常.它一直工作,直到我添加WHERE当我在这一行使用调试器>> SqlDataReader myReader = cmd.ExecuteReader(); 任何人都可以建议我吗?

 public void GetProducts(string find)
    {
        try
        {
            using (SqlCommand cmd = new SqlCommand("SELECT ID, BarCode, ArtNumber, ProductName, Price, SelfPrice, PriceWithOutAWD, TotalSelfPrice, UnitsInStock, " +
                                                " Comment, InputDateTime, InputQuantity, Margin, CategoryName, TypeName, ExpDate FROM GetProducts"+
                                                "WHERE BarCode LIKE '%@F%' OR ArtNumber LIKE '%@F%' OR ProductName LIKE '%@F%' OR Price LIKE '%@F%' OR Comment LIKE '%@F%' ", 
                                                new SqlConnection(Program.ConnectionString)))
            {
                cmd.Parameters.AddWithValue("@F", find);
                cmd.Connection.Open();

                SqlDataReader myReader = cmd.ExecuteReader();
                while (myReader.Read())
                {

                    ProductTable.Rows.Add
                        (
                        (int)myReader["ID"],
                        myReader["BarCode"].ToString(),
                        myReader["ArtNumber"].ToString(),
                        myReader["ProductName"].ToString(),
                        (decimal)myReader["Price"],
                        (decimal)myReader["SelfPrice"],
                        (decimal)myReader["PriceWithOutAWD"],
                        myReader["TotalSelfPrice"].ToString(),
                        myReader["UnitsInStock"].ToString(),
                        myReader["Comment"].ToString(),
                        myReader["InputDateTime"].ToString(),
                        myReader["InputQuantity"].ToString(),
                        myReader["Margin"].ToString(),
                        myReader["CategoryName"].ToString(),
                        myReader["TypeName"].ToString(),
                        myReader["ExpDate"].ToString()
                        );
                }
                cmd.Connection.Close();
            }
        }
        catch (Exception)
        {
            MessageBox.Show(Program.MsgError1, "Acid", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }

    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

... FROM GetProducts"+
"WHERE BarCode LIKE ...
Run Code Online (Sandbox Code Playgroud)

应该(注意GetProducts和之间的额外空间WHERE)

... FROM GetProducts "+
"WHERE BarCode LIKE ...
Run Code Online (Sandbox Code Playgroud)

也不要用

WHERE BarCode LIKE '%@F%'
Run Code Online (Sandbox Code Playgroud)

使用

WHERE BarCode LIKE '%' + @F + '%' 
Run Code Online (Sandbox Code Playgroud)

或者,也可以让参数值包含通配符并使用

cmd.Parameters.AddWithValue("@F", "%" + find + "%"); 
 ...
WHERE BarCode LIKE @F
Run Code Online (Sandbox Code Playgroud)

如果您将始终使用领先的通配符进行搜索,那么您应该使用它

WHERE CHARINDEX(@F,BarCode) > 0
Run Code Online (Sandbox Code Playgroud)

您的查询无论如何都无法使用索引,如果用户搜索包含在模式语法中具有特殊含义的字符的子字符串,此方法可以避免出现问题.

但是,根据您要搜索的列数和前导通配符,您应该使用全文索引.