从Select query mysql vb.net中插入值数组

时间:2016-02-23 11:43:27

标签: mysql vb.net

我有一个应用程序,显示某个引用的移位目标。我有很多参考文献分为3班(早上,下午,晚上) 该应用程序运行良好,但现在我想在所有参考的每个班次开始时重置班次目标的计数器。我的意思是,当时钟是早上6点时,所有早班都应该把计数器置于0。 我有以下代码但不工作。有些东西不见了,我被卡住了。

Dim rtime As New TimeSpan(0, 0, CInt(requestddate.TimeOfDay.TotalSeconds))


        hora1 = New TimeSpan(6, 0, 0)
        hora2 = New TimeSpan(14, 0, 0)
        hora3 = New TimeSpan(22, 0, 0)

        ConnectDatabase()

        If rtime = hora1 Then

            count = 0

            Try

                With cmd4
                    .Connection = conn
                    .CommandText = "Select ShiftTarget.IDShiftTarget from ShiftTarget, turnos, linhas WHERE ShiftTarget.IDLinha = linhas.IDLinha and ShiftTarget.IDTurno = turnos.IDTurno And turnos.Descricao = 'Manha' And linhas.NomeLinha = '" & GlobalVariables.linha & "'"
                End With

                While objReader.Read()
                listaIDs.Add(objReader("IDShiftTarget").ToString())
            End While

            objReader.Close()

            DisconnectDatabase()

            ConnectDatabase()

            With cmd1
                .Connection = conn
                .CommandText = "INSERT into contador (IDShiftTarget, Data, Contador) VALUES (@ID, @date, @cont)"
                For Each item As String In listaIDs
                    MsgBox(item)
                    .Parameters.AddWithValue("@ID", item)
                    .Parameters.AddWithValue("@date", data.ToString("yyyy-MM-dd"))
                    .Parameters.AddWithValue("@cont", count)
                    .ExecuteNonQuery()
                Next
            End With

        Catch ex As Exception
            If ex.InnerException IsNot Nothing Then
                MsgBox(ex.InnerException)
            End If
        End Try

        DisconnectDatabase()

有人能告诉我我做错了什么吗?

更新: 这是我从select查询得到的(并且是预期的): enter image description here

这是我要重置计数器的表格: enter image description here

所以,想象一下,当实际时间是早上6点时,我想插入类似的内容:

IDContador   IDShiftTarget      Data      Contador
11933          32           2016-02-23       0
11934          19           2016-02-23       0
11935          20           2016-02-23       0
11936          35           2016-02-23       0

我不能简单地重置为0,其中idshifttarget等于19,20,32,35因为这将重置所有记录,我想将它们保留在表中。 我需要检查MAX(ID),其中shiftTarget是我在数组中得到的值,然后将Contador设置为0。

更新:

我在代码中做了这些更改:

While objReader.Read()
                listaIDs.Add(objReader("IDShiftTarget").ToString())
            End While

            objReader.Close()

            DisconnectDatabase()

            ConnectDatabase()

            With cmd1
                .Connection = conn
                .CommandText = "INSERT into contador (IDShiftTarget, Data, Contador) VALUES (@ID, @date, @cont)"
                For Each item As String In listaIDs
                    MsgBox(item)
                    .Parameters.AddWithValue("@ID", item)
                    .Parameters.AddWithValue("@date", data.ToString("yyyy-MM-dd"))
                    .Parameters.AddWithValue("@cont", count)
                    .ExecuteNonQuery()
                Next
            End With

        Catch ex As Exception
            If ex.InnerException IsNot Nothing Then
                MsgBox(ex.InnerException)
            End If
        End Try

        DisconnectDatabase()

使用此代码我只能看到第一个ID,在控制台中我得到下一个错误: 抛出异常:MySql.Data.dll中的“System.InvalidOperationException”

1 个答案:

答案 0 :(得分:1)

你的代码中有些东西会导致错误的行为:

  • 通过DataReader循环时无法执行CRUD操作: 创建一个列表来存储IDShiftTargets,关闭DataReader,然后循环遍历列表并执行Insert语句。
  • 请注意数据库列的数据类型与代码数据匹配 types(IDShiftTarget int / Integer,IDShiftTarget date / DateTime,...)。
  • 使用带有绑定参数的预准备语句时,请确保使用 AddWithValue只在循环外部进行一次,并将其设置在循环中 Parameter("@ID").Value = item
  • 由于代码是在每秒滴答的计时器事件中执行的,因此它是
    可能是第一次执行直到下一个计时器才结束 蜱。如果你想运行代码安全和同步确保 当前执行不受干扰,例如设置Timer.Enabled= False 函数的开头和函数后的Timer.Enabled=True 完了。或者只是将计时器刻度设置得足够高( d'哦)。