我很难过,我试图从数据库中填充5个文本框,而不是所有5个文本框都会有数据。
示例:
ID | ItemID | QTYPE
1 | 10 | 2盒
2 | 10 | 6盒
3 | 11 | 1个案例
在此示例中,它将填充QuantityType1TxtBox 2 Boxes和QuantityType2TxtBox with 6 Boxes,而其他三个文本框留空。
我尝试运行此代码时遇到以下错误: 索引超出了数组的范围。
此行发生此错误:QuantityType2TxtBox.Text = rdr.GetString(1);
SqlCommand cmd = new SqlCommand(@"SELECT QType FROM InventoryQType
WHERE ItemID = '" + itemID + "'", conn);
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
QuantityType1TxtBox.Text = rdr.GetString(0);
QuantityType2TxtBox.Text = rdr.GetString(1);
QuantityType3TxtBox.Text = rdr.GetString(2);
QuantityType4TxtBox.Text = rdr.GetString(3);
QuantityType5TxtBox.Text = rdr.GetString(4);
}
rdr.Close();
答案 0 :(得分:7)
我不确定我的switch语句是否正确,但我认为这段代码的其余部分对于显示参数和使用语句很有用。
string sql = @"SELECT QType FROM InventoryQType WHERE ItemID=@id";
using (SqlConnection conn = new SqlConnection("[put your connection string here, or reference to web.config]")) {
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
cmd.Parameters.Add("@id", System.Data.SqlDbType.VarChar).Value = itemID;
SqlDataReader rdr = cmd.ExecuteReader();
int loop = 1;
while (rdr.Read()) {
switch(loop){
case 1:
QuantityType1TxtBox.Text = (string)rdr["QType"];
break;
case 2:
QuantityType2TxtBox.Text = (string)rdr["QType"];
break;
case 3:
QuantityType3TxtBox.Text = (string)rdr["QType"];
break;
case 4:
QuantityType4TxtBox.Text = (string)rdr["QType"];
break;
case 5:
QuantityType5TxtBox.Text = (string)rdr["QType"];
break;
default:
break;
}
loop++;
}
}
conn.Close();
}
另外值得注意的是,您的itemID在您的示例中似乎是一个varchar。我假设它实际上是一个int,所以如果这是真的,你需要将参数的'VarChar'部分改为'Int'。
答案 1 :(得分:3)
有很多方法可以做到这一点,但是让你开始的粗略实现可能看起来像:
List<string> values;
while(rdr.Read())
{
values.Add(rdr.GetString(0));
if (values.Count == 5) break;
}
if (values.Count > 0) QuantityType1TxtBox.Text = values[0];
if (values.Count > 1) QuantityType2TxtBox.Text = values[1];
if (values.Count > 2) QuantityType3TxtBox.Text = values[2];
if (values.Count > 3) QuantityType4TxtBox.Text = values[3];
if (values.Count > 4) QuantityType5TxtBox.Text = values[4];
您可能需要考虑(a)将数据访问代码分离为一个返回值列表的单独类/方法,以及(b)将文本框放入集合中,这样您就不需要重复分配代码给他们的价值。
答案 2 :(得分:2)
用于检索数据的SQL查询仅返回QType
字段,因此SqlDataReader只有1列。
因为您通过调用rdr.GetString(1)
请求第二列,所以会发生Index out of bounds异常。
我会编辑你的select语句来命名你想要放在每个文本框中的每个字段,以便索引可以按预期工作。
最后,如果使用上面的代码检索多行数据,则在此方法结束时,文本框将包含最后一条记录中的数据 - 这是因为之前的记录将被覆盖,因为您是重复分配每个文本框的Text
属性。
答案 3 :(得分:0)
修复你的代码:
var values = new List<string>();
while (rdr.Read())
{
values.add(rdr.GetString(0));
}