c# - 通过单击按钮使用带参数的存储过程在 asp.net winform 中填充 ListView

标签 c# asp.net sql-server winforms stored-procedures

在我的 Winforms 应用程序中,我必须使用三个参数进行搜索。我使用存储过程从数据库中检索。但是抛出一个异常:

Procedure or function 'sp_searchProduct' expects parameter '@categoryId', which was not supplied

请帮助我。

这是我的代码:

private void button2_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-U1OP1S9\SQLEXPRESS;Initial Catalog=PaintStores;Integrated Security=True");

    SqlCommand command = new SqlCommand("sp_searchProduct", con);
    command.Parameters.AddWithValue("@categoryId", comboBox1.SelectedValue.ToString());
    command.Parameters.AddWithValue("@typeId", comboBox2.SelectedValue.ToString());
    command.Parameters.AddWithValue("@productId", comboBox3.SelectedValue.ToString());

    SqlDataAdapter da = new SqlDataAdapter(command);
    DataTable dataTable = new DataTable();
    da.Fill(dataTable);

    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        DataRow drow = dataTable.Rows[i];

        if (drow.RowState != DataRowState.Deleted)
        {
            ListViewItem lvi = new ListViewItem(drow["ProductId"].ToString());
            lvi.SubItems.Add(drow["ProductName"].ToString());
            lvi.SubItems.Add(drow["TypeName"].ToString());
            lvi.SubItems.Add(drow["Quantity"].ToString());
            lvi.SubItems.Add(drow["Price"].ToString());
            lvi.SubItems.Add(drow["Stock"].ToString());

            listView1.Items.Add(lvi);
        }
    }

    con.Close();
}

这是我的存储过程:

ALTER PROCEDURE [dbo].[sp_searchProduct]
    @categoryId INT,
    @typeId INT,
    @productId INT
AS
    IF (@categoryId = 0)
    BEGIN
        SET @categoryId = NULL
    END

    IF (@typeId = 0)
    BEGIN
        SET @typeId = NULL
    END

    IF (@productId = 0)
    BEGIN
        SET @productId = NULL
    END
BEGIN
    SET NOCOUNT ON;

    SELECT p.ProductId, p.ProductName, p.Quantity, p.Price, p.Stock
    FROM tblProductNew p
    INNER JOIN tblTypes t ON t.TypeId = p.TypeId
    WHERE p.ProductId = ISNULL(@productId, p.ProductId) 
      AND p.TypeId = ISNULL(@typeId, p.TypeId) 
      AND t.MainCategoryId = ISNULL(@categoryId, t.MainCategoryId)
END

最佳答案

确保在调用 da.Fill(dataTable);

之前将其添加到代码中
command.CommandType = CommandType.StoredProcedure;

你的最终代码应该是这样的..

SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-U1OP1S9\SQLEXPRESS;Initial Catalog=PaintStores;Integrated Security=True");
SqlCommand command = new SqlCommand("sp_searchProduct", con);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@categoryId",comboBox1.SelectedValue.ToString());

关于c# - 通过单击按钮使用带参数的存储过程在 asp.net winform 中填充 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44216272/

相关文章:

javascript - ASP.NET MVC5 : live loaded partial view doesn't load dynamic Javascript reference

asp.net - ashx文件中的Asp.Net session 为null

android - 使网站适合移动设备的最佳方法是什么?

sql - 显示月份的所有日期以及日期名称

sql-server - 查询没有返回结果

c# - 如何在 C# 中执行函数参数

c# - 重构大 if else 代码

c# - 为什么我的 Azure 移动应用程序不返回任何数据?

c# - 业务逻辑类

sql-server - 如何将bak文件导入Azure数据库