VB.NET 中的 ADODB RecordSet 为 String()
ADODB RecordSet to String() in VB.NET
我发现这个 post 可以帮助我的项目:
我想把它改成VB.NET而不是VBA,但是不行。
我的目标是使用 SQL 创建一个 String()。为了让您了解硬编码后字符串的外观,我们是这样做的:
Public Sub New()
InitializeComponent()
strValue = New String() {"10051", "65658", "25689" etc... }
End Sub
**'My actual code is as follows:**
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
Dim Connection1 As New ADODB.Connection
Dim Connection1 As New ADODB.Connection
Dim RecordSet1 As New ADODB.Recordset
Dim SqlQuery1 As String, ConnectionString1 As String
Dim strValue As String()
SqlQuery1 = "Select ItemCode From OITM"
ConnectionString1 = "Driver=SQL Server;Server=Myserver; Database=MyDbase;
User Id = sa; Password= 12345"
Connection1.Open(ConnectionString1)
RecordSet1 = New ADODB.Recordset
RecordSet1.Open(SqlQuery1, Connection1)
strValue = TryCast(RecordSet1.Fields("ItemCode").Value, String())
Do While RecordSet1.EOF = False
strValue = TryCast(RecordSet1.Fields("ItemCode").Value, String())
MsgBox(strValue)
RecordSet1.MoveNext()
Loop
我希望 MsbBox 在每次循环时显示 ItemCode,并构建整个(很长的)字符串。但是它显示空白。
我读到 EOF 可能在 VB .NET 中不起作用。
我必须做什么?
我发现了一些问题:
首先,您将从记录集中获得的值转换为字符串数组。为什么?你不应该这样做,尝试像这样直接设置值:
strValue = RecordSet1.Fields("ItemCode").Value
其次,您没有连接字符串。使用“+”或“&”连接您从每一行读取的内容,如下所示:
Do While RecordSet1.EOF = False
strValue = strValue + RecordSet1.Fields("ItemCode").Value
MsgBox(strValue)
RecordSet1.MoveNext()
Loop
但是您需要一个数组来满足您的需要。所以你可以使用一个列表,然后使用 toArray 方法:
Dim strValues As String()
Dim strList As List(Of String) = New List(Of String)()
Do While RecordSet1.EOF = False
strList.Add(RecordSet1.Fields("ItemCode").Value)
RecordSet1.MoveNext()
Loop
strValues = strList.ToArray()
现在 strValues 是从 SQL 数据库读取的字符串数组。
I expect the MsbBox to show the ItemCode at each looping, and building up the whole (very long) string
这不是它的工作原理。每次通过循环,您都有 一项 。代码中没有任何内容会累积每次迭代的值。尝试转换为一个数组,即使它可以工作(它不工作)仍然只会给你一个 new array instance 在每次迭代中只有一个项目。再一次,即使这么多也不会发生。您不能只将单个项目转换为数组。
不仅如此,.Net 使用 真正的 数组,而不是您现在在其他语言中看到的类似数组的集合。 .Net 也有这些集合,但它不会假装它们是数组。真实数组的关键属性之一是固定大小。第一次分配数组时,必须知道数组中元素的数量。甚至 ReDim Preserve
也依赖于此,有效地分配一个 全新数组 并在每次使用它时复制所有元素。这意味着期望将项目强制转换为数组变量会连接到数组真的很奇怪。听起来您可能想要 List(Of String)
而不是数组。
如果程序的其他部分需要一个数组,您需要将它们改为使用 List(Of String)
。基本数组在 .Net 中不再经常使用,主要替换为通用 List(Of T)
类型。只要有可能,让你的方法参数要求 IEnumerable(Of T)
而不是 T()
或 List(Of T)
。当您使用 IEnumerable(Of T)
时,数组和列表都可以作为参数传递。
另一个问题是使用带有 MsgBox()
的数组。消息框不够智能,不知道如何处理数组。您最终会退回到 System.Object.ToString()
重载,它只是 returns 类型名称。因此,即使其他一切都有效(它不会),您希望看到的最好的是文本 System.Array
.
最后,不要在VB.Net
中使用RecordSet
旧的 ADO 库的存在只是为了在向前移植代码时向后兼容。你不应该在新的开发中使用它。请改用较新的 ADO.Net API。
试试这个:
'At the very top of the file:
Imports System.Data.SqlClient
Imports System.Collections.Generic
Imports System.Text
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
'I know this is just a sample, but DON'T USE THE SA ACCOUNT!
Dim ConnectionString As String = "Server=Myserver;Database=MyDbase;User Id=sa;Password=12345"
Dim Sql As String = "Select ItemCode From OITM"
Dim result As New List(Of String) 'The "array" (really an array-like collection)
Dim message As New StringBuilder() 'For building up the string
Using connection As New SqlConnection(ConnectionString), _
command As New SqlCommand(sql, connection)
connection.Open()
Using reader As SqlDataReader = command.ExecuteReader()
Dim delimiter As String = ""
While reader.Read()
Dim itemCode As String = reader("ItemCode").ToString()
result.Add(itemCode)
message.Append(delimiter).Append(itemCode)
MessageBox.Show(message.ToString())
delimiter = ","
End While
End Using
End Using
End Sub
另一种选择是创建数据表:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
'I know this is just a sample, but DON'T USE THE SA ACCOUNT!
Dim ConnectionString As String = "Server=Myserver;Database=MyDbase;User Id=sa;Password=12345"
Dim Sql As String = "Select ItemCode From OITM"
Dim result As New DataSet()
Using connection As New SqlConnection(ConnectionString), _
command As New SqlCommand(sql, connection), _
adapter As New SqlDataAdapter(command)
adapter.Fill(result)
End Using
End Sub
我发现这个 post 可以帮助我的项目:
我想把它改成VB.NET而不是VBA,但是不行。
我的目标是使用 SQL 创建一个 String()。为了让您了解硬编码后字符串的外观,我们是这样做的:
Public Sub New()
InitializeComponent()
strValue = New String() {"10051", "65658", "25689" etc... }
End Sub
**'My actual code is as follows:**
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
Dim Connection1 As New ADODB.Connection
Dim Connection1 As New ADODB.Connection
Dim RecordSet1 As New ADODB.Recordset
Dim SqlQuery1 As String, ConnectionString1 As String
Dim strValue As String()
SqlQuery1 = "Select ItemCode From OITM"
ConnectionString1 = "Driver=SQL Server;Server=Myserver; Database=MyDbase;
User Id = sa; Password= 12345"
Connection1.Open(ConnectionString1)
RecordSet1 = New ADODB.Recordset
RecordSet1.Open(SqlQuery1, Connection1)
strValue = TryCast(RecordSet1.Fields("ItemCode").Value, String())
Do While RecordSet1.EOF = False
strValue = TryCast(RecordSet1.Fields("ItemCode").Value, String())
MsgBox(strValue)
RecordSet1.MoveNext()
Loop
我希望 MsbBox 在每次循环时显示 ItemCode,并构建整个(很长的)字符串。但是它显示空白。
我读到 EOF 可能在 VB .NET 中不起作用。
我必须做什么?
我发现了一些问题:
首先,您将从记录集中获得的值转换为字符串数组。为什么?你不应该这样做,尝试像这样直接设置值:
strValue = RecordSet1.Fields("ItemCode").Value
其次,您没有连接字符串。使用“+”或“&”连接您从每一行读取的内容,如下所示:
Do While RecordSet1.EOF = False
strValue = strValue + RecordSet1.Fields("ItemCode").Value
MsgBox(strValue)
RecordSet1.MoveNext()
Loop
但是您需要一个数组来满足您的需要。所以你可以使用一个列表,然后使用 toArray 方法:
Dim strValues As String()
Dim strList As List(Of String) = New List(Of String)()
Do While RecordSet1.EOF = False
strList.Add(RecordSet1.Fields("ItemCode").Value)
RecordSet1.MoveNext()
Loop
strValues = strList.ToArray()
现在 strValues 是从 SQL 数据库读取的字符串数组。
I expect the MsbBox to show the ItemCode at each looping, and building up the whole (very long) string
这不是它的工作原理。每次通过循环,您都有 一项 。代码中没有任何内容会累积每次迭代的值。尝试转换为一个数组,即使它可以工作(它不工作)仍然只会给你一个 new array instance 在每次迭代中只有一个项目。再一次,即使这么多也不会发生。您不能只将单个项目转换为数组。
不仅如此,.Net 使用 真正的 数组,而不是您现在在其他语言中看到的类似数组的集合。 .Net 也有这些集合,但它不会假装它们是数组。真实数组的关键属性之一是固定大小。第一次分配数组时,必须知道数组中元素的数量。甚至 ReDim Preserve
也依赖于此,有效地分配一个 全新数组 并在每次使用它时复制所有元素。这意味着期望将项目强制转换为数组变量会连接到数组真的很奇怪。听起来您可能想要 List(Of String)
而不是数组。
如果程序的其他部分需要一个数组,您需要将它们改为使用 List(Of String)
。基本数组在 .Net 中不再经常使用,主要替换为通用 List(Of T)
类型。只要有可能,让你的方法参数要求 IEnumerable(Of T)
而不是 T()
或 List(Of T)
。当您使用 IEnumerable(Of T)
时,数组和列表都可以作为参数传递。
另一个问题是使用带有 MsgBox()
的数组。消息框不够智能,不知道如何处理数组。您最终会退回到 System.Object.ToString()
重载,它只是 returns 类型名称。因此,即使其他一切都有效(它不会),您希望看到的最好的是文本 System.Array
.
最后,不要在VB.Net
中使用RecordSet旧的 ADO 库的存在只是为了在向前移植代码时向后兼容。你不应该在新的开发中使用它。请改用较新的 ADO.Net API。
试试这个:
'At the very top of the file:
Imports System.Data.SqlClient
Imports System.Collections.Generic
Imports System.Text
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
'I know this is just a sample, but DON'T USE THE SA ACCOUNT!
Dim ConnectionString As String = "Server=Myserver;Database=MyDbase;User Id=sa;Password=12345"
Dim Sql As String = "Select ItemCode From OITM"
Dim result As New List(Of String) 'The "array" (really an array-like collection)
Dim message As New StringBuilder() 'For building up the string
Using connection As New SqlConnection(ConnectionString), _
command As New SqlCommand(sql, connection)
connection.Open()
Using reader As SqlDataReader = command.ExecuteReader()
Dim delimiter As String = ""
While reader.Read()
Dim itemCode As String = reader("ItemCode").ToString()
result.Add(itemCode)
message.Append(delimiter).Append(itemCode)
MessageBox.Show(message.ToString())
delimiter = ","
End While
End Using
End Using
End Sub
另一种选择是创建数据表:
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
Handles MyBase.Load
'I know this is just a sample, but DON'T USE THE SA ACCOUNT!
Dim ConnectionString As String = "Server=Myserver;Database=MyDbase;User Id=sa;Password=12345"
Dim Sql As String = "Select ItemCode From OITM"
Dim result As New DataSet()
Using connection As New SqlConnection(ConnectionString), _
command As New SqlCommand(sql, connection), _
adapter As New SqlDataAdapter(command)
adapter.Fill(result)
End Using
End Sub