自动更新访问表具有来自vb.net的随机数的单元格

时间:2015-08-22 05:29:40

标签: vb.net ms-access

我搜索了很多论坛,但没有找到任何解决方案。我想从Vb.net更新访问表单元格。我的表有字段:

[PanelNumber],[Date], [PVValue]

在面板编号字段中,有一些文字,如“面板1”,“面板2”等。 从vb,我将在点击一个按钮后选择“Panel 1”,我需要在给定范围内用随机数填写“PVValue”字段,plz检查下面的代码,当我尝试使用此代码时,我总是变得相同所有行中的数字 但需要单独的数字(可能会在某些行中重复) LogTable2是我的表名

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=LoggedData.accdb;Jet OLEDB:Database Password=GodavarthiSuresh;"
        myNewConnection.ConnectionString = connString
        myNewConnection.Open()

        Dim UpdateString As String = "update LogTable2 set [pvvalue]= @rndVal1 where panelnumber='" & panelnametxt.Text & "'"
        Dim UpdateCmd As New OleDb.OleDbCommand(UpdateString, myNewConnection)
        UpdateCmd.Parameters.Clear()
        Randomize()
        UpdateCmd.Parameters.AddWithValue("@rndVal1", GetRandom())

        Try
            UpdateCmd.ExecuteNonQuery()
            UpdateCmd.Dispose()
            myNewConnection.Close()

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try


    End Sub
' this is the function to get random number in given range
 Public Function GetRandom() As Integer
        Static Generator As System.Random = New System.Random()
        Return Generator.Next(825, 850)
    End Function

2 个答案:

答案 0 :(得分:2)

如果每个面板有多行,并且您希望它们具有不同的值,则需要单独更新它们。如果有五行关联,则更新命令将被“调用”5次,这是不正确的。每次点击活动都会执行一次。

要执行您想要的操作,您需要为AutoIncrement ID列添加唯一标识符。

Private RNG As New Random()
Private Sub btnUpdate_Click(etc...

    Dim sql = "SELECT ID FROM LogTable2 WHERE panelnumber = @pnl"
    Dim pnlList As New List(Of Int32)

    Using con As OleDbConnection = GetACEConnection()
        Using cmd As New OleDbCommand(sql, con)

            con.Open()

            cmd.Parameters.AddWithValue("@pnl", panelnametxt.Text)

            ' get affected row IDs into a list;
            Using rdr As OleDbDataReader = cmd.ExecuteReader
                While rdr.Read
                    pnlList.Add(Convert.ToInt32(rdr.Item("ID")))
                End While
            End Using           ' close, dispose of reader
        End Using               ' dispose of cmd

        ' not sure you need a new command object
        sql = "UPDATE LogTable2 SET pvvalue = @rVal WHERE ID = @id"

        Using pcmd As New OleDbCommand(sql, con)
            ' loop thru ID list and update each row with
            ' new random value 825-849 inclusive
            For n As Int32 = 0 To pnlList.Count - 1
                pcmd.Parameters.AddWithValue("@rVal", RNG.Next(825, 850))
                pcmd.Parameters.AddWithValue("@id", pnlList(n))
                pcmd.ExecuteNonQuery()
                ' clear for next iteration
                pcmd.Parameters.Clear()

            Next
        End Using                  ' close and dispose of pcmd
    End Using                      ' close and dispose of connection

End Sub

我不喜欢在每个打开连接的方法中散布连接字符串,所以a method for that很高兴。

注意:

  • 这取决于唯一的ID列,即AutoIncrement(PK)。如果您有其他唯一标识符,请使用它,但您必须有一些方法来单独标识行。
  • 而不是创建随机值的方法,因为它只是一行,所以直接使用你的RNG可能更容易,如图所示。
  • 我无法测试代码,但它应该很接近。
  • 使用Using块关闭和处理DBObject,如连接,命令和阅读器,否则可能会耗尽资源。
  • 您可以在声明{和1}}对象时使用SQL和COnnection初始化它们,而不是将它们设置为属性。它使代码更紧凑,更不容易忘记它们。
  • Command什么都不做 - 它意味着与旧的VB6 Randomize一起使用。您只需要在SQL中使用[Escape]关键字,而不是每个列名,Rnd()不是关键字。
  • 可以使用pvvalue而不是DataTable来获取行,但我不确定它是否更简单。
  • 最后,SQL WHERE子句的元素也可以参数化;没有必要将它们连接起来只是因为它是一个地方而不是一个列值。

答案 1 :(得分:1)

您可以在数据库级别执行此操作,将自动增量值添加到数据库字段