简体   繁体   English

VB.net插入数据时出现循环问题

[英]VB.net with looping problem in inserting data

I have datagridview with columns Ending, PumpNo, NozzleNo, TankID . 我有datagridview列Ending, PumpNo, NozzleNo, TankID Example of data from datagridview: 来自datagridview的数据示例:

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

This is an example of inserting. 这是插入的示例。 On the first insert, Opening will be set to 0: 在第一个插入处, Opening将设置为0:

在此处输入图片说明

When you insert for the 2nd time, it should loop in the datagridview and get all details and save them to the database. 第二次插入时,它将在datagridview中循环并获取所有详细信息并将其保存到数据库。 Afterwards, select top 1 ending order by desc from the past record you have in database and that will be your opening to your 2nd insert. 然后,从数据库中的过去记录中select top 1 ending order by desc ,这将是您第二次插入的开始。 See the picture below with yellow highlight: 看到下面带有黄色突出显示的图片:

在此处输入图片说明

The problem is 问题是

I'm just getting the Ending from the last record. 我只是从最近的唱片中获得Ending As shown below where all Endings are 8.9 如下所示,所有结尾均为8.9

在此处输入图片说明

I think i should have filter before inserting like pumpno = @pumpno and nozzleno = @nozzleno and TankID = @tankid so that when I insert into table, I will get the designated top 1 ending based on what I filter. 我想我应该在插入之前像pumpno = @pumpno and nozzleno = @nozzleno and TankID = @tankid一样pumpno = @pumpno and nozzleno = @nozzleno and TankID = @tankid安装过滤器,这样当我插入表时,我将根据过滤器得到指定的前1个结尾。

My Code: 我的代码:

  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

I loop here in my datagridview for able to use as my filter when selecting top 1 ending in my select query: 我在datagridview中循环到这里,以便在选择以select查询结尾的前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()

Then using sqlreader I will read all that I get from my select top 1 ending query. 然后,使用sqlreader,我将从select top 1 ending查询中读取所有内容。 In this part when I msgbox(ending) it works perfectly, but when I put the insert here it will select top 1 first in first row then insert and loop doesn't work here. 在这部分中,当我使用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

This is my insert code where I get the details in my table and insert them into my database. 这是我的插入代码,可在其中获取表中的详细信息并将其插入数据库。 I would want to have a filter here: 我想在这里有一个过滤器:

            '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")

I already answered my question. 我已经回答了我的问题。 By using the subquery select inside my values to get the output i want. 通过使用子查询, 在我的值中选择要获取的输出。

 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()                                                          

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM