异步的SQL数据库封装
作者:网络转载 发布时间:[ 2015/4/14 13:53:22 ] 推荐标签:数据库 SQL 异步 封装
在这个例子中,我们调用`ExecuteSQLStatement`直接执行了一个SQL查询,但思想跟`ExecuteStoredProcedure`是一样的。
我们使用`resultDataReader`的`.Read()`方法来迭代处理返回的结果集。另外提供了一些helper方法来避免叠代中由于NULL字段、GetIntValueOfDBField等引起的异常。
如果你要执行SQL命令而不是存储过程,需要传入ExecuteSQLStatement的userData有三类:
ReaderQueryCallbackResult userData;
适用于有返回recordset的语句,可以通过userData.resultDataReader获得对返回的recordset的访问。
NonQueryCallbackResult userData
适用于像UPDATE这种没有返回内容的语句,可以使用userData.AffectedRows检查执行的结果。
ScalarQueryCallbackResult userData
用于查询语句只返回一个标量值的情况,例如`SELECT code FROM tbl WHEN ID=10`,通过userData.ScalarValue取得返回的结果。
对于存储过程,只有一种需要传入ExecuteStoredProcedure的数据类型。但在声明变量时你需要指明存储过程的返回值类型:
StoredProcedureCallbackResult userData(eRequestType)
除了声明不同外,其他操作与上面相同。
异步地使用代码
假使你不希望调用线程被查询阻塞,你需要周期性地调用`WaitSqlCompletes`来检查查询是否完成,执行是否失败。
///<summary>
///你需要周期性地调用WaitSqlCompletes(userData,10)
///来查看结果是否可用!
///</summary>
public StoredProcedureCallbackResult MyStoreProcedureASYNC(int param1,string param2)
{
//Create user data according to return type of store procedure in SQL
StoredProcedureCallbackResult userData=new StoredProcedureCallbackResult(eRequestType.Reader);
//If your store procedure accepts some parameters,define them here,
//or you can omit it incase there is no parameter definition
userData.Parameters=new System.Data.SqlClient.SqlParameter[]{
new System.Data.SqlClient.SqlParameter("@param1",param1),
new System.Data.SqlClient.SqlParameter("@param2",param2),
};
//Execute procedure...
if(!ExecuteStoredProcedure("usp_MyStoreProcedure",userData))
throw new Exception("Execution failed");
return userData;
}
在调用线程中你需要这样做:
...
DAL.StoredProcedureCallbackResult userData=myDal.MyStoreProcedureASYNC(10,"hello");
...
//each time we wait 10 milliseconds to see the result...
switch(myDal.WaitSqlCompletes(userData,10))
{
case eWaitForSQLResult.Waiting:
goto WAIT_MORE;
case eWaitForSQLResult.Success:
goto GET_THE_RESULT;
default:
goto EXECUTION_FAILED;
}
...
数据库状态
在BLL中只有一个异步地提供数据库状态的事件。如果数据库连接被断开了(通常是由于网络问题),OnDatabaseStatusChanged事件会被挂起。
另外,如果连接恢复了,这个事件会被再次挂起来通知你新的数据库状态。
有趣的地方
在我开发代码的时候,我明白了连接字符串中的连接时限(connection timeout)和SQL命令对象的执行时限(execution timeout)同样重要。
首先,你必须意识到大容许时限是在连接字符串中定义的,并可以给出一些执行指令比连接字符串中的超时时间更长的时间。
其次,每一个命令都有着它们自己的执行时限,在这里的代码中默认为30秒。你可以很容易地修改它,使它适用于所有类型的命令,像这样:
userData.tsWaitForResult=TimeSpan.FromSeconds(15);
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
在测试数据库性能时,需要注意哪些方面的内容?测试管理工具TC数据库报错的原因有哪些?怎么解决?数据库的三大范式以及五大约束编程常用的几种时间戳转换(java .net 数据库)优化mysql数据库的几个步骤数据库并行读取和写入之Python实现深入理解数据库(DB2)缓冲池(BufferPool)国内三大云数据库测试对比预警即预防:6大常见数据库安全漏洞数据库规划、设计与管理数据库-事务的概念SQL Server修改数据库物理文件存在位置使用PHP与SQL搭建可搜索的加密数据库用Python写一个NoSQL数据库详述 SQL 中的数据库操作详述 SQL 中的数据库操作Java面试准备:数据库MySQL性能优化

sales@spasvo.com