【问题标题】:How to pass value of drop down list to stored procedure in sqlserver in C#如何将下拉列表的值传递给 C# 中 sqlserver 中的存储过程
【发布时间】:2017-03-05 12:30:14
【问题描述】:

我有一张桌子:

并乘以最终结果如下:

一个过程定义如下:(它必须将下拉列表的值与数据库中的值相乘,然后将它们水平相加并在最终结果中显示结果。

CREATE PROCEDURE [dbo].[Cstored]    
AS
BEGIN
    SET NOCOUNT ON;   
DECLARE @Ta int
DECLARE @Em int
DECLARE @Ma int
DECLARE @Sa int

SET @Em = 8    >>>> need to be set by user selection in dropdows list
SET @Ta= 6     >>>> need to be set by user selection in dropdows list
SET @Sa= 5     >>>> need to be set by user selection in dropdows list
SET @Ma = 7    >>>> need to be set by user selection in dropdows list

SELECT 
  Namec,
  Tar*@Ta AS val1,
  Emk*@Em as val2,
  Mas*@Ma as val3,
  San*@Sa As val4,
  (Tar*@Ta)+(Emk*@Em)+(Mas*@Ma)+(San*@Sa) as finalresult
FROM Cdetail 
END

正如您在上面的屏幕截图中看到的,它在数据库中运行良好,但该值已手动设置。我希望它由用户选择设置。

SET @Em = 8

它是用于数据库的,但我在 asp 网页中创建了一些下拉菜单,以便按用户选择值,如下所示:

<form id="form1" runat="server">
        <asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" >
            <asp:ListItem Value="@Em">Emk</asp:ListItem>
            <asp:ListItem Value="@Ta">Tar</asp:ListItem>
            <asp:ListItem Value="@Sa">San</asp:ListItem>
            <asp:ListItem Value="@Ma">Mas</asp:ListItem>
        </asp:DropDownList>
        <br />
        <asp:DropDownList ID="DropDownList2" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
            <asp:ListItem Value="@Em">Emk</asp:ListItem>
            <asp:ListItem Value="@Ta">Tar</asp:ListItem>
            <asp:ListItem Value="@Sa">San</asp:ListItem>
            <asp:ListItem Value="@Ma">Mas</asp:ListItem>
        </asp:DropDownList>
        <br />
        <asp:DropDownList ID="DropDownList3" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
            <asp:ListItem Value="@Em">Emk</asp:ListItem>
            <asp:ListItem Value="@Ta">Tar</asp:ListItem>
            <asp:ListItem Value="@Sa">San</asp:ListItem>
            <asp:ListItem Value="@Ma">Mas</asp:ListItem>
        </asp:DropDownList>
        <br />
        <asp:DropDownList ID="DropDownList4" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
            <asp:ListItem Value="@Em">Emk</asp:ListItem>
            <asp:ListItem Value="@Ta">Tar</asp:ListItem>
            <asp:ListItem Value="@Sa">San</asp:ListItem>
            <asp:ListItem Value="@Ma">Mas</asp:ListItem>
        </asp:DropDownList>

每个下拉菜单都需要有一个默认值,如下所示:

DropDownList1.SelectedValue = 8;
DropDownList2.SelectedValue = 7;
DropDownList3.SelectedValue = 6;
DropDownList4.SelectedValue = 5;

这意味着在下拉列表 1 中选择的值必须发送到带有数字 8(DD2 数字 7 等)的存储过程并设置变量,然后乘以数据库中的相关值。 然后从上到下在gridview 中显示finalresult 的值。

我尝试使用以下代码,但它不起作用,我不知道如何将下拉列表的值发送到存储过程并根据选择提供每个项目。

protected void Button1_Click(object sender, EventArgs e)
        {
            DropDownList1.SelectedValue = 8;
            DropDownList2.SelectedValue = 7;
            DropDownList3.SelectedValue = 6;
            DropDownList4.SelectedValue = 5;

            SqlConnection sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["carConnectionString"]);
            sqlCon.Open();
            SqlCommand scCommand = new SqlCommand("Carstored", sqlCon);
            scCommand.CommandType = CommandType.StoredProcedure;
            scCommand.Parameters.AddWithValue("????", DropDownList1);
            scCommand.Parameters.AddWithValue("????", DropDownList2);
            scCommand.Parameters.AddWithValue("????", DropDownList3);
            scCommand.Parameters.AddWithValue("????", DropDownList4);
            using (SqlDataAdapter sda = new SqlDataAdapter(scCommand))
            {
                DataTable dt = new DataTable();
                sda.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();

我想要,如果用户在 dropdow 1 中选择 Emk,8 数字乘以 (X) 到表中所有 Emk 的值,如果用户在 dropdow 2 中选择 Tar,7 数字乘以(X) 表中所有Tar的值。

【问题讨论】:

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


    【解决方案1】:

    不要在存储过程中声明变量,而是声明参数:

    CREATE PROCEDURE [dbo].[Cstored]    
    (
        @Ta int,
        @Em int,
        @Ma int,
        @Sa int
    )
    AS
    BEGIN
        SET NOCOUNT ON;   
    
        SELECT 
        Namec,
        Tar*@Ta AS val1,
        Emk*@Em as val2,
        Mas*@Ma as val3,
        San*@Sa As val4,
        (Tar*@Ta)+(Emk*@Em)+(Mas*@Ma)+(San*@Sa) as finalresult
        FROM Cdetail 
    END
    

    然后,在您的 c# 代码中,执行以下操作:

    DataTable dt;
    using(var sqlCon = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["carConnectionString"]))
    {
        sqlCon.Open();
        using(var scCommand = new SqlCommand("Carstored", sqlCon))
        {
            scCommand.CommandType = CommandType.StoredProcedure;
            scCommand.Parameters.Add("@Ta", SqlDbType.Int).Value = DropDownList1.SelectedValue;
            scCommand.Parameters.Add("@Em", SqlDbType.Int).Value = DropDownList2.SelectedValue;
            scCommand.Parameters.Add("@Ma", SqlDbType.Int).Value = DropDownList3.SelectedValue;
            scCommand.Parameters.Add("@Sa", SqlDbType.Int).Value = DropDownList4.SelectedValue;
            using (SqlDataAdapter sda = new SqlDataAdapter(scCommand))
            {
                dt = new DataTable();
                sda.Fill(dt);
            }
        }
    }
    

    【讨论】:

    • 它不起作用,StoredProcedure有错误,下拉列表没有默认值(DropDownList1.SelectedValue = 8;等)
    • in 'sda.Fill(dt);'我收到此错误(无法将参数值从字符串转换为 Int32),此外,我找不到默认下拉值的定义((DropDownList1.SelectedValue = 8; DropDownList2.SelectedValue = 7; DropDownList3.SelectedValue = 6; DropDownList4 .SelectedValue = 5;))
    • 下拉列表的值是字符串 ("@Em", "@Ta" etc)。您需要将它们更改为数字。此外,IIRC,ASP.DropDownList 的 SelectedValue 属性的类型为string,因此您需要转换为int。
    • 我做到了,但结果总是一样的!!我希望如果用户在下拉列表中选择“Em”,它只与数据库中的“Em”值相乘,如果用户在下拉列表中选择“Ta”,则该值与数据库中的“Ta”值相乘而不是全部跨度>
    • 那么你需要一个不同的过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多