我在从SQL Server上的数据库中填充Visual Basic中的ComboBox时遇到问题,当我在手表中调试程序时,我看到我放在DisplayMember上的值有点丢失,我在ValueMember中使用的值出现在DisplayMember上,它还标记了ValueMember上的异常,上面写着: 无法绑定到新的显示成员。参数名称:新显示成员。 加载表单时我有以下代码:
Private Sub Form9_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim conexion As New EnlaceBD
Dim tabla As New DataSet
tabla = conexion.SetFrecuencias()
ComboBox1.DataSource = tabla
ComboBox1.DisplayMember = "Nombre"
ComboBox1.ValueMember = "Id"
End Sub
在另一个.vb我有以下功能:
Public Function SetFrecuencias() As DataSet
Dim Qry As String
Dim data As New DataSet
Try
conectar()
Qry = "sp_Frecuencias"
comandosql = New SqlCommand(Qry, conexion)
comandosql.CommandType = CommandType.StoredProcedure
Dim parametro1 As SqlParameter = comandosql.Parameters.Add("@Opc", SqlDbType.Char, 1)
parametro1.Value = "X"
adaptador.SelectCommand = comandosql
adaptador.Fill(data)
Catch ex As SqlException
Finally
desconectar()
End Try
Return data
End Function
在SQL中,我有我的表和存储过程的创建:
--TABLE
IF EXISTS(SELECT 1 FROM sysobjects WHERE name = 'Frecuencia' AND type ='U')
BEGIN
DROP TABLE Frecuencia
END
CREATE TABLE Frecuencia (
IdFrecuencia int identity,
Nombre varchar(30),
Dias int,
CONSTRAINT PK_Frecuencia PRIMARY KEY(IdFrecuencia),
)
--SP
IF EXISTS(SELECT 1 FROM sysobjects WHERE name = 'sp_Frecuencias' AND type ='P')
BEGIN
DROP PROCEDURE sp_Frecuencias
END
GO
CREATE PROCEDURE sp_Frecuencias(
@Opc char(1),
@Id int,
@Nombre varchar(30),
@Dias int
)
AS
BEGIN
IF @Opc = 'X' --SELECT ALL --
BEGIN
SELECT IdFrecuencia 'Id', Nombre 'Nombre', Dias 'Dias'
FROM Frecuencia
END
END
抱歉,如果西班牙语中的名称令人困惑,Nombre表示名称,Dias表示Days,Frecuencia或Frecuencias表示频率,Conexion是连接,Tabla是表,Parametro表示参数,Adaptador是适配器。
以下是异常和手表的图像: 异常和监视
存储过程似乎声明了未使用的额外参数。我不确定所呈现的格式。它可能需要调整。
If EXISTS(SELECT 1 FROM sysobjects WHERE name = 'sp_Frecuencias' AND type ='P')
BEGIN
DROP PROCEDURE sp_Frecuencias
End
GO
CREATE PROCEDURE sp_Frecuencias(
@Opc char(1),
)
AS
BEGIN
If @Opc = 'X' --SELECT ALL --
BEGIN
Select Case IdFrecuencia 'Id', Nombre 'Nombre', Dias 'Dias'
From Frecuencia
End
End
我将DataSet
更改为DataTable
.我认为这是你的主要问题。DataSet
没有字段Nombre
或ID
。数据集包含数据表等。您不需要New DataTable
因为新的只会被SetFrecuencias
返回的那个覆盖。我记得DataSource
财产是在DisplayMember
和ValueMember
之后。
Private Sub Form9_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim conexion As New EnlaceBD
Dim tabla = conexion.SetFrecuencias()
ComboBox1.DisplayMember = "Nombre"
ComboBox1.ValueMember = "Id"
ComboBox1.DataSource = tabla
End Sub
数据访问代码使用Using...End Using
块,确保连接和命令被关闭和处置。数据库对象应是使用它们的方法的本地对象。您只处理单个表,因此不需要DataSet
。也不需要DataAdapter
。
不要写空Catch
块。那只会吞下错误。
Private ConStr As String = "Your connection string"
Public Function SetFrecuencias() As DataTable
Dim data As New DataTable
Using con As New SqlConnection(ConStr),
comandosql As New SqlCommand("sp_Frecuencias", con)
comandosql.CommandType = CommandType.StoredProcedure
comandosql.Parameters.Add(" @Opc", SqlDbType.Char, 1).Value = "X"c
con.Open()
data.Load(comandosql.ExecuteReader)
End Using
Return data
End Function
根据@Charlieface的评论进行编辑
Public Function SetFrecuencias() As DataTable
Using data As New DataTable
Using con As New SqlConnection(ConStr),
comandosql As New SqlCommand("sp_Frecuencias", con)
comandosql.CommandType = CommandType.StoredProcedure
comandosql.Parameters.Add(" @Opc", SqlDbType.Char, 1).Value = "X"c
con.Open()
Using reader = comandosql.ExecuteReader
data.Load(reader)
End Using
End Using
Return data
End Using
End Function