VB.net с проблемой зацикливания при вставке данных - PullRequest
0 голосов
/ 11 июня 2019

У меня есть таблица данных со столбцами Ending, PumpNo, NozzleNo, TankID. Пример данных из datagridview:

PumpNo    NozzleNo    TankID       Ending

   1          1       1-BIODIESEL  *This part is where user input ending for every pumpno, nozzle, and tankid*

Это пример вставки. На первой вставке Opening будет установлен в 0:

enter image description here

Когда вы вставляете второй раз, он должен зацикливаться в просмотре сетки данных, получать все детали и сохранять их в базе данных. После этого select top 1 ending order by desc из вашей прошлой записи в базе данных, и это будет ваше открытие для вашей второй вставки. Смотрите картинку ниже с желтой подсветкой:

enter image description here

Проблема

Я только что получил Ending от последней записи. Как показано ниже, где все окончания 8,9

enter image description here

Я думаю, у меня должен быть фильтр перед вставкой, например pumpno = @pumpno and nozzleno = @nozzleno and TankID = @tankid, чтобы при вставке в таблицу я получил обозначенное окончание 1, основанное на том, что я фильтрую.

Мой код:

  Dim Ending As Decimal
            'This is my code in selecting top 1 ending 
            SelectQuery = "SELECT TOP 1 Ending FROM DigitalTB WHERE PumpNo = @Pump1 AND NozzleNo = @Nozzle1 AND TankID = @Tank1 ORDER BY Ending DESC"
            cmd = New SqlCommand
            With cmd
                .Connection = Connections.cn
                .CommandText = SelectQuery
                .Parameters.Add(New SqlParameter("@Pump1", SqlDbType.NVarChar, 10))
                .Parameters.Add(New SqlParameter("@Nozzle1", SqlDbType.NVarChar, 10))
                .Parameters.Add(New SqlParameter("@Tank1", SqlDbType.NVarChar, 100))

                Dim pump1 As String = String.Empty
                Dim nozzle As String = String.Empty
                Dim tankid As String = String.Empty

Я зациклился здесь в моем представлении данных для возможности использования в качестве фильтра при выборе топ-1, заканчивающегося в моем запросе выбора:

                For Each row As DataGridViewRow In dgvDigital.Rows
                    pump1 = row.Cells(1).Value
                    nozzle = row.Cells(2).Value
                    tankid = row.Cells(3).Value

                    .Parameters("@Pump1").Value = pump1
                    .Parameters("@Nozzle1").Value = nozzle
                    .Parameters("@Tank1").Value = tankid
                    .ExecuteNonQuery()

Затем, используя sqlreader, я прочитаю все, что получаю из моего select top 1 ending запроса. В этой части, когда я msgbox(ending) работает отлично, но когда я вставляю вставку сюда, он сначала выбирает верхнюю 1 в первой строке, затем вставку, и цикл здесь не работает.

                    Using read As SqlDataReader = cmd.ExecuteReader
                        If read.Read Then
                            Ending = read("Ending")
                            read.Close()
'Msgbox(Ending)
                        End If
                    End Using
                Next
            End With

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

            'Inserting code
            InsertQuery = "INSERT INTO DigitalTB(PumpNo,NozzleNo,TankID,Opening,Ending,ReadingType,UserShift,Date,Time)" &
                " VALUES(@PumpNo1,@NozzleNo1,@TankID1,@Opening1,@Ending1,@ReadingType1,@UserShift1,@Date1,@Time1)"
            cmd = New SqlCommand
            With cmd
                .Connection = Connections.cn
                .CommandText = InsertQuery
                .Parameters.Add(New SqlParameter("@Ending", SqlDbType.Decimal))
                .Parameters.Add(New SqlParameter("@PumpNo", SqlDbType.NVarChar, 10))
                .Parameters.Add(New SqlParameter("@NozzleNo", SqlDbType.NVarChar, 10))
                .Parameters.Add(New SqlParameter("@TankID", SqlDbType.NVarChar, 100))

                .Parameters.AddWithValue("@Opening", Ending)  ' This part is where i insert the top 1 from ending
                .Parameters.AddWithValue("@UserShift", Interfacefrm.lblUserInterface.Text)
                .Parameters.AddWithValue("@ReadingType", "Fuel")
                .Parameters.AddWithValue("@Date", Date.Now.ToShortDateString) 'I save it as string
                .Parameters.AddWithValue("@Time", Date.Now.ToShortTimeString) 'I save it as string
            End With

            For i As Integer = 0 To Me.dgvDigital.Rows.Count - 1
                With cmd
                    .Parameters(0).Value = Me.dgvDigital.Rows(i).Cells(0).Value
                    .Parameters(1).Value = Me.dgvDigital.Rows(i).Cells(1).Value
                    .Parameters(2).Value = Me.dgvDigital.Rows(i).Cells(2).Value
                    .Parameters(3).Value = Me.dgvDigital.Rows(i).Cells(3).Value
                    .ExecuteNonQuery()
                End With
            Next
            MsgBox("Success Inserting")

1 Ответ

1 голос
/ 11 июня 2019

Я уже ответил на мой вопрос.Используя подзапрос , выделите мои значения, чтобы получить желаемый результат.

 Connections.connect()
                InsertQuery = "INSERT INTO DigitalTB(PumpNo,NozzleNo,TankID,Opening,Ending,ReadingType,UserShift,Date,Time)" &
                " VALUES(@PumpNo1,@NozzleNo1,@TankID1,(SELECT TOP 1 Ending FROM DigitalTB WHERE PumpNo = @PumpNo1 AND NozzleNo = @NozzleNo1 AND TankID = @TankID1 ORDER BY Ending DESC),@Ending1,@ReadingType1,@UserShift1,@Date1,@Time1)"



            cmd = New SqlCommand
            With cmd
                .Connection = Connections.cn
                .CommandText = InsertQuery
                .Parameters.Add(New SqlParameter("@Ending1", SqlDbType.Decimal))
                .Parameters.Add(New SqlParameter("@PumpNo1", SqlDbType.NVarChar, 10))
                .Parameters.Add(New SqlParameter("@NozzleNo1", SqlDbType.NVarChar, 10))
                .Parameters.Add(New SqlParameter("@TankID1", SqlDbType.NVarChar, 100))

                '  .Parameters.Add(New SqlParameter("@Opening1", Ending))   ' This part is where i insert the top 1 from ending
                .Parameters.AddWithValue("@UserShift1", Interfacefrm.lblUserInterface.Text)
                .Parameters.AddWithValue("@ReadingType1", "Fuel")
                .Parameters.AddWithValue("@Date1", Date.Now.ToShortDateString) 'I save it as string
                .Parameters.AddWithValue("@Time1", Date.Now.ToShortTimeString) 'I save it as string

                For i As Integer = 0 To Me.dgvDigital.Rows.Count - 1
                    With cmd
                        .Parameters(0).Value = Me.dgvDigital.Rows(i).Cells(0).Value
                        .Parameters(1).Value = Me.dgvDigital.Rows(i).Cells(1).Value
                        .Parameters(2).Value = Me.dgvDigital.Rows(i).Cells(2).Value
                        .Parameters(3).Value = Me.dgvDigital.Rows(i).Cells(3).Value
                        .ExecuteNonQuery()
                    End With
                Next

            End With
            MsgBox("Success Inserting")
            Connections.disconnect()                                                          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...