The-guy-on-the-couch Ответов: 2

Выберите другую таблицу в базе данных access с помощью VB.NET


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

У меня есть форма, которая передает данные в базу данных access (это работает). Однако мне нужно обновить его так, чтобы он передавал информацию в разные таблицы в одной и той же БД, основываясь на выборе в выпадающем списке. Например, если combobox selection = X, то вставить в tableX, если combobox = Y, то вставить в tableY. Любая и всякая помощь будет оценена по достоинству.

Примечание: Я пробовал использовать операторы If для выбора соответствующей таблицы, но это не работает. Я не получаю никаких ошибок в VS, однако, когда я пытаюсь отправить, я получаю диалоговое окно с надписью "текст команды не установлен для объекта команды".

Пожалуйста, смотрите код ниже.

Что я уже пробовал:

Imports System.Data.OleDb

Public Class Form1
Public ds As New DataSet
Dim provider As String
Dim dataFile As String
Dim connString As String
Dim myConnection As OleDbConnection = New OleDbConnection
Dim rs As New resizer
Dim cmd As OleDbCommand


Private con As Object

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


    provider = "Provider=Microsoft.Jet.OleDb.4.0;Data Source="
    dataFile = "R:\Quality\NCR-Access_Database\NCRdb1.mdb"
    connString = provider & dataFile
    myConnection.ConnectionString = connString
    myConnection.Open()



    Dim str As String
    str = ""

    If ComboBox2.SelectedText = "Assembly" Then
        str = "Insert into [ASSEMBLYtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Grinding" Then
        str = "Insert into [GRINDINGtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Milling" Then
        str = "Insert into [MILLINGtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Mill-Turn" Then
        str = "Insert into [MILL-TURNtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Turning" Then
        str = "Insert into [TURNINGtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Supplier" Then
        str = "Insert into [PURCHASINGtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Subcon" Then
        str = "Insert into [PURCHASINGtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    ElseIf ComboBox2.SelectedText = "Quality" Then
        str = "Insert into [QUALITYtbl]([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
    End If


    cmd = New OleDbCommand(str, myConnection)
    cmd.Parameters.Add(New OleDbParameter("NCR-No", TextBox1.Text))
    cmd.Parameters.Add(New OleDbParameter("Week-No", TextBox3.Text))
    cmd.Parameters.Add(New OleDbParameter("Part-No", TextBox4.Text))
    cmd.Parameters.Add(New OleDbParameter("Drawing_Rev", TextBox5.Text))
    cmd.Parameters.Add(New OleDbParameter("Description", TextBox6.Text))
    cmd.Parameters.Add(New OleDbParameter("W/O-No", TextBox7.Text))
    cmd.Parameters.Add(New OleDbParameter("Operator-No", TextBox8.Text))
    cmd.Parameters.Add(New OleDbParameter("Operation-No", TextBox9.Text))
    cmd.Parameters.Add(New OleDbParameter("Machine-No", TextBox10.Text))
    cmd.Parameters.Add(New OleDbParameter("Section", ComboBox2.Text))
    cmd.Parameters.Add(New OleDbParameter("Batch-Qty", TextBox12.Text))
    cmd.Parameters.Add(New OleDbParameter("Reject_Qty", TextBox13.Text))
    cmd.Parameters.Add(New OleDbParameter("Disposition", TextBox14.Text))
    cmd.Parameters.Add(New OleDbParameter("Mat-Cost", TextBox15.Text))
    cmd.Parameters.Add(New OleDbParameter("Standard-Cost", TextBox16.Text))
    cmd.Parameters.Add(New OleDbParameter("Defect-Description", RichTextBox1.Text))
    cmd.Parameters.Add(New OleDbParameter("Fault-Code", TextBox17.Text))
    cmd.Parameters.Add(New OleDbParameter("Dept", TextBox18.Text))
    cmd.Parameters.Add(New OleDbParameter("Root-Cause", RichTextBox2.Text))
    cmd.Parameters.Add(New OleDbParameter("NCR-Pinksheet", ComboBox1.Text))
    cmd.Parameters.Add(New OleDbParameter("Permanent-Action", RichTextBox3.Text))

    Try

        cmd.ExecuteNonQuery()
        cmd.Dispose()
        myConnection.Close()
        TextBox1.Clear()
        TextBox4.Clear()
        TextBox5.Clear()
        TextBox3.Clear()
        TextBox6.Clear()
        TextBox7.Clear()
        TextBox8.Clear()
        TextBox9.Clear()
        TextBox10.Clear()
        ComboBox2.ResetText()
        TextBox12.Clear()
        TextBox13.Clear()
        TextBox14.Clear()
        TextBox15.Clear()
        TextBox16.Clear()
        RichTextBox1.Clear()
        TextBox17.Clear()
        TextBox18.Clear()
        RichTextBox2.Clear()
        ComboBox1.ResetText()
        RichTextBox3.Clear()


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

End Sub


End Class

FranzBe

Какую версию доступа вы используете. "это не работает" означает что? У тебя есть исключение? С 1-го взгляда ваш код не выглядит неправильно (было бы лучше иметь только имя таблицы в операторе if, так как остальная часть sql-команды остается прежней)

The-guy-on-the-couch

Использование access 2003. Извините за это, я скопировал текст и забыл вставить остальное. Я не получаю никаких ошибок в VS, однако, когда я пытаюсь отправить, я получаю диалоговое окно с надписью "текст команды не установлен для объекта команды".

FranzBe

Это означает: переменная "str" пуста в конце оператора if-else. Вы можете добавить еще одно "еще" в конце, со значением "ни одно из моих ожидаемых значений combobox, где они совпадают, что-то не так". Или еще лучше: реструктурируйте свой код, как это предлагается в приведенном ниже решении. Установите точку останова в начале оператора if-else и изучите содержимое "ComboBox2.SelectedText". Если вы не знаете, то подойдет "Messagebox(ComboBox2.SelectedText)".

The-guy-on-the-couch

Спасибо за предложение вашей помощи, я попытался завершить оператор If Else, и он выдал тот же диалог "текст команды не установлен". Что касается приведенного ниже решения, то я попробовал метод "switch", однако он выдает ошибку BC32017 - запятая,`) ` или ожидаемое допустимое продолжение выражения. Удаление $"\"{ComboBox2.SelectedText}\ из аргумента очищает ошибку, но затем я получаю необработанное событие исключения при отправке данных.

FranzBe

хорошо, один шаг назад: значение, которое приходит из вашего combobox, не совпадает с ожидаемыми записями для 'tablename', с которыми вы проверяете. вы должны убедиться, что выбор, возможный с помощью выпадающего списка, соответствует именам таблиц, которые вы должны предоставить. Попробуйте установить точку останова в начале обработчика событий button1_click, проверьте .Свойство SelectedText. Что-то здесь не так.

FranzBe

Я только что опубликовал фрагмент в разделе решение 2, Возможно, вы сможете продолжить свой путь от этого в качестве отправной точки.

The-guy-on-the-couch

Ваше здоровье, я попробую. Надеюсь, я заставлю эту штуку работать. Я действительно не знаю, как разработчики могут делать это весь день. Я полагаю, что это помогает, если вы точно знаете, что делаете. Еще раз спасибо, я дам вам знать о результатах.

F-ES Sitecore

используйте отладчик, чтобы проверить, что "str" все еще не является пустой строкой, когда она попадает в ваш блок "try".

2 Ответов

Рейтинг:
2

OriginalGriff

Цитата:
Примечание: Я пробовал использовать операторы If для выбора соответствующей таблицы, но это не работает. Пожалуйста, смотрите код ниже.

"Это не работает", вероятно, самый бесполезный отчет о проблеме, который мы получаем - и мы получаем его много. Она ничего не говорит нам о том, что происходит или когда это происходит.
Итак, расскажите нам, что он делает, чего вы не ожидали, или не делает, что вы сделали.
Расскажите нам, что вы сделали, чтобы это произошло.
Сообщайте нам о любых сообщениях об ошибках.

Код, который у вас есть, будет работать при условии, что имя таблицы в вашем ComboBox присутствует в одной из проверок - и это включает любые случаи символов - "верхний регистр" не то же самое, что "верхний регистр" или "верхний регистр", когда вы сравниваете строки, например.

Кстати я хотел сделать это, чтобы использовать переключатель:
Dim str As String = ""

    Select Case ComboBox2.SelectedText.ToLower()
        Case "assembly"
            str = "ASSEMBLYtbl"
        Case "grinding"
            str = "GRINDINGtbl"
        Case "milling"
            str = "MILLINGtbl"
        Case "mill-turn"
            str = "[MILL-TURNtbl]"
        Case "turning"
            str = "TURNINGtbl"
        Case "supplier"
            str = "PURCHASINGtbl"
        Case "subcon"
            str = "PURCHASINGtbl"
        Case "quality"
            str = "QUALITYtbl"
        Case Else
            Throw New ArgumentException($"\"{ComboBox2.SelectedText}\" is not a known table name")
    End Select
Или даже словаря, а затем использовать имя таблицы :
str = $"INSERT INTO {str} ([NCR-No],[Week-No],[Part-No],[Drawing-Rev],[Description],[W/O-Number],[Operator-No],[Operation-No],[Machine-No],[Section],[Batch-Qty],[Reject_Qty],[Disposition],[Mat-Cost],[Standard-Cost],[Defect-Descripition],[Fault-Code],[Dept],[Root-Cause],[NCR-Pinksheet],[Action]) Values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"


И окажите себе две услуги в будущем:
1) прекратите использовать дефисы и подчеркивания в именах полей! Вместо этого используйте верхний регистр для обозначения начала каждого слова - тогда вам не понадобятся все квадратные скобки, которые загромождают ваш код и затрудняют его чтение.
2) прекратите использовать имена Visual Studio по умолчанию для всего - вы можете помнить, что "TextBox8" - это номер мобильного телефона сегодня, но когда вам придется изменить его через три недели, вы это сделаете? Используйте описательные имена - например, "tbMobileNo", - и ваш код станет легче читать, более самодокументируемым, легче поддерживать - и на удивление быстрее кодировать, потому что Intellisense может добраться до "tbMobile" за три нажатия клавиш, где "TextBox8" занимает размышление и 8 нажатий клавиш...


Рейтинг:
2

FranzBe

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


Public Class Form1

  Dim tableDictionary As Dictionary(Of String, String) = New Dictionary(Of String, String)()

  Private Sub FillDictionary()
    tableDictionary.Add("assembly", "ASSEMBLYtbl")
    tableDictionary.Add("grinding", "GRINDINGtbl")
    tableDictionary.Add("milling", "MILLINGtbl")
    tableDictionary.Add("mill-turn", "[MILL-TURNtbl]")  ' you should rename this!
    tableDictionary.Add("turning", "TURNINGtbl")
    tableDictionary.Add("supplier", "PURCHASINGtbl")
    tableDictionary.Add("subcon", "PURCHASINGtbl")
    tableDictionary.Add("quality", "QUALITYtbl")
  End Sub

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    FillDictionary()
    ComboBox2.DataSource = tableDictionary.ToList()
    ComboBox2.ValueMember = "Key"
    ComboBox2.DisplayMember = "Key"
  End Sub

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If ComboBox2.SelectedIndex = -1 Then
      MessageBox.Show("you must select something")
      Return
    End If

    Dim theTableName As String = "not defined"
    If tableDictionary.TryGetValue(ComboBox2.SelectedValue, theTableName) Then
      MessageBox.Show("you selected table: " + theTableName)
    Else
      MessageBox.Show("something went wrong")
      Return
    End If

    Dim sqlCommand As String = $"INSERT INTO {theTableName}  the rest of your command"
    MessageBox.Show($"this is the command for access: {sqlCommand}")
  End Sub
End Class


The-guy-on-the-couch

FranzBe спасибо Вам за вашу помощь, я наконец-то удосужился попробовать вышеприведенный метод, однако, когда я отправляю данные, VS возвращает "исключение необработанной" системы.ArgumentNullException: 'значение не может быть нулевым.
Имя параметра: ключ' в строке

If tableDictionary.TryGetValue(ComboBox2.SelectedValue, theTableName) Then
К сожалению, я не уверен, какую ценность это может иметь, пожалуйста, не могли бы вы посоветовать?

FranzBe

ok, the snippet above is working, I tested that before posting it. I can't see your code so I have no idea what is going wrong on your side. If you add a new form to your solution and paste the code above into it (and add a button1 and a ComboBox2) you have a snippet that builds an sql command string having the tablename as variable dependent on the setting of a combobox. That was the original question. You can then copy and paste the required parts into your form that is not yet working. If you were a colleague next floor I would offer you a visit an have a look on your screen. This "I get an error here" without seeing the context unfortunately leads to nothing.