C# 使用多参数从数据库填充dropdownlist
我试图从数据库填充dropdownlist,但参数(Div)有多个值。我试图使用foreach循环,但它不起作用。这真的有可能吗?或者有其他解决办法吗?也许我应该把它放在表中,然后根据它进行填充?如果您有任何想法和建议,我将不胜感激 以下是我目前的代码: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
//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。清除
或每次更改
值李>
- 您还必须
在循环之后绑定ddl,或者一个接一个地添加项目李>DataBind
- 另外,使用
作为参数名,而不是@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());
}