0
votes

La fonction VB.Net renvoie un tableau bidimensionnel de résultats MySql

Le code suivant extrait les données d'une connexion MySql et renvoie le tableau (sortie). Ce tableau à deux dimensions ne fonctionne que lorsque le nombre de lignes et de colonnes est spécifié avant d'exécuter la requête.

Y a-t-il un moyen de contourner ce problème? Une taille de tableau non fixe? Veuillez aider!

    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
'''


3 commentaires

@nkb Pourquoi supprimer les commentaires?


J'écrivais la réponse et quelque chose est survenu, alors j'ai temporairement supprimé la réponse


Y a-t-il une raison particulière pour laquelle vous avez besoin d'un tableau 2D? Il existe d'autres structures de données dans .net qui sont plus compatibles avec la récupération de données. Un DataTable vient à l'esprit ou une liste (Of T). Tous les champs de vos données sont-ils de type String?


3 Réponses :


1
votes

Utilisez ceci à la place

    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

Lorsque vous utilisez un entier

reader.GetInt32 (0)

et ainsi de suite

Pour obtenir les dimensions correctes pour votre tableau

Modifiez votre instruction de sélection comme ci-dessous

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

Donc, vous avez dans votre tableau de résultats une colonne de plus avec le nombre de lignes dans chaque ligne.

Maintenant, pour redimensionner votre tableau. le nombre de colonnes que vous devez connaître. Sinon, vous devez aussi ajouter

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

Alors et puis vous devez maîtriser votre datareader

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

L'idée est d'obtenir la première ligne, attrapez le nombre de lignes et redimensionnez correctement le tableau avec les bonnes diemnsions. Comme décrit, vous pouvez si vous voulez faire la même chose avec le numéro, si vous voulez être encore plus flexible.


4 commentaires

Merci pour votre réponse! J'ai mis à jour le code dans la question. J'ai été capable de le faire fonctionner si je spécifie la taille de la matrice avant d'exécuter la requête. Je suis désolé mais je suis très nouveau à VB et je ne comprends pas tout à fait où mettre le "Compte (*) comme totalnorows" que vous aviez posté. Cela corrige-t-il la question de taille prédéterminée de la matrice? Pourriez-vous me montrer où placer cela? Pardon...


comme je l'ai écrit, êtes-vous sûr que vous n'avez que 3 lignes, avec mon code, vous seriez plus flexibel ou vous devriez le limiter à 3.


Je ne sais pas combien il y en aura. Je veux utiliser ce que vous avez fourni mais je ne sais pas où le mettre.


Cela a pris du temps alors, voyez le code dans la réponse modifiée



1
votes

J'ai donné trois options différentes en utilisant différentes structures de données. La plupart des objets de base de données doivent être fermés et supprimés. Utiliser ... Fin Utiliser des blocs s'occupe de cela. Vous voulez en faire le moins possible pendant que la connexion est ouverte.

'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


0 commentaires

1
votes

Le moyen le plus simple est:

 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


0 commentaires