使用 ExecuteReader 循环浏览行



我很困惑,我正在尝试从数据库中填充 5 个文本框,并非所有 5 个文本框都始终有数据。

例:

身份证 |项标识 |QType

1 | 10 | 2 盒

2 | 10 | 6 盒

3 | 11 | 1 案例

在此示例中,它将用 2 个框填充 QuantityType1TxtBox,用 6 个框填充 QuantityType2TxtBox,同时将其他三个文本框留空。

当我尝试运行此代码时,我得到的以下错误是:索引在数组的边界之外。

此错误发生在以下行:QuantityType2TxtBox.Text = rdr。获取字符串(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();

我不确定我的 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"。

有很多方法可以做到这一点,但让你入门的粗略实现可能看起来像这样:

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) 将文本框放入集合中,这样就不需要重复的代码来为它们分配值。

用于检索数据的 SQL 查询仅返回QType字段,因此 SqlDataReader 只有 1 列。

因为您是通过调用 rdr.GetString(1) 来请求第二列的,所以会发生索引越界异常。

我会编辑您的 select 语句以命名您要放入每个文本框中的每个字段,以便索引按预期工作。

最后,如果使用上面的代码检索超过 1 行数据,则在此方法结束时,文本框将包含最后一条记录中的数据 - 这是因为以前的记录将被覆盖,因为您要重复分配每个文本框的 Text 属性。

像这样修复你的代码:

var values = new List<string>();
while (rdr.Read())
{
   values.add(rdr.GetString(0));
}

最新更新