首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ExecuteReader循环行

用ExecuteReader循环行
EN

Stack Overflow用户
提问于 2014-02-26 17:04:53
回答 4查看 13.5K关注 0票数 1

我很困惑,我试图从一个数据库中填充5个文本框,并不是所有的5个都会有数据。

示例:

ID \\ ItemID \x{e76f} QType

1×10×2盒

2×10×6方箱

3/ 11 -1案件

在本例中,它将用2个框填充QuantityType1TxtBox,用6个框填充QuantityType2TxtBox,而将其他三个文本框保留为空。

当我试图运行这段代码时,我会遇到以下错误:索引超出了数组的界限.

这个错误发生在这一行上: QuantityType2TxtBox.Text = rdr.GetString(1);

代码语言:javascript
复制
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();
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-26 17:14:49

我不确定开关语句是否正确,但我认为这段代码的其余部分对于显示参数和使用语句是有用的。

代码语言:javascript
复制
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’。

票数 8
EN

Stack Overflow用户

发布于 2014-02-26 17:11:19

做这件事的方法很多,但是一个粗略的实现可以让你开始这样做:

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

票数 3
EN

Stack Overflow用户

发布于 2014-02-26 17:07:21

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

因为您是通过调用rdr.GetString(1)请求第二列,所以会出现索引超出界限的异常。

我将编辑select语句以命名每个文本框中要放置的每个字段,以便索引能够像您预期的那样工作。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22048290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档