WinterPrison Ответов: 1

Как исправить вставку списка в базу данных


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

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

Это мой код.:

Try
          connect()
          connection.Open()
          Dim queryString As String
          queryString = "Insert into ServiceRecords([Personnel]) Values(@Personnels)"
          command = New OleDbCommand(queryString, connection)
          For i As Integer = 0 To Me.ListBox1.Items.Count + 1
              command.Parameters.AddWithValue("@Personnels", ListBox1.Items(i))
          Next
      Catch ex As Exception

      End Try

Maciej Los

Я сомневаюсь в этом, потому что ваша команда никогда не выполняется...
Все, что вам нужно сделать, это создать команду и выполнить ее (используя метод ExecuteNonQuery ()) внутри цикла for-next.
Понял?

WinterPrison

Tnx, но это не решило мою проблему.

Maciej Los

- Вы уверены?

1 Ответов

Рейтинг:
1

Richard MacCutchan

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

queryString = "Insert into ServiceRecords([Personnel]) Values(@Personnels)"
command = New OleDbCommand(queryString, connection)
For i As Integer = 0 To Me.ListBox1.Items.Count + 1
    command.Parameters.AddWithValue("@Personnels", ListBox1.Items(i))
    command.ExecuteNonQuery()
    command.Parameters.Clear()
Next

Видеть Объект oledbcommand.Метод ExecuteNonQuery (System.Data.Для oledb)[^].


WinterPrison

Извините, что спрашиваю об этом Ричарда, но теперь я получаю эту часть ExecuteNonQuery (), но как я должен делать циклическую часть

For i As Integer = 0 To Me.ListBox1.Items.Count + 1
    command.Parameters.AddWithValue("@Personnels", ListBox1.Items(i))
    command.ExecuteNonQuery()
Next

Maciej Los

Ричард, небольшое примечание: команда также должна быть создана внутри цикла for-next из-за увеличения количества параметров на каждом шаге цикла.

Richard MacCutchan

Спасибо, я пропустил этот момент. Вы можете догадаться, что я не программист SQL.

Richard MacCutchan

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

Maciej Los

Всегда пожалуйста :)

WinterPrison

Извините, что спрашиваю об этом снова, но нужно ли мне ставить 2 команды.Метод executenonquery()?

потому что...

у меня есть еще один вопрос здесь

 Try
            connect()
            connection.Open()
            Dim queryString As String
            queryString = "Insert into ServiceRecords([ServiceID],[ClientName],[Contact Person],[Address],[TimeStarted],[TimeEnded],[OpDate],[FloorDrain Quantity],[FloorDrain Clogged],[FloorDrain F/R]) Values(@SeriveID,@ClientName,[@Contact Person],@Address,@TimeStarted,@TimeEnded,@OpDate,[@FloorDrain Quantity],[@FloorDrain Clogged],[@FloorDrain F/R])"
            command = New OleDbCommand(queryString, connection)
            command.Parameters.Add(New OleDbParameter("ServiceID", CType(serviceIDText.Text, String)))
            command.Parameters.Add(New OleDbParameter("ClientName", CType(clientNameText.Text, String)))
            command.Parameters.Add(New OleDbParameter("Contact Person", CType(cPersonText.Text, String)))
            command.Parameters.Add(New OleDbParameter("Address", CType(addressText.Text, String)))
            command.Parameters.Add(New OleDbParameter("TimeStarted", CType(timeStartedText.Text, String)))
            command.Parameters.Add(New OleDbParameter("TimeEnded", CType(timeEndedText.Text, String)))
            command.Parameters.Add(New OleDbParameter("OpDate", CType(datePicker.Text, Date)))
            command.Parameters.Add(New OleDbParameter("FloorDrain Quantity", CType(fldQuantityText.Text, String)))
            command.Parameters.Add(New OleDbParameter("FloorDrain Clogged", CType(fldClcbox.CheckState, Boolean)))
            command.Parameters.Add(New OleDbParameter("FloorDrain F/R", CType(fldFinRecText.Text, String)))

            command.ExecuteNonQuery()
            insertListBox()

            MsgBox("Successfully Added!", MsgBoxStyle.Information)


и я вызываю fucntion insertListBox()

    Private Sub insertListBox()
       
        'This is code for listbox items to inserted to the database ew'


            Try

            Dim queryString As String
           queryString = "Insert into ServiceRecords([Personnel]) Values(@Personnels)"
            command = New OleDbCommand(queryString, connection)
            For i As Integer = 0 To Me.ListBox1.Items.Count + 1
                command.Parameters.AddWithValue("@Personnels", ListBox1.Items(i))
                command.ExecuteNonQuery()
                command.Parameters.Clear()
            Next

        Catch ex As Exception

        End Try


    End Sub

Richard MacCutchan

Да, каждый вызов ExecuteNonQuery связан только с текущей командой, для которой он вызывается. Вам также нужно каждый раз проверять возвращаемое значение, чтобы увидеть, удалось ли это сделать. Не показывайте сообщения типа - Успешно Добавлено!" когда вы понятия не имеете, удалось это или нет.

WinterPrison

Ребята спасибо за вашу помощь действительно он успешно вставлен в базу данных, но можно ли вставить его в одну строку в datagridview?

Richard MacCutchan

Извините, я не понял вопроса.

WinterPrison

Это моя новая проблема.

https://i.stack.imgur.com/9G6JB.png

и я получаю это

https://i.stack.imgur.com/Ucv50.png

Richard MacCutchan

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