使用多参数从数据库填充下拉列表

时间:2015-05-11 07:09:28

标签: c# asp.net sql-server

我正在尝试从数据库填充下拉列表,但参数(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个表以获得结果。它有效,但我不确定这是否是最好的方法。

我仍然无法弄清楚使用多参数填充下拉列表的方法,这会产生多个结果。 Tim Schmelter的做法只适用于一行(因为它使用的是ExecuteScalar),我需要提供所有可用的行。

由于我的时间不多了,我只会坚持使用上面的SQL。也许它是唯一“正确”的方式。

1 个答案:

答案 0 :(得分:0)

  • 您在foreach中多次添加相同的参数,这会导致异常。在循环中创建命令,使用SqlCommand.Parameters.Clear或每次更改Value
  • 循环后你还必须DataBind ddl或者一个接一个地添加项目。
  • 另外,使用@Div作为参数名称而不是Div
  • 最后,如果您只收到一个结果,则可以使用ExecuteScalar代替ExecuteReader
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());
}

同样使用using语句来实现IDisposable,f.e。你的联系。这可以确保处理所有非托管资源,并且即使出错也可以关闭连接。