如何在 vb 中使用 Windows 窗体从 SQL Server 填写组合框?无法绑定到新的显示成员.参数名称:新显示



我在从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没有字段NombreID。数据集包含数据表等。您不需要New DataTable因为新的只会被SetFrecuencias返回的那个覆盖。我记得DataSource财产是在DisplayMemberValueMember之后。

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

相关内容

  • 没有找到相关文章

最新更新