【问题标题】:VB.Net Function Return MySql Results Two Dimensional ArrayVB.Net 函数返回 MySql 结果二维数组
【发布时间】:2019-10-17 19:00:16
【问题描述】:

以下代码从 MySql 连接中提取数据并返回数组(输出)。 只有在运行查询之前指定了行数和列数时,此二维数组才有效。

有没有办法解决这个问题?非固定数组大小? 请帮忙!


    Public Function GetUsers() As String(,)
        Dim GetCommand As MySqlCommand
        Dim SQL As String = "Select * From users"
        Dim output(,) As String
        Dim intRowCount As Integer = 2
        Dim intColumnCount As Integer = 3 ' Users Count
        ReDim output(intColumnCount - 1, intRowCount - 1)
        Dim GetMyConn As New MySqlConnection
        GetMyConn.ConnectionString = "server = mysql.com;user id=rtest;password=test1234;database=rtestdb;"

        GetMyConn.Open()
        GetCommand = New MySqlCommand(SQL, GetMyConn)
        Dim counter As Integer = 0
        Try
            Dim getResult As Object = GetCommand.ExecuteReader()
            While getResult.Read()
                output(counter, 0) = getResult("username").ToString()
                output(counter, 1) = getResult("game_ip").ToString()
                counter = counter + 1
            End While
        Catch e As MySqlException
            MessageBox.Show("There was an error accessing your data. DETAIL: " & e.ToString())
        End Try

        GetMyConn.Close()
        Return output

    End Function
'''

【问题讨论】:

  • @nkb 为什么要删除 cmets?
  • 我正在写答案,但出现了一些问题,所以我暂时删除了答案
  • 有什么特殊原因需要二维数组吗? .net 中还有其他与数据检索更兼容的数据结构。想到一个 DataTable 或一个 List(Of T)。您的数据中的所有字段都是字符串类型吗?

标签: mysql sql vb.net


【解决方案1】:

改用这个

            output(counter, 0) = getResult.GetString(0)
            output(counter, 1) = getResult.GetString(1)

当你有整数使用时

reader.GetInt32(0)

等等

为您的数组获取正确的尺寸

如下所示更改您的选择语句

 Dim SQL As String = "Select (SElECT Count(*) rowcount FROM users),* From users"

因此,您在结果表中多了一个列,其中包含每行的行数。

现在重新调整您的阵列。您应该知道的 Columncount。否则,您还必须添加

,(SELECT count(*) FROM information_schema.columns
WHERE table_name ='users') columncount

所以你必须熟练使用你的数据阅读器

    Try
        Dim getResult As Object = GetCommand.ExecuteReader()
        If getResult.Read() Then            
          ReDim output(intColumnCount - 1, Integer.Parse(getResult("rowcount ")) - 1)

          output(0, 0) = getResult("username").ToString()
          output(0, 1) = getResult("game_ip").ToString(
          counter += 1
          While getResult.Read()
            output(counter, 0) = getResult("username").ToString()
            output(counter, 1) = getResult("game_ip").ToString()
            counter = counter + 1
          End While
        END IF

    Catch e As MySqlException
        MessageBox.Show("There was an error accessing your data. DETAIL: " & e.ToString())
    End Try

我们的想法是获取第一行,捕获行数并使用正确的维度重新调整数组的大小。如前所述,如果你想对数字做同样的事情,如果你想更灵活的话,你可以这样做。

【讨论】:

  • 感谢您的回复!我更新了问题中的代码。如果我在运行查询之前指定数组大小,我就能让它工作。很抱歉,我对 VB 很陌生,不太明白将您发布的“Count(*) AS TotalNORows”放在哪里。这会解决预先确定的数组大小问题吗?你能告诉我把这个放在哪里吗?对不起...
  • 正如我所写的,您确定您只有 3 行吗,使用我的代码,您将是 mre flexibel,或者您应该将其限制为 3。
  • 我不确定会有多少。我想使用您提供的内容,但不知道该放在哪里。
  • 花费了一些时间,请查看已编辑答案中的代码
【解决方案2】:

我给出了三个使用不同数据结构的不同选项。大多数数据库对象需要关闭和处置。 Using...End Using 块可以解决这个问题。您希望在连接打开时尽可能少做。

'Option 1 Using DataTable
Public Function GetUsers() As DataTable
    Dim dt As New DataTable
    Using GetMyConn As New MySqlConnection("server = mysql.com;user id=rtest;password=test1234;database=rtestdb;"),
        GetCommand As New MySqlCommand("Select * From users", GetMyConn)
        GetMyConn.Open()
        dt.Load(GetCommand.ExecuteReader)
    End Using
    Return dt
End Function

'Option 2 Using List(Of User)
Public Class User
    Public Property ID As Integer
    Public Property Name As String
    Public Property GameIP As String

    Public Sub New(UserID As Integer, UName As String, UGame As String)
        ID = UserID 'Assumed there was a primary key ID of some sort
        Name = UName
        GameIP = UGame
    End Sub
End Class

Public Function GetUsers() As List(Of User)
    Dim lst As New List(Of User)
    Using GetMyConn As New MySqlConnection("server = mysql.com;user id=rtest;password=test1234;database=rtestdb;"),
            GetCommand As New MySqlCommand("Select * From users", GetMyConn)
        GetMyConn.Open()
        Using r = GetCommand.ExecuteReader
            While r.Read
                Dim u = New User(r.GetInt32(0), r.GetString(1), r.GetString(2))
                lst.Add(u)
            End While
        End Using
    End Using
    Return lst
End Function

'Option 3 Using 2D array
Public Function GetUsers() As String(,)
    Dim Users(,) As String = Nothing
    Dim dt As New DataTable
    Using GetMyConn As New MySqlConnection("server = mysql.com;user id=rtest;password=test1234;database=rtestdb;"),
                GetCommand As New MySqlCommand("Select username, game_ip From users", GetMyConn)
        GetMyConn.Open()
        dt.Load(GetCommand.ExecuteReader)
    End Using
    ReDim Users(dt.Rows.Count - 1, 1)
    For r = 0 To dt.Rows.Count - 1
        Users(r, 0) = dt(r)(0).ToString
        Users(r, 1) = dt(r)(1).ToString
    Next
    Return Users
End Function

【讨论】:

    【解决方案3】:

    最简单的方法是:

     Friend Function getDataAsArray() As Array
            Try
    
                Dim SQLConnection = New SqlConnection("server = mysql.com;user id=rtest;password=test1234;database=rtestdb;")
    
                Dim DtTable As New DataTable
    
                Dim mSqlAdapter As New SqlClient.SqlDataAdapter With {
                        .SelectCommand = New SqlCommand("Select * From yourtable", SQLConnection)
                    }
    
                mSqlAdapter.Fill(DtTable)
    
                Dim output As Array = (From twoColumns As DataRow In DtTable
                                       Select col1 = twoColumns.Item("username"),
                                 col2 = twoColumns.Item("game_ip")).ToList.ToArray
    
                Return output
    
            Catch ex As Exception
                Console.WriteLine("Ops ops ops something wrong: " + ex.ToString)
            End Try
    
            Return Nothing
    
        End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 2012-06-24
      • 2017-07-18
      相关资源
      最近更新 更多