无法使用存储过程在C#中从SQL表获取记录到DataGridView

时间:2014-03-01 10:11:58

标签: c# sql stored-procedures datagridview

我有一个Windows窗体,用户可以在多个文本框中输入多个值,以获得更快的搜索结果。但是在运行时,它只需要第一个参数,即全名,而忽略另一个。不知道为什么会这样。我在结果中得到了我不想要的全部表格。我创建了一个存储过程。

CREATE PROCEDURE USP_SELECT_CUSTOMERS (
    @fullName VARCHAR(100) = '',
    @Address VARCHAR(100) = '',
    @ContactNumber VARCHAR(15) = ''
)
AS BEGIN
    SELECT * FROM Customers 
        WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
            OR ((Address LIKE @Address+'%') OR (@Address = ''))
            OR ((Phone LIKE @ContactNumber+'%') OR (@ContactNumber = ''))
END

以下是我在程序中调用存储过程的方式:=>

private void btnSubmit_Click(object sender, EventArgs e)
        {
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("USP_SELECT_CUSTOMERS", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@fullName", txtFullName.Text);
                cmd.Parameters.AddWithValue("@Address", txtAddress.Text);
                cmd.Parameters.AddWithValue("@ContactNumber", txtContactNumber.Text);                
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);
                if (ds.Tables[0].Rows.Count > 0)
                {
                    dataGridView1.Visible = true;
                    dataGridView1.DataSource = ds.Tables[0];
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
            finally
            {
                con.Close();
            }
        }

我想要的是即使1个文本框被填充,存储过程也应该给出所需的输出。请帮助我。

感谢。

5 个答案:

答案 0 :(得分:1)

您应该AND而不是OR。试试这个:

CREATE PROCEDURE USP_SELECT_CUSTOMERS (
    @fullName VARCHAR(100),
    @Address VARCHAR(100),
    @ContactNumber VARCHAR(15)
)
AS BEGIN
    SELECT * FROM Customers 
        WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
            AND ((Address LIKE @Address+'%') OR (@Address = ''))
            AND ((Phone LIKE @ContactNumber+'%') OR (@ContactNumber = ''))
END

它会给你想要的结果。

请参阅SQL Fiddle

修改 根据您的要求,使用此查询:

CREATE PROCEDURE USP_SELECT_CUSTOMERS 
(
        @fullName VARCHAR(100),
        @Address VARCHAR(100),
        @ContactNumber VARCHAR(15)
)
AS 
BEGIN
    IF LEN(@fullName)=0
        SET @fullName='$$$'
    IF LEN(@Address)=0
        SET @Address='$$$'
    IF LEN(@ContactNumber)=0
        SET @ContactNumber='$$$'

    SELECT * FROM Customers 
        WHERE ((ContactName LIKE @fullName+'%'))
           OR ((Address LIKE @Address+'%'))
           OR ((Phone LIKE @ContactNumber+'%'))
END

添加了一个简单的技巧。请参阅SQL Fiddle

$$$替换为ContactNameAddressPhone字段中包含 的任何内容。

答案 1 :(得分:0)

IMO,

这应该做

CREATE PROCEDURE USP_SELECT_CUSTOMERS (
    @fullName VARCHAR(100) = '',
    @Address VARCHAR(100) = '',
    @ContactNumber VARCHAR(15) = ''
)
AS BEGIN
    SELECT * FROM Customers 
        WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))
            AND ((Address LIKE @Address+'%') OR (@Address = ''))
            AND ((Phone LIKE @ContactNumber+'%') OR (@ContactNumber = ''))
END

使用northwind我得到跟随,命令 EXEC USP_SELECT_CUSTOMERS'maria','',' enter image description here

执行USP_SELECT_CUSTOMERS'maria','Åkergatan24',' - 现在显示结果行检查下一张图片 enter image description here

**执行USP_SELECT_CUSTOMERS'maria','Åkergatan24',''** - 由于地址参数的额外空间结束,您可能看不到任何结果 enter image description here

答案 2 :(得分:0)

除了在Raging Bull的答案中执行更改之外,请尝试在每次参数的第二次检查中添加ISNULL。所以

@fullname = ''

变为

ISNULL(@fullname, '') = ''

并对其他两个参数执行相同的操作。

从内存中Sql Server将只使用您为参数指定的默认值,如果您根本没有传递参数,如果您确实传递了参数但值为null,那么您的查询将仅适用于更改上方。

答案 3 :(得分:0)

我同意@Baljeet所说的......它应该取得理想的结果。 确保您已完成以下操作 1)如果varchar,将参数值内部化为''(空白) 例如@fullName VARCHAR(100) = ''

并且在下面给出的条件下,人们倾向于在OR的第二个条件中犯错误。 确保condtion为Where('Field Name'如'@parametername'OR @parametername ='')

 WHERE ((ContactName LIKE @fullName+'%') OR (@fullName = ''))

答案 4 :(得分:0)

我的建议是将参数的默认值定义为NULL的存储过程。数据库擅长处理NULL值,它可以使存储过程定义简单。

然后有条件地从C#传递参数:

if(!String.IsNullOrEmpty(txtFullName.Text)) 
    cmd.Parameters.AddWithValue("@fullName", txtFullName.Text);
//...add other parameters the same way

存储过程应定义如下:

CREATE PROCEDURE USP_SELECT_CUSTOMERS (
    @fullName VARCHAR(100) = NULL,
    @Address VARCHAR(100) = NULL,
    @ContactNumber VARCHAR(15) = NULL
)
AS BEGIN
    SELECT * FROM Customers 
        WHERE ContactName LIKE @fullName+'%'
            OR Address LIKE @Address +'%'
            OR Phone LIKE @ContactNumber+'%'
            --in case you want to select all rows if all the parameters are NULL then add
            --this condition too 
            --OR 1 = CASE WHEN COALESCE(@fullName, @Address, @ContactNumber,'') = '' THEN 1 ELSE 0 END
END