【问题标题】:Read each row in a single column in a DataReader读取 DataReader 中单个列中的每一行
【发布时间】:2017-03-01 10:58:55
【问题描述】:

我使用while(dr.Read()){...}。但是我在读取数据时遇到了问题。 我有一张这样的桌子:

Column1

value1
value2
value3

我想得到Value1Value2Value3

我是这样做的:

Using myDataReader As OracleDataReader = myCommand.ExecuteReader
    While (myDataReader.Read())

        Value1= myDataReader.GetValue(0).ToString().Trim()
        Value2 = myDataReader.GetValue(1).ToString().Trim()
        Value3 = myDataReader.GetValue(2).ToString().Trim()

    End While
End Using

我可以检索Value1,但是在尝试检索Value2Value3 时出现以下错误:

指定的列索引无效

【问题讨论】:

  • 只有一列(在索引 0 处)。您可以使用List(Of String) 来存储数据并添加在while 循环的每次迭代中返回的值。
  • @Andrew Morton 你能展示代码示例吗?
  • 您可以找到许多示例,例如how to add database query results to an array in vb.net.
  • .Read() 一次返回一行。 GetValue(0) 从该行的第一个 获取值。 GetValue(1) 从第二列中获取值,在您的情况下该值不存在。您需要创建一个列表或数组,并在每次运行 .Read() 时(如果您得到 3 个结果,这将是 3 次,但这没关系 - 它可以读取数百万行而无需对代码进行任何更改) 您将 GetValue(0) 的结果添加到列表的末尾。
  • @ADyson 问题是我有很多属性,我需要用数据库中的值初始化每个属性

标签: vb.net sqldatareader datareader oledbdatareader


【解决方案1】:

您应该考虑使用DataTable 来加载数据,而不是使用和OracleDataReader。为此,请使用以下代码:

Dim dt As New DataTable
dt.Load(myCommand.ExecuteReader)

DataTable 现在将包含DataRows 的集合。您可以使用这些将值分配给您的变量,如下所示:

Value1 = dt.Rows(0).Item(0).ToString().Trim()
Value2 = dt.Rows(1).Item(0).ToString().Trim()
Value3 = dt.Rows(2).Item(0).ToString().Trim()

这可能会解决您最初的问题,但可能会导致进一步的问题。正如ADyson 在他的评论中所建议的那样:

@EmmaW。你可以在你的循环中添加一个计数器,这样你就知道你在哪一行,并且可以相应地填充属性。如果您的属性数量很少,Bugs 的建议也是明智的。 听起来您的代码内对象模型与您的数据库并不真正匹配(垂直 DB 记录结构与水平对象结构),这可能是概念设计问题的迹象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2013-05-20
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多