VB ADO 处理数据库并发请求

VB ADO 处理数据库并发请求,第1张

给你一些参考希望对你有用。

程式包括“新增,删除,编辑,储存,取消和查询代码。

例如在Form中设置3个Textbox和5个CommandButton

分别为

Textbox=Date(txtdate),Items(txtitems),Price(txtprice).

CommandButton = 新增(cmdadd),储存(cmdsave),删除(cmddelete),

取消新增(cmdcancel),编辑(cmdedit).

以下三段写在General(一般)事件里

Dim cn As New ADODB.Connection

Dim rs As New ADODB.Recordset

Dim mode as string

Private Sub Form_Load()

cn.ConnectionString = "provider=Microsoft.jet.OLEDB.4.0" &_

"Persist security info= FalseData source=" &App.Path &"\daily.mdb"

cn.Open

rs.CursorLocation = adUseClient

rs.Open "Daily", cn, adOpenKeyset, adLockPessimistic (Daily为Access 资料表名)

For i = 0 To rs.Fields.Count - 1

List1.AddItem rs.Fields(i).Name

Next i

End Sub

以下自作函数以便文本栏显示资料表资料

Sub LoadControls()

If rs.BOF = False And rs.EOF = False Then

txtdate = rs.Fields("Date")

txtitems = rs.Fields("Items")

txtprice = rs.Fields("Price")

End If

End Sub

以下为新增按钮代码

Private Sub cmdadd_Click()

mode = "add"

txtdate.Text = CStr(Date) (显示系统今天日期)

txtitems.SetFocus

txtitems = ""

txtprice = ""

End Sub

以下为编辑按钮代码

Private Sub cmdedit_Click()

mode = "edit"

Call LoadControls

txtdate.SetFocus

End Sub

以下为删除按钮代码

Private Sub cmddelete_Click()

If rs.EOF = False Then

X = MsgBox("Do you want to delete this record", vbExclamation + vbYesNo)

If X = vbYes Then

rs.Delete

rs.Requery

Call LoadControls

Else

Exit Sub

End If

End If

End Sub

以下为储存按钮代码

Private Sub cmdsave_Click()

If mode = "add" Then

rs.AddNew

rs.Fields("Date") = txtdate

rs.Fields("Items") = txtitems

rs.Fields("Price") = txtprice

rs.Update

MsgBox "Successfully Save Data", vbInformation + vbOKOnly

rs.Requery

txtdate.SetFocus

Call LoadControls

Exit Sub

End If

End Sub

If mode = "edit" Then

rs.Fields("Date") = txtdate

rs.Fields("Items") = txtitems

rs.Fields("Price") = txtprice

rs.Update

MsgBox "Successfully Save Data", vbInformation + vbOKOnly

rs.Requery

txtdate.SetFocus

Call LoadControls

Exit Sub

End If

以下为取消新增按钮代码

Private Sub Cmdcancel_Click()

Call LoadControls

End Sub

-------------------------------

查询:

在form加上1个Textbox,1个commmandbutton和1个Listbox

Textbox=txtfind

CommandButton=cmdsearch

ListBox=List1

可查询日期,文字和数字.

Private Sub cmdsearch_Click()

Select Case rs.Fields(List1.ListIndex).Name

Case "Items"

SQL = "select * from Table Name where Items=" &"'" &txtfind.Text &"'"

Case "Price"

SQL = "select * from Table Name where Price=" &txtfind.Text

Case "Date"

SQL = "select * from Table Name where Date = #" &txtfind.Text &"#"

End Select

If rs.State = adStateOpen Then rs.Close

rs.Open SQL, cn, adOpenStatic, adLockOptimistic

End Sub

你问的应该是数据库并发吧。

数据库事务并发带来的问题

数据库事务并发带来的问题有:更新丢失、脏读、不可重复读、幻象读。假设张三办了一张招商yhk,余额100元,分别说明上述情况。

1、更新丢失:一个事务的更新覆盖了另一个事务的更新。事务A:向yhk存钱100元。事务B:向yhk存钱200元。A和B同时读到yhk的余额,分别更新余额,后提交的事务B覆盖了事务A的更新。更新丢失本质上是写 *** 作的冲突,解决办法是一个一个地写。

2、脏读:一个事务读取了另一个事务未提交的数据。事务A:张三妻子给张三转账100元。事务B:张三查询余额。事务A转账后(还未提交),事务B查询多了100元。事务A由于某种问题,比如超时,进行回滚。事务B查询到的数据是假数据。脏读本质上是读写 *** 作的冲突,解决办法是写完之后再读。

3、不可重复读:一个事务两次读取同一个数据,两次读取的数据不一致。事务A:张三妻子给张三转账100元。事务B:张三两次查询余额。事务B第一次查询余额,事务A还没有转账,第二次查询余额,事务A已经转账了,导致一个事务中,两次读取同一个数据,读取的数据不一致。不可重复读本质上是读写 *** 作的冲突,解决办法是读完再写。

4、幻象读:一个事务两次读取一个范围的记录,两次读取的记录数不一致。事务A:张三妻子两次查询张三有几张yhk。事务B:张三新办一张yhk。事务A第一次查询yhk数的时候,张三还没有新办yhk,第二次查询yhk数的时候,张三已经新办了一张yhk,导致两次读取的yhk数不一样。幻象读本质上是读写 *** 作的冲突,解决办法是读完再写。

以上转自:http://www.cnblogs.com/nzbbody/archive/2012/08/29/2661689.html

===============

解决方案:

简单的方案就是每个sql执行过程中都加上一个事物,这样能控制表的并发,但是执行过程中会比较慢。

复杂就是建一个数据库连接,然后进行并发访问控制(lock住),每次数据库读写前都进行数据库连接的获取,用完再释放,期间别的访问过来都会强制等待。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9645729.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存