У меня есть таблица данных со столбцами 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:
Когда вы вставляете второй раз, он должен зацикливаться в просмотре сетки данных, получать все детали и сохранять их в базе данных. После этого select top 1 ending order by desc
из вашей прошлой записи в базе данных, и это будет ваше открытие для вашей второй вставки. Смотрите картинку ниже с желтой подсветкой:
Проблема
Я только что получил Ending
от последней записи. Как показано ниже, где все окончания 8,9
Я думаю, у меня должен быть фильтр перед вставкой, например 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")