У меня возникают проблемы с заполнением ComboBox в Visual Basic из базы данных на SQL Server, и когда я отлаживаю свою программу в часах, я вижу, что значение, которое я установил для DisplayMember, отсутствует, ...

0
Cecilia Villarreal 5 Янв 2021 в 05:15

1 ответ

Лучший ответ

Кажется, что в хранимой процедуре объявлены дополнительные параметры, которые не используются. Я не уверен в представленном формате. Возможно, его придется подправить.

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. DataSets, помимо прочего, содержат DataTables. Вам не нужен 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
0
Mary 5 Янв 2021 в 18:52