在PageLoad事件中这样绑定了Repeater事件:

            DataSet dsComments = esolution_proxyserverbbs_dataaccess.GetProxyServerBbsByNum( 3 ); //显示最新3条记录
            this.rptComments.DataSource = dsComments;
            
this.rptComments.DataBind();

然后在“确定”按钮事件中向数据库中添加了记录,然后执行下面的代码:

            //因为btnSubmit函数的执行在Page_Load之后,所以需要重新绑定Repearter才能显示最新的数据
            DataSet dsComments = new DataSet();
            dsComments 
= esolution_proxyserverbbs_dataaccess.GetProxyServerBbsByNum( 3 );
            
this.rptComments.DataSource = dsComments;
            
this.rptComments.DataBind();


结果在点击"确定"按钮后,新添加的记录并没有显示出来,而是再点击按钮或者用其他方法使页面回传以后新添加的记录才能显示出来。

我跟踪了一下,发现“确定”按钮中的绑定代码确实被执行了

看来只有Page_Load中的绑定代码起了作用,而按钮处理事件中的代码没有起作用,到底是为什么那?难道Repeater控件就是这样的? 



让人吃惊的新进展!
在两处
   this.rptComments.DataSource = dsComments;
上都加了断点,然后进行调试,结果竟然正常了,也就是说能够马上显示出来了,难道是因为在插入数据后马上读取就读取不到最新的数据,怎么会这样那?我用的是Access数据库,插入一条数据就这样慢?那么该怎么样进行处理那?



我把代码按钮的响应代码改成这样的:

            //插入数据库
            ESolution_ProxyServerBBS_DataAccess esolution_proxyserverbbs_dataaccess = new ESolution_ProxyServerBBS_DataAccess();
            
int iReturn = esolution_proxyserverbbs_dataaccess.AppendProxyServerBBS( username , comment , posttime , ip );

            
if( iReturn > 0 )
            {
                
//因为btnSubmit函数的执行在Page_Load之后,所以需要重新绑定Repearter才能显示最新的数据
                DataSet dsComments = new DataSet();
                dsComments 
= esolution_proxyserverbbs_dataaccess.GetProxyServerBbsByNum( 3 );
                
this.rptComments.DataSource = dsComments;
                
this.rptComments.DataBind();
                PromptMessageJS.PromptMessage( 
this.Page , "执行到了这里" );
            }

点击按钮后,弹出“执行到了这里”的提示,说明了两个问题
 (1) 插入语句返回的受影响的行数大于0,也就是数据已经被成功的插入了
(2)  重新绑定repeater的代码已经被执行了

可是结果还是会延迟一次显示。



我尝试加了一条线程休眠语句,代码变成这样:

            //插入数据库
            ESolution_ProxyServerBBS_DataAccess esolution_proxyserverbbs_dataaccess = new ESolution_ProxyServerBBS_DataAccess();
            esolution_proxyserverbbs_dataaccess.AppendProxyServerBBS( username , comment , posttime , ip );
            
            
//让进程停止1秒,等待插入数据完成
            System.Threading.Thread.Sleep( 1000 );

            
//因为btnSubmit函数的执行在Page_Load之后,所以需要重新绑定Repearter才能显示最新的数据
            DataSet dsComments = new DataSet();
            dsComments 
= esolution_proxyserverbbs_dataaccess.GetProxyServerBbsByNum( 3 );
            
this.rptComments.DataSource = dsComments;
            
this.rptComments.DataBind();

结果还是一样。

我把调试的断点改一下,不在插入和读取之间插入断点,结果就不正确了,还是出现延时一次显示。
从这里可以看出,确实是设在插入和读取之间的断点起了作用,但是为什么使用(1)线程休眠语句(2)判断影响的记录条数 的方法都不行那?

以下是来自csdn  fangxinggood(JustACoder) 的建议:

这个问题我遇到过,原因是两次绑定的时候,上一次的数据连结没有关闭。
也就是你的Insert之后没有立即关闭连结。(关闭连结的代码在DataAdapter.Fill之前)
楼主请仔细检查。


我检查了一下,果然在Insert语句之后没有关闭连接
把连接关闭以后,运行就正常了
看来.net的数据操作虽然封装的很好了,但是有些地方还是需要自己处理一下的
不然就会出现我这样的错误了


另外还有不明白的地方就是为什么在调试的时候如果在插入和读取之间加上断点就能及时显示数据,而在运行的时候就要延迟一次。

ADO.net到底在下面搞了什么东东?


2006-2-24日:
在运行一个程序的时候发现了之所以在链接没有断开的时候其他的连接查询不到最新的一条记录,这个性质有一个好处,就是不会造成数据库并发错误,比如,当一个用户插入一条记录,他可能马上需要进行另外一个查询以获得最新的ID号,这个特性保证了他查询出来的是他最新插入的一条记录的ID号,而不会是两次查询之间其他用户插入的记录的ID号。

posted on 2006-02-13 13:23  今夜太冷  阅读(1607)  评论(1编辑  收藏  举报