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