事情是这样的。我的A表单。。弹出B表单。。B表单里是列表,当点击按钮后,会进行的操作如下:
1。update bbs set stat=1
2。重新读取bbs表,并填充自己的listview
3。SendMessage给A表单
这时候,A表单收到消息后,要做的操作:
4。读取bbs表里 stat=1的记录
5。显示出来。==================
这时候就出事了,在A的时候,死活也读不到第一条记录。而在读之前MsgBox一下,耽一二秒,就可以读得出。Debug了半天,发现貌似是B表单更新完了,可是A表单读的时候,仍然是老样子。(200%的确认B表单是更新完了的,因为B表单自己也要重新读取,并填充列表) 谁知道这是咋回事????????????///
1。update bbs set stat=1
2。重新读取bbs表,并填充自己的listview
3。SendMessage给A表单
这时候,A表单收到消息后,要做的操作:
4。读取bbs表里 stat=1的记录
5。显示出来。==================
这时候就出事了,在A的时候,死活也读不到第一条记录。而在读之前MsgBox一下,耽一二秒,就可以读得出。Debug了半天,发现貌似是B表单更新完了,可是A表单读的时候,仍然是老样子。(200%的确认B表单是更新完了的,因为B表单自己也要重新读取,并填充列表) 谁知道这是咋回事????????????///
DBManage.ExecuteSQL("update bbs set stat=1 where id in("+ids+")", dbm.Connection);
//这里是更新B表单的列表(准确无误)
UpdateTaskList();
//这里是 SendMessage..............
callMainBeginWork();================================
A的表单:
if (mystr.lpData == "MainBeginWork")
{
//刷新数据库,得出等待=1的记录,准备循环打开。
Func.mySleep(1);
IDataReader dr = DBManage.GetDataReader("select * from bbs where stat=1 order by id asc", dbm.Connection);
while (dr.Read())
{--------------
这里 Func.mySleep 是自定义的休眠时间休息一秒,就可以运行无误了。但是会卡一下。
就这样简单的,就不行。while dr.read() 这里就是 false
我是直接SQL操作的。不是dataset
该语句会 行锁 --> 页锁 --> 表锁,更新资料量过大,会有可能导致表锁.2.根据1的情况,你读取的时候是否有加 with(nolock) 如果加了,就可能会造成脏读,所以A看到的资料还是老的.
因为你用Msgbox延迟了一下,可能锁被释放掉了.所以查询出来是更新的资料.(以上只是从给出语句判断)
帅哥,搞定了。我本来为了省资源。一个FORM里是一个全局的 DBMANAGER的。我也一直怀疑是不是因为速度太快,读了缓存的数据所以我在接受消息的函数中,重新定义个dbm,解决了~!这下子不用sleep了。哈。。感谢,,一直怀疑是这个缓存的事却没有想到,重新定义个dbm来用。太感谢了。
==========
也感谢其他热心的朋友们。结分。
默认设置时每次编译的时候都会复制一份access到生成目录下。所以在项目管理器里面选中access文件,右键属性,选择:永远不复制。
(发布程序的时候,根据需要,手动复制到生成目录)