C# 使用多参数从数据库填充dropdownlist

C# 使用多参数从数据库填充dropdownlist,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我试图从数据库填充dropdownlist,但参数(Div)有多个值。我试图使用foreach循环,但它不起作用。这真的有可能吗?或者有其他解决办法吗?也许我应该把它放在表中,然后根据它进行填充?如果您有任何想法和建议,我将不胜感激 以下是我目前的代码: //strDiv is generated from another table in database, has multiple value and for each Div, it will have many product mode

我试图从数据库填充dropdownlist,但参数(Div)有多个值。我试图使用foreach循环,但它不起作用。这真的有可能吗?或者有其他解决办法吗?也许我应该把它放在表中,然后根据它进行填充?如果您有任何想法和建议,我将不胜感激

以下是我目前的代码:

//strDiv is generated from another table in database, has multiple value and 
for each Div, it will have many product model

DCmdInquiry.CommandText = "Select  SG.DivCode from Staff as ST, StaffGroup as SG " +
                                  " where UserName = @UName and ST.SGroupID = SG.SGroupID";

        SqlParameter UName = new SqlParameter("@UName", SqlDbType.VarChar);
        UName.Value = strTmpName;
        DCmdInquiry.Parameters.Add(UName);

        DRInquiry = DCmdInquiry.ExecuteReader();

        while (DRInquiry.Read())
        {
            strDiv = DRInquiry["DivCode"].ToString().Split(',');
        }

        ddlModelName.AppendDataBoundItems = true;

        SqlConnection DbConn = new SqlConnection();
        SqlCommand DCmdInquiry2 = new SqlCommand();

        DbConn.ConnectionString = ConfigurationManager.ConnectionStrings["LDSTestConnectionString"].ConnectionString;

        DCmdInquiry2.Connection = DbConn;
        DbConn.Open();

        DCmdInquiry2.CommandText = "Select ModelName from ProductModel where Div= @Div";

        foreach (string x in strDiv)
        {
            SqlParameter Div = new SqlParameter("Div", SqlDbType.VarChar);
            Div.Value = x;
            DCmdInquiry2.Parameters.Add(Div);

            ddlModelName.DataSource = DCmdInquiry2.ExecuteReader();
            ddlModelName.DataTextField = "ModelName";
            ddlModelName.DataValueField = "ModelName";
            ddlModelName.DataBind();
        }
编辑-我的更新代码,由Tim Schmelter建议:

foreach (string x in strDiv)
{
   Div.Value = x;
   DCmdInquiry2.Parameters.Add(Div);

   ddlModelName.Items.Add((string)DCmdInquiry2.ExecuteScalar());
   DCmdInquiry2.Parameters.Clear(); 
}
ddlModelName.DataBind();
多谢各位

更新:

在考虑了Jon p的意见并进行了大量尝试和错误之后,我得出了以下SQL语句:

select distinct PD.DivCode, PM.ModelName, ST.UserName from ProdDiv as PD
Join Staff as ST on PD.ProdGroup = ST.SGroupID
Join ProductModel as PM on PD.DivCode = PM.Div
where ST.Username = '@UName'
它连接3个表以获得结果。这是可行的,但我不确定这是否是最好的方法

我仍然无法找到使用多参数填充dropdownlist的方法,该多参数会产生多个结果。Tim Schmelter的方法只适用于一行(因为它使用ExecuteScalar),我需要生成所有可用行

由于时间不多了,我将继续使用上面的SQL。也许这是唯一“正确”的方法

  • 您在
    foreach
    中多次添加相同的参数,这会导致异常。在循环中创建命令,使用
    SqlCommand.Parameters。清除
    或每次更改
    
    
  • 您还必须
    DataBind
    在循环之后绑定ddl,或者一个接一个地添加项目
  • 另外,使用
    @Div
    作为参数名,而不是
    Div
  • 最后,如果只返回一个结果,则可以使用
    ExecuteScalar
    而不是
    ExecuteReader


对于实现
IDisposable
的所有内容,也使用
using
语句,例如您的连接。这确保了所有非托管资源都被释放,连接也被关闭,即使出现错误也是如此。

您得到了什么错误/异常,以及在发布的代码中的哪一点?您正在将集合绑定到循环中的
dropdownlist
,这会在每次绑定时清除以前的数据。@HarveySpecter这是我在ExecuteReader()中得到的:变量名'@Div'已经声明。变量名在查询批处理或存储过程中必须是唯一的。@HariPrasad我更改了代码以将ddl绑定到循环之外,现在它只绑定Div参数的最后一个值。您的第一个查询是否返回一行或多行?这在某种程度上起作用(我为每个Div获取了产品模型的第一行),但是每个Div的产品模型返回了不止一行。如何填充每一行?我尝试了executeReader,但它给了我错误:已经有一个打开的DataReader与此命令关联,必须先关闭它。非常感谢。
SqlParameter Div = new SqlParameter("@Div", SqlDbType.VarChar);
DCmdInquiry2.Parameters.Add(Div);
foreach (string x in strDiv)
{
    Div.Value = x;
    ddlModelName.Items.Add((string)DCmdInquiry2.ExecuteScalar());
}