从 VB.NET 中的 SQL Server 中提取值

Posted

技术标签:

【中文标题】从 VB.NET 中的 SQL Server 中提取值【英文标题】:Pull value from SQL Server in VB.NET 【发布时间】:2016-12-06 20:07:56 【问题描述】:

我正在尝试从 VB.NET 的 SQL Server 表中提取值。

在 VB Form 1 上,NoTable 第 1 行的数字被成功拉取,Label1 更新为该值。

    Dim command As SqlCommand
    Dim query As String = "SELECT Number FROM NoTable"
    command = New SqlCommand(query, con)
    con.Open()
    Dim datareader As SqlDataReader = cmd.ExecuteReader()
    If datareader.Read() Then
        Label1.Text = datareader.GetValue(0)
    End If
    datareader.Close()

在 VB Form 2 上,我试图从第二行提取值,使用:

    Dim query As String = "SELECT Number FROM NoTable"
    command = New SqlCommand(query, con)
    con.Open()
    Dim datareader As SqlDataReader = cmd.ExecuteReader()
    If datareader.Read() Then
        Label1.Text = datareader.GetValue(1)
    End If
    datareader.Close()

但是,这不起作用,并且标签不会使用第二行中的值进行更新。

System.Data.dll 中出现“System.IndexOutOfRangeException”类型的未处理异常

附加信息:索引超出了数组的范围。”

我将如何解决这个问题,以便在表格 2 上提取第 2 行的值,等等?

谢谢。

【问题讨论】:

datareader.GetValue(0) ? 没有。 SqlDataReader.GetValue(Int32),传递的数字用于索引列。如果只返回一列,则应始终使用SqlDataReader.GetValue(0)。你只需要让它在返回值之前迭代记录 n 次,其中 n 是你的表单#。 在 SQL 中,除非您使用 ORDER BY,否则没有排序,因此除了其他人指出的问题外,代码中第一个和第二个数字的预期概念没有意义。 最好知道您的表中是否有主键 (ID)。此键不必与 # 形式相同,但顺序应相同。如果有,我有一个更好的答案。告诉我。 【参考方案1】:

首先,您只能从阅读器返回一列,但您正在使用 0 或 1 对列进行索引。因此您应该始终将 0 传递给 GetValue

要改为索引行,试试这个。为每个表单分配一个表单编号(在我的示例中为第一行)并使用它来确定要分配给标签的记录。可能有一种更有效的方法来执行此操作(不返回之前的所有记录),但此解决方案应该适合您的环境。

' in form # 1
Dim formNumber = 1
Dim command As SqlCommand
Dim query As String = "SELECT Number FROM NoTable"
command = New SqlCommand(query, con)
con.Open()
Dim datareader As SqlDataReader = cmd.ExecuteReader()
Dim index = 0
While index < formNumber    
    If datareader.Read() AndAlso index = formNumber Then
        Label1.Text = datareader.GetValue(0)
    End If
    index += 1
End While
datareader.Close()

见https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getvalue(v=vs.110).aspx

还有一个c#中的类似问题Access a specific row in DataReader

另一种方法是首先返回您需要的行,而不在客户端迭代记录。假设有另一列的索引与您要返回的行的顺序相同,称为“ID”

' in form # 1
Dim formNumber = 1
Dim command As SqlCommand
Dim query As String =
    "SELECT Number FROM " & _
    " (SELECT Number, Row_Number() OVER (ORDER BY ID) AS RowNumber " & _
    " FROM NoTable) AS Results " & _
    " WHERE Results.RowNumber = " & formNumber.ToString()
command = New SqlCommand(query, con)
con.Open()
Dim datareader As SqlDataReader = cmd.ExecuteReader()
Label1.Text = datareader.GetValue(0)
datareader.Close()

见https://msdn.microsoft.com/en-us/library/ms186734.aspx

【讨论】:

【参考方案2】:

GetValue(1) 不存在,因为这将引用 select 语句中的第二列。您只要求 [Number] 即 datareader.GetValue(0)

【讨论】:

以上是关于从 VB.NET 中的 SQL Server 中提取值的主要内容,如果未能解决你的问题,请参考以下文章

使用 VB.NET 表单从 SQL Server 到 Excel 的日期数据检索

从 Sql Server 检索照片到 asp.net 和 Vb.net

如何从数据表 vb.net 向 sql server 数据库插入值

链接到 SQL Server 的 Active Directory

VB6/Microsoft Access/DAO 到 VB.NET/SQL Server... 有建议吗?

vb.net 运行 gpg.exe 作业步骤从 PC 运行正常,但不能从 SQL Server 代理计划运行