我有这个代码,我正在做的是执行StoredProcedure,它只选择2个字段(ID,Name),然后我想用数据填充组合框。这是我的代码......
Using con As New SqlConnection(sConnection)
Dim cmd As New SqlCommand
Dim ds As New DataSet
Dim sqlAdp As New SqlDataAdapter
con.Open()
cmd.CommandText = "sp_RData"
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@Name", "Accounting")
cmd.Connection = con
sqlAdp.SelectCommand = cmd
sqlAdp.Fill(ds)
ComboBox1.DataSource = ds
ComboBox1.ValueMember = "ID"
ComboBox1.DisplayMember = "Name"
End Using
我的存储过程非常简单,就像这样......
Select ID, Name from tblRData where Name = @Name
@Name显然是我试图传递的参数。
在Combobox1.ValueMember =“ID”上发生了什么,它说“无法绑定到新的显示成员。”
任何人都知道为什么?这是使用存储过程中的数据填充组合框的最佳方法吗?想知道这是不是防弹,我不认为不是,因为很多组合框将填充在form_load上,只是想知道是否有更好的方法来做到这一点。从VB6的精彩世界进入vb.net。
答案 0 :(得分:2)
代码中唯一真正“错误”的是:
ComboBox1.DataSource = ds
与名称相反,DataSet
不包含数据,而是数据所在的DataTable
个对象的集合,因此:
ComboBox1.DataSource = ds.Tables(0)
但代码可以更短,效率更高:
Using con As New SqlConnection(sConnection),
cmd As New SqlCommand("sp_RData")
cmd.CommandType = CommandType.StoredProcedure
con.Open()
cmd.Parameters.Add("@Name", SqlDbType.Text).Value = "Accounting"
Dim dt As New DataTable()
dt.Load(cmd.ExecuteReader())
ComboBox1.DataSource = dt
ComboBox1.ValueMember = "ID"
ComboBox1.DisplayMember = "Name"
End Using
Dispose()
块中使用实现Using
方法的任何内容。上面的代码将Connection和Command对象“堆叠”到一个Using
块中,主要是为了减少缩进。DataTable
对象填充DbCommand
,因此它更简单,并且使用更少的“事情”来完成工作。对于某些提供程序和非常大的数据集,适配器更快,但数量不足以担心。Add
到AddWithValue
。后者要求DB Provider根据传递的数据推断数据类型,这在某些情况下可能会失败。 上面的代码填充了本地DataTable
,然后超出了范围。这可能没问题,但考虑到WHERE子句可能没有。如果您稍后(重新)用“Janitorial”中的名字填充CBO,则有一种更简单的方法:
DataTable
,以便您可以在别处引用它根据需要更改过滤器:
dtDepts.DefaultView.RowFilter = String.Format("Name = '{0}", thisDept)
视图根据您的需要限制显示为“管理”或“秘书”的内容。绑定到表的CBO会自动更新。