VB. net установка источника данных в поле со списком - PullRequest
1 голос
/ 27 марта 2020

Я хочу установить источник данных для моего комбинированного списка, когда я бегу, там нет ошибок, но он продолжает показывать нули в комбинированном списке

Dim cnx As New MySqlConnection("datasource=localhost;database=bdgeststock;userid=root;password=")
        Dim cmd As MySqlCommand = cnx.CreateCommand
        Dim da As MySqlDataAdapter
        Dim ds As New DataSet
        If ConnectionState.Open Then
            cnx.Close()
        End If
        cnx.Open()
        cmd.CommandText = "SELECT idf,(prenom + ' ' + nom) AS NAME FROM fournisseur "
        da = New MySqlDataAdapter(cmd)
        cnx.Close()
        da.Fill(ds)
        da.Dispose()
        ComboBox1.DataSource = ds.Tables(0)
        ComboBox1.ValueMember = "idf"
        ComboBox1.DisplayMember = "NAME"

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Для источника данных ComboBox вам, вероятно, не нужен тяжелый набор данных или DataTable - сбор простого объекта сделает эту работу.

Другим подходом было бы переместить логи представления c в код vb. net и оставить сервер sql только для сохранения логики c.

Public Class Fournisseur
    Public ReadOnly Property Id As Integer
    Public ReadOnly Property Name As String  

    Public Sub New(id As Integer, prenom As String, nom As String)
        Id = id
        Name = $"{pronom} {nom}".Trim()
    End Sub
End Class

Вы можете создать специальную функцию для загрузки данных

Private Function LoadItems() As List(Of Fournisseur)
    Dim query = "SELECT idf, prenom, nom FROM fournisseur"

    Using connection As New MySqlConnection(connectionString)
        Using command As New MySqlCommand(query, connection)
            connection.Open()
            Dim items = new List(Of Fournisseur)()

            Using reader AS MySqlDataReader = command.ExecuteReader()
                While reader.Read()
                    Dim item As New Fournisseur(
                        reader.GetInt32(0),
                        reader.GetString(1),
                        reader.GetString(2)
                    )

                    items.Add(item)
                End While
            End Using

            Return items
        End Using
    End Using
End Function

Тогда использование будет выглядеть довольно просто

ComboBox1.ValueMember = "Id"
ComboBox1.DisplayMember = "Name"
ComboBox1.DataSource = LoadItems()
2 голосов
/ 27 марта 2020

Я думаю, что проблема в вашем sql, а mysql выполняет какое-то добавление чисел c к преному плюс ном и производит 0

Попробуйте

CONCAT(prenom, ' ', nom) as name

В вашем sql вместо. Я предпочитаю использовать concat в большинстве RDBMS для конкатенации строк, потому что он более соответствует его поведению в NULL - в sqlserver, использование оператора concat для плюса на чем-то вроде 'a' + null приводит к NULL, но в oracle 'a' || null - это a - в обоих случаях поведение CONCAT согласовано

Вот полный код со всеми моими рекомендациями:

Dim cnstr = "datasource=localhost;database=bdgeststock;userid=root;password="
Dim cmd = "SELECT idf, CONCAT(prenom, ' ', nom) AS nom FROM fournisseur "
Using da As New MySqlDataAdapter(cmd, cnstr)
    Dim dt As New DataTable
    da.Fill(dt)
    ComboBox1.DataSource = dt
    ComboBox1.ValueMember = "idf"
    ComboBox1.DisplayMember = "nom"
End Using

Советы:

  • вам не нужно возиться с соединением: dataadapter создаст / откроет / закроет его для вас
  • использовать набор данных, а не набор данных
  • использовать Использование
  • использовать конструктор MySqlDataAdapter, который принимает Строка соединения и текст команды - короче и ближе в этом случае. Я использую конструктор, который принимает DbConnection, только если я вручную регистрирую несколько команд в транзакции и т. Д. c
...