我正在尝试从数据库填充下拉列表,但参数(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。也许它是唯一“正确”的方式。
答案 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。你的联系。这可以确保处理所有非托管资源,并且即使出错也可以关闭连接。