【问题标题】:Auto update access tables Cells with random numbers from vb.net使用来自 vb.net 的随机数自动更新访问表单元格
【发布时间】:2015-11-16 03:04:41
【问题描述】:

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

[PanelNumber],[Date], [PVValue]

在面板编号字段中,有一些文本,如“面板 1”、“面板 2”等。 从vb,我将在单击按钮后选择“面板1”,我需要用给定范围内的随机数填充“PVValue”字段,请检查下面的代码,当我尝试使用此代码时,我总是得到相同所有行中的数字 但需要单独的数字(可能在某些行中重复) 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

【问题讨论】:

  • 如何将 Randomize() 调用传递给函数?我不确定它是否能解决问题,但代码至少看起来会更清晰。
  • @Philippe Grondier ,我也尝试在 GetRandom 函数中使用 Randomize() ,但仍然为所有行获得相同的随机数,请提供其他建议..
  • 在您的主进程中,添加一个将保存随机值的变量,并在调用 AddWithValue 方法之前显示它。然后,您可以控制问题是来自 GetRandom 函数(我怀疑)还是对 AddWithValue 方法的调用。
  • 不,GetRandom 函数运行良好,我尝试在该表单中添加 2 个字段,然后运行良好,问题仅在更新命令中。假设该表中有 5 行具有该条件,那么该更新命令将被调用 5 次,可能是这样解决的 :(
  • 如果您的查询更新多行,它们都将获得相同的随机数,因为它一个影响多行的查询。如果您希望每一行具有不同的随机值,则需要循环并一次更新它们。还有,Randomize这里什么都不做,panelnumber也应该是查询参数

标签: vb.net ms-access


【解决方案1】:

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

【讨论】:

  • 是的,但我不需要自动递增,我只需要随机数
  • 已经尝试了很多这样的例子,但仍然在所有行中使用相同的随机数进行更新
【解决方案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,否则可能会耗尽资源。
  • 您还可以在声明Command 对象时使用SQL 和CONnection 对其进行初始化,而不是将它们设置为属性。它使代码更加紧凑,并且您不太可能忘记它们。
  • Randomize 什么都不做 - 它旨在与旧的 VB6 Rnd() 一起使用。 SQL中只需要[Escape]关键字,不是每个列名,pvvalue不是关键字。
  • 可以使用DataTable 而不是Reader 来获取行,但我不确定它是否更简单。
  • 最后,SQL WHERE 子句的元素也可以参数化;无需仅仅因为它是 where 而不是列值而将它们连接起来。

【讨论】:

  • 非常感谢,工作完美
  • 好的,知道了,再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2021-01-04
  • 2014-12-25
  • 1970-01-01
  • 2016-11-07
  • 2021-03-02
相关资源
最近更新 更多