存储过程参数

时间:2018-03-19 11:30:28

标签: c# asp.net sql-server

您好我将值传递给SP参数时出现问题,内联查询工作正常。 我的任务是从dorpdownlist中选择多个项目并将其显示在gridview中。 当我从第一个下拉列表中选择值时,我有两个下拉列表,然后根据按钮单击时db的第一个下拉列表填充第二个下拉列表。

这是我到目前为止所做的,

     protected void btnGetResult_Click(object sender, EventArgs e)
    {
        string selectedListValue = hdnSelections.Value;
        if (!string.IsNullOrEmpty(selectedListValue))
        {
            string[] finalList = selectedListValue.TrimEnd(',').Split(',');

            var parameters = new string[finalList.Length];
            var cmd = new SqlCommand();
            for (int i = 0; i < finalList.Length; i++)
            {
                if (!string.IsNullOrEmpty(finalList[i]))
                {
                    parameters[i] = string.Format("@cardcode{0}", i);
                    cmd.Parameters.AddWithValue(parameters[i],finalList[i]);
                }
            }

           cmd.CommandText = string.Format("Select cardcode, FirstName from 
          nonSAPcustomer where cardcode IN ({0})", string.Join(", ", 
            parameters));
          // cmd.CommandText= string.Format("sp_nonSAPcustomer", 
            parameters);
            cmd.Connection = Connection.con;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            da.Fill(dt);
            lstBoxcities.DataSource = dt;
            lstBoxcities.DataValueField = "cardcode";
            lstBoxcities.DataTextField = "FirstName";
            lstBoxcities.DataBind();
        }

    }      

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用Table-Valued parameters

首先,创建一个Type:

CREATE TYPE CardCodes AS TABLE ( CardCode INT);  

然后,添加该类型的参数

CREATE PROCEDURE dbo.YourProc
    @Codes CardCodes READONLY 
AS
BEGIN
     SELECT *
     FROM FOO
     WHERE ID IN(SELECT Code From @Codes)
END

然后使用发送值,虽然我认为还有其他配方,我使用DataTables:

var dataTable = new DataTable();
dataTable.Columns.Add("CardCode", typeof(int));

PopulateTable(dataTable);

cmd.Parameters.Add("@Codes", dataTable);