从 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