Search code examples
sqlvb.netvisual-studioms-accessoledb

How to input multiple ComboBox values into Access Database from Visual Studio via VB.net


With the current code that I am running no errors occur, but no data gets added to the Microsoft Access DB. It only uploads the data to the DB if 2 or less of the ComboBoxes are included in the code. This has me very confused. I have tried ComboBox1.SelectedItem.ToString, ComboBox1.SelectedItem.Text, and ComboBox1.Text and similar issues arise for all of them. Any ideas?

Imports System.Data.OleDb

Public DefineDataFile As String
Dim provider As String
Dim dataFile As String
Dim connString As String
Dim myConnection As OleDbConnection = New OleDbConnection


    provider = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    dataFile = "XXXXXXXXXXXXX.mdb"
    connString = provider & dataFile
    myConnection.ConnectionString = connString
    myConnection.Open()

    Dim str As String
    str = "INSERT INTO [Panels/Equipment] ([Panel/Equipment Name], [Machine Name], [Panel/Equipment #], [Type], [Functional Location], [Facility], [Category], [Lifetime Cost Savings], [Hours Per Day], [Days Per Week], [Weeks Per Year], [Description], [Environmental Condition], [Environmental Option], [Environmental Finding], [Heating/Cooling Condition], [Heating/Cooling Option], [Heating/Cooling Finding], [Wiring Condition], [Wiring Option], [Wiring Finding], [Machines ID])"
    str += "SELECT ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,[Machines].[Machines ID]"
    str += "FROM [Machines] WHERE [Machines].[Machine Name] = ? "

    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)
    cmd.Parameters.Add(New OleDbParameter("Panel/Equipment Name", CType(TextBox_Name.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Machine Name", CType(TextBox_Machine.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Panel/Equipment #", CType(TextBox_PENum.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Type", CType(ComboBox_Type.SelectedItem.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Functional Location", CType(TextBox_FunctionalLocation.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Facility", CType(TextBox_Facility.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Category", CType(ComboBox_Category.SelectedItem.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Lifetime Cost Savings", CType(TextBox_LifetimeCostSavings.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Hours Per Day", CType(TextBox_HoursPerDay.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Days Per Week", CType(TextBox_DaysPerWeek.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Weeks Per Year", CType(TextBox_WeeksPerYear.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Priority", CType(ComboBox_Priority.SelectedItem.Text, String)))
    cmd.Parameters.Add(New OleDbParameter("Description", CType(TextBox_Description.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Environmental Condition", CType(ComboBox_EC.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Environmental Option", CType(ComboBox_EO.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Environmental Finding", CType(ComboBox_EF.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Heating/Cooling Condition", CType(ComboBox_HCC.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Heating/Cooling Option", CType(ComboBox_HCO.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Heating/Cooling Finding", CType(ComboBox_HCF.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Wiring Condition", CType(ComboBox_WC.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Wiring Option", CType(ComboBox_WO.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Wiring Finding", CType(ComboBox_WF.SelectedItem.Text, String)))
 *  cmd.Parameters.Add(New OleDbParameter("Machine ID", CType(ComboBox_Machine.SelectedItem.ToString, String)))
   Try
        cmd.ExecuteNonQuery()
        cmd.Dispose()
        myConnection.Close()
        MsgBox("Panel/Equipment Successfully Added")

    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
    myConnection.Close()

Solution

  • Why are you converting a text to a string? In CType(TextBox_Name.Text, String) the expression TextBox_Name.Text is a string already. Simply write

    cmd.Parameters.Add(New OleDbParameter("Panel/Equipment Name", TextBox_Name.Text))
    

    For the other parameters, you must provide a value of a type which matches the type in the table column. E.g. If Machine ID in Access is a Numeric Long (32-bit), write

    cmd.Parameters.Add(New OleDbParameter("Machine ID", _
        CType(ComboBox_Machine.SelectedItem, Integer))) 'Integer in VB is 32-bit
    

    Also you have 21 ? but are inserting 23 Parameters. The Priority parameter seems to be wrong. Since you insert the Machine ID directly in the INSERT, you should not add a parameter for it but instead one for Machine Name in the where clause.

    The SelectedItem property of the ComboBox returns an Object. An object does not contain a property Text. What kind of objects do the combo boxes contain? If you added strings, then SelectedItem is a string already. E.g.

    cmd.Parameters.Add(New OleDbParameter("Type", ComboBox_Type.SelectedItem))
    

    Also I recommend you to use the project option Strict On in VB, as this shows you coding errors that are not shown otherwise.