查看: 482|回复: 2

数据库异步操作(ADODB).

 关闭 [复制链接]

签到天数: 2090 天

连续签到: 2 天

[LV.Master]伴坛终老IIII

发表于 2009-6-28 14:30 | 显示全部楼层 |阅读模式
数据库异步操作(ADODB).



异步执行数据库操作
在VC或VB中需要耗时的查询时,客户一般需要等待很长一段时间, 这种情况客户是无法容忍而且也无法取消, 那么怎样么办呢.

1.首先采用多线程的方式, 工作线程与UI线程分开, 工作线程处理完毕时向主线程发消处理完毕的消息;另一种方法采用向窗口发送消息. 注意这里是寄送的方式,不要问我为什么, 我也不会告诉你.简而言之,

PostThreadMessae与PostMessage两个API函数,当然你得传递参数或者使用全局变量也可以.

2.SQL语句的执行.大家知道(也许你还有可能没有使用过, 那赶紧用吧,免得你的客户骂你),在ADODB的三个对象中Connection, Recordset, Command都支持异步的方式(别告诉我你不晓得, 反正我也不会告诉你的),在其参数

Options中使用adAsyncExecute ( 0x10) , 这样你执行命查询或返回记录集时都是以异步方式,换句话说就是盖子帮你另外开了个线程处理。

注意:通常创建一个线程要等待其结束,因为我们有可能要实现等待用户取消执行, 所以。。。。。,另外可以通过判断对象的状态是:Connection的状态是否为adStateOpen(当然是你正确连接到数据源,否则我就要打你PP), 知道如何做了吧;另外一种就通过事件通知, ExecuteComplete(看MSDN去), 要实现客户端通知(得懂COM知道, 具体的也看书去吧或者我下次有空再写出来)。

哈哈, 这样就实现了异步执行查询了哈, 不要告诉我你发现了新大陆或者说你知道的再者我说错的敬请赐教。

一段示例:

_ConnecctionPtr pCon;

if(FAILED(pCon.CreateInstance(\"ADODB.CONNECTION\"))) return FALSE;

pCon->Open(\"Provider=SQLOLEDB;UID=SA;PWD=;\", \"\", \"\", adOpenUnspecified /*这里用adAsyncExecute也可以实现异步方式,对应的事件是ConnectionComplete);

while(TRUE)

{

if(bCancel)

{

pCon->Cancel(); //一定要执行,否则出现异常不关我的事情,因为你拿了人家的东西迟早要还的。

return FALSE;

}

if(pCon->adState == adStateOpen) break;// 处理完了哈,该退出了。

Sleep(0);//一定要执行这条语句,否则盖子的工作效率低哈,为啥子要使用0去看MSDN。



}
PCOS系统下载站:http://zhuangji.wang

签到天数: 2090 天

连续签到: 2 天

[LV.Master]伴坛终老IIII

 楼主| 发表于 2009-6-28 14:30 | 显示全部楼层

数据库异步操作(ADODB).

数据库异步操作(ADODB).



异步执行数据库操作
在VC或VB中需要耗时的查询时,客户一般需要等待很长一段时间, 这种情况客户是无法容忍而且也无法取消, 那么怎样么办呢.

1.首先采用多线程的方式, 工作线程与UI线程分开, 工作线程处理完毕时向主线程发消处理完毕的消息;另一种方法采用向窗口发送消息. 注意这里是寄送的方式,不要问我为什么, 我也不会告诉你.简而言之,

PostThreadMessae与PostMessage两个API函数,当然你得传递参数或者使用全局变量也可以.

2.SQL语句的执行.大家知道(也许你还有可能没有使用过, 那赶紧用吧,免得你的客户骂你),在ADODB的三个对象中Connection, Recordset, Command都支持异步的方式(别告诉我你不晓得, 反正我也不会告诉你的),在其参数

Options中使用adAsyncExecute ( 0x10) , 这样你执行命查询或返回记录集时都是以异步方式,换句话说就是盖子帮你另外开了个线程处理。

注意:通常创建一个线程要等待其结束,因为我们有可能要实现等待用户取消执行, 所以。。。。。,另外可以通过判断对象的状态是:Connection的状态是否为adStateOpen(当然是你正确连接到数据源,否则我就要打你PP), 知道如何做了吧;另外一种就通过事件通知, ExecuteComplete(看MSDN去), 要实现客户端通知(得懂COM知道, 具体的也看书去吧或者我下次有空再写出来)。

哈哈, 这样就实现了异步执行查询了哈, 不要告诉我你发现了新大陆或者说你知道的再者我说错的敬请赐教。

一段示例:

_ConnecctionPtr pCon;

if(FAILED(pCon.CreateInstance(\"ADODB.CONNECTION\"))) return FALSE;

pCon->Open(\"Provider=SQLOLEDB;UID=SA;PWD=;\", \"\", \"\", adOpenUnspecified /*这里用adAsyncExecute也可以实现异步方式,对应的事件是ConnectionComplete);

while(TRUE)

{

if(bCancel)

{

pCon->Cancel(); //一定要执行,否则出现异常不关我的事情,因为你拿了人家的东西迟早要还的。

return FALSE;

}

if(pCon->adState == adStateOpen) break;// 处理完了哈,该退出了。

Sleep(0);//一定要执行这条语句,否则盖子的工作效率低哈,为啥子要使用0去看MSDN。



}
PCOS系统下载站:http://zhuangji.wang

签到天数: 2090 天

连续签到: 2 天

[LV.Master]伴坛终老IIII

 楼主| 发表于 2009-6-28 14:30 | 显示全部楼层

数据库异步操作(ADODB).

数据库异步操作(ADODB).



异步执行数据库操作
在VC或VB中需要耗时的查询时,客户一般需要等待很长一段时间, 这种情况客户是无法容忍而且也无法取消, 那么怎样么办呢.

1.首先采用多线程的方式, 工作线程与UI线程分开, 工作线程处理完毕时向主线程发消处理完毕的消息;另一种方法采用向窗口发送消息. 注意这里是寄送的方式,不要问我为什么, 我也不会告诉你.简而言之,

PostThreadMessae与PostMessage两个API函数,当然你得传递参数或者使用全局变量也可以.

2.SQL语句的执行.大家知道(也许你还有可能没有使用过, 那赶紧用吧,免得你的客户骂你),在ADODB的三个对象中Connection, Recordset, Command都支持异步的方式(别告诉我你不晓得, 反正我也不会告诉你的),在其参数

Options中使用adAsyncExecute ( 0x10) , 这样你执行命查询或返回记录集时都是以异步方式,换句话说就是盖子帮你另外开了个线程处理。

注意:通常创建一个线程要等待其结束,因为我们有可能要实现等待用户取消执行, 所以。。。。。,另外可以通过判断对象的状态是:Connection的状态是否为adStateOpen(当然是你正确连接到数据源,否则我就要打你PP), 知道如何做了吧;另外一种就通过事件通知, ExecuteComplete(看MSDN去), 要实现客户端通知(得懂COM知道, 具体的也看书去吧或者我下次有空再写出来)。

哈哈, 这样就实现了异步执行查询了哈, 不要告诉我你发现了新大陆或者说你知道的再者我说错的敬请赐教。

一段示例:

_ConnecctionPtr pCon;

if(FAILED(pCon.CreateInstance(\"ADODB.CONNECTION\"))) return FALSE;

pCon->Open(\"Provider=SQLOLEDB;UID=SA;PWD=;\", \"\", \"\", adOpenUnspecified /*这里用adAsyncExecute也可以实现异步方式,对应的事件是ConnectionComplete);

while(TRUE)

{

if(bCancel)

{

pCon->Cancel(); //一定要执行,否则出现异常不关我的事情,因为你拿了人家的东西迟早要还的。

return FALSE;

}

if(pCon->adState == adStateOpen) break;// 处理完了哈,该退出了。

Sleep(0);//一定要执行这条语句,否则盖子的工作效率低哈,为啥子要使用0去看MSDN。



}
PCOS系统下载站:http://zhuangji.wang

本版积分规则