vb.net 将数据源设置为组合框
vb.net setting data source to combobox
我想为我的组合框设置一个数据源,当我 运行 没有错误但它一直在组合框中显示零时
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"
我认为问题出在你的 sql,mysql 正在对 prenom 加上 nom 执行某种数字加法并生成 0
尝试
CONCAT(prenom, ' ', nom) as name
在您的 sql 中。我更喜欢在大多数 RDBMS 中使用 concat 来连接字符串,因为它与其在 NULL 上的行为更一致 - 在 sql 服务器中,在 'a' + null
之类的东西上使用加号的 concat 运算符会导致 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 会 create/open/close 为你
- 使用数据表而不是数据集
- 使用使用
- 使用带有连接字符串和命令文本的 MySqlDataAdapter 的构造函数 - 在这种情况下更短更近。如果我在一个事务中手动注册多个命令,我只使用采用 DbConnection 的构造函数等
对于 ComboBox 数据源,您可能不需要繁重的数据集或数据表 - 普通对象的集合就可以完成这项工作。
另一种方法是将表示逻辑移至 vb.net 代码,并让 sql 服务器仅执行持久性逻辑。
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()
我想为我的组合框设置一个数据源,当我 运行 没有错误但它一直在组合框中显示零时
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"
我认为问题出在你的 sql,mysql 正在对 prenom 加上 nom 执行某种数字加法并生成 0
尝试
CONCAT(prenom, ' ', nom) as name
在您的 sql 中。我更喜欢在大多数 RDBMS 中使用 concat 来连接字符串,因为它与其在 NULL 上的行为更一致 - 在 sql 服务器中,在 'a' + null
之类的东西上使用加号的 concat 运算符会导致 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 会 create/open/close 为你
- 使用数据表而不是数据集
- 使用使用
- 使用带有连接字符串和命令文本的 MySqlDataAdapter 的构造函数 - 在这种情况下更短更近。如果我在一个事务中手动注册多个命令,我只使用采用 DbConnection 的构造函数等
对于 ComboBox 数据源,您可能不需要繁重的数据集或数据表 - 普通对象的集合就可以完成这项工作。
另一种方法是将表示逻辑移至 vb.net 代码,并让 sql 服务器仅执行持久性逻辑。
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()