vb.net 将数据源设置为组合框
Posted
技术标签:
【中文标题】vb.net 将数据源设置为组合框【英文标题】:vb.net setting data source to combobox 【发布时间】:2020-07-07 20:50:14 【问题描述】:我想在我的组合框中设置一个数据源,当我运行时没有错误,但它一直在组合框中显示零
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"
【问题讨论】:
您不必在那里使用数据集,您可以将其更改为数据表- dataadapter.fill 有一个需要数据表的重载,这意味着您可以Dim dt as DataTable, Fill(dt), .DataSource = dt
- 更整洁
将您的数据适配器放在 Using 块中而不是调用 dispose 可能更好 - 如果发生异常,很容易忘记 dispose 或错过调用它,但如果它在 Using 中则不用担心 - 即使异常发生 VB 将确保事情被处理
其实代码里还有很多可以清理的东西;请参阅我在答案末尾发布的代码块(以防您已经看到早期的建议并且没有看到编辑)
【参考方案1】:
我认为问题出在你的 sql 中,mysql 正在对 prenom 加上 nom 执行某种数字加法并产生 0
试试
CONCAT(prenom, ' ', nom) as name
改为在您的 sql 中。我更喜欢在大多数 RDBMS 中使用 concat 来连接字符串,因为它与它在 NULL 上的行为更一致 - 在 sqlserver 中,在 '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 将为您创建/打开/关闭它 使用数据表而不是数据集 使用使用 使用 MySqlDataAdapter 的构造函数,它接受一个连接字符串和一个命令文本——在这种情况下更短更近。如果我在事务中手动注册多个命令等,我只使用采用 DbConnection 的构造函数【讨论】:
【参考方案2】:对于 ComboBox 数据源,您可能不需要繁重的 Data Set 或 DataTable - 普通对象的集合就可以完成这项工作。
另一种方法是将表示逻辑移到 vb.net 代码中,让 sql server 只做持久性逻辑。
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()
【讨论】:
我几乎不同意你在这里写的一切;对于所介绍的有限用例,这是冗长的,完全没有必要。如果您想要一个强类型的类,请使用强类型的数据表。我们需要避免不断地建议使用 dataReader 完成每个琐碎的数据库访问;每次你想使用一个安静的 web 服务时,你是否创建一个 tcp 套接字并手动实现 http 协议和 JSON 序列化?不。那么我们也不应该在数据库访问方面保持如此低的水平。 @CaiusJard,不,但是您使用 HttpClient 和 JSON 序列化器将数据检索到对象中,在这种情况下 MySqlCommand 和 MySqlDataReader 扮演客户端和序列化器的角色。您可以将锅炉代码包装到类或方法中。 @CaiusJard,这是任何开发人员都可以做出的决定,将您的业务逻辑保留在数据库存储过程中,并在 UI 中使用 DataTables 操作,或者保留在 vb.net 代码中,并将数据库视为简单的存储设备最小的业务逻辑。 不,类比是 MySqldataReader 大约是您在 C# 中所能获得的最低水平。 HttpClient 是对 tcp 套接字的高级抽象。如果这个答案推荐使用例如 Dapper,我就会少有问题。我们确实需要摆脱这种我们鼓励新手在访问数据时使用最低限度的思维模式,但其他一切都是明智的高水平,因为它会浪费大量时间来编写乏味的代码更好地移交给好的图书馆。我们几乎用其他所有东西来做到这一点。 @CaiusJard,对不起,但我的主要观点是关于使用普通的 vb.net 对象而不是重的DataTable
,尤其是在只读情况下,例如 ComboBox 的数据源.如果您觉得更方便,请随意通过 DataTable 填充普通对象。怀着同样的热情,我想说,我们真的需要摆脱这种鼓励新手在任何地方使用DataTable
的心态。相反,他们专注于为工作寻找合适的工具,如果它是 DataTable
- 完全可以,因为开发人员是根据他当时的知识做出决定的人以上是关于vb.net 将数据源设置为组合框的主要内容,如果未能解决你的问题,请参考以下文章
如何使用来自 msaccess 表的过滤数据填充 vb.net 中的组合框
VB.NET 2005 - 无法绑定到新的显示成员 - 组合框 - 数组