我搜索了很多论坛,但没有找到任何解决方案。我想从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
答案 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)。如果您有其他唯一标识符,请使用它,但您必须有一些方法来单独标识行。Using
块关闭和处理DBObject,如连接,命令和阅读器,否则可能会耗尽资源。Command
什么都不做 - 它意味着与旧的VB6 Randomize
一起使用。您只需要在SQL中使用[Escape]关键字,而不是每个列名,Rnd()
不是关键字。pvvalue
而不是DataTable
来获取行,但我不确定它是否更简单。答案 1 :(得分:1)
您可以在数据库级别执行此操作,将自动增量值添加到数据库字段