2015-02-09 3 views
0

У меня есть таблицы внутри моей базы данных MySql:Как заполнить ComboBox в зависимости от выбранного элемента из другого ComboBox в VB

  1. материала
  2. unitofmeasure

У меня также есть 2 выпадающие списки:

  1. cmbHeader - этот combobox заполняет таблицы внутри базы данных.
  2. cmbContent - это выпадающий следует заполнить столбцы внутри таблицы, выбранной из cmbHeader

Я был в состоянии заполнить cmbHeader с таблицы внутри моей базы данных, используя этот код:

Dim conn As New MySqlConnection 
    Dim command As New MySqlCommand 
    Dim dt As New DataTable 
    conn.ConnectionString = "server=localhost;userid=root;password=NewPass;database=converter" 
    Try 
     conn.Open() 
     dt = conn.GetSchema("TABLES") 

     cmbHeader.DataSource = dt 
     cmbHeader.DisplayMember = "table_name" 
     cmbHeader.ValueMember = "table_name" 

     command.Dispose() 
     conn.Close() 
    Catch ex As Exception 

    End Try 

Теперь для cmbContent, я получаю сообщение об ошибке в моем коде. Я использую этот код:

Private Sub cmbHeader_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbHeader.SelectedIndexChanged, cmbList.SelectedIndexChanged 
    Dim conn As New MySqlConnection 
    Dim command As New MySqlCommand 
    Dim dt As New DataTable 
    Dim reader As MySqlDataReader 
    conn.ConnectionString = "server=localhost;userid=root;password=NewPass;database=converter" 

    conn.Open() 
    Dim query As String 
    query = "SELECT * FROM '" & cmbHeader.SelectedItem & "'" 
    command = New MySqlCommand(query, conn) 
    reader = command.ExecuteReader 

    cmbList.Items.Clear() 

    While reader.Read 
     Dim header = reader.GetString("Header") 
     Dim content = reader.GetString("Content") 
     Dim convert = reader.GetString("Convert") 

     cmbList.Items.Add(content) 
    End While 

    command.Dispose() 
    reader.Close() 
    conn.Close() 
End Sub 

Это изображение ошибки, которую я получаю с помощью приведенного выше кода. Error1

Я попытался изменить мой запрос "SELECT * FROM '" & cmbHeader.SelectedItem.ToString & "'", но я получаю другую ошибку. Как я могу заполнить свой второй ComboBox в зависимости от того, что я выбрал на своем первом ComboBox? Пожалуйста, помогите, я застрял. Благодарю. :)

+0

как вы можете использовать одиночные qoutes для имени таблицы? а также вы выбираете selectitem из combobox, вместо этого выбираете значение selected или selectedtext. –

ответ

0

Заменить следующие строки в коде,

query = "SELECT * FROM '" & cmbHeader.SelectedItem & "'" 

с этой линией,

query = "SELECT * FROM " & cmbHeader.SelectedItem.Value & ";" 

Надеется, что это будет работать. Спасибо.

+0

Это не сработало. Он по-прежнему показывает ту же ошибку. – Nek

0

сделать запрос, как например:

query = "SELECT * FROM " & cmbHeader.Text '<-- updation 
          OR 
query = "SELECT * FROM " & cmbHeader.SelectedValue '<-- updation 

, но это не является хорошей практикой, поскольку это приведет к sql injection поэтому я предлагаю вам сделать это с помощью параметризованных (в этом случае судебный запрет можно избежать как это позволяет только выбранные значения из выпадающего списка., но в целом это не очень хорошая практика, именно поэтому я предлагаю как этот) запрос, как как следующий

query = "SELECT * FROM ?" 
    Dim cmd As New OdbcCommand 
    With cmd 
     .CommandType = CommandType.Text 
     .CommandText = query 
     .Connection = con 
     .Parameters.Add(New OdbcParameter(@table,cmbHeader.SelectedItem)) 
    End With 
+0

Это не сработало. Он показывает ту же ошибку. – Nek

+0

Вы можете оставить сообщение –

+0

Пожалуйста, обратитесь к этому изображению. http://tinypic.com/view.php?pic=2s8sepu&s=8 – Nek

-1

ДЛЯ ДРУГИХ Р У EOPLE, у которого есть такая же проблема

Мне удалось выяснить, что не так с моим кодом. Значение combobox, которое я получаю, возвращает «Data.Row.DataRowView», поэтому мой запрос терпит неудачу.Я изменил это:

cmbHeader.DataSource = dt 
cmbHeader.DisplayMember = "table_name" 
cmbHeader.ValueMember = "table_name" 

в этом:

cmbHeader.ValueMember = "table_name" 
cmbHeader.DisplayMember = "table_name" 
cmbHeader.DataSource = dt 

Тогда на моем SelectedIndexChanged случая, я использовал это:

Dim value As String = "" 
    value = Convert.ToString(cmbHeader.Text) 

    conn.Open() 
    Dim query As String 
    query = "SELECT * FROM " & value 
    command = New MySqlCommand(query, conn) 
    'With command 
    ' .Parameters.AddWithValue("header", value) 
    'End With 

    reader = command.ExecuteReader 

    cmbList.Items.Clear() 

    While reader.Read 
     Dim content = reader.GetString("Content") 

     cmbList.Items.Add(content) 
    End While 

    command.Dispose() 
    reader.Close() 
    conn.Close() 

Надеется, что это помогает. Спасибо всем за помощь. :)

Смежные вопросы