欢迎投稿

今日深度:

异步的 SQL 数据库封装(1)(2)

异步地使用代码

假使你不希望调用线程被查询阻塞,你需要周期性地调用 `WaitSqlCompletes` 来检查查询是否完成,执行是否失败。

  1. /// <summary> 
  2. /// 你需要周期性地调用WaitSqlCompletes(userData, 10)  
  3. /// 来查看结果是否可用! 
  4. /// </summary> 
  5. public StoredProcedureCallbackResult MyStoreProcedureASYNC(int param1, string param2) 
  6.     // Create user data according to return type of store procedure in SQL 
  7.     StoredProcedureCallbackResult userData = new StoredProcedureCallbackResult(eRequestType.Reader); 
  8.       
  9.     // If your store procedure accepts some parameters, define them here,  
  10.     // or you can omit it incase there is no parameter definition 
  11.     userData.Parameters = new System.Data.SqlClient.SqlParameter[] {  
  12.         new System.Data.SqlClient.SqlParameter("@param1", param1), 
  13.         new System.Data.SqlClient.SqlParameter("@param2", param2), 
  14.     }; 
  15.       
  16.     // Execute procedure... 
  17.     if (!ExecuteStoredProcedure("usp_MyStoreProcedure", userData)) 
  18.         throw new Exception("Execution failed"); 
  19.           
  20.     return userData; 

在调用线程中你需要这样做:

  1. ... 
  2. DAL.StoredProcedureCallbackResult userData = myDal.MyStoreProcedureASYNC(10,"hello"); 
  3. ... 
  4. // each time we wait 10 milliseconds to see the result... 
  5. switch(myDal.WaitSqlCompletes(userData, 10)) 
  6. case eWaitForSQLResult.Waiting: 
  7.   goto WAIT_MORE; 
  8. case eWaitForSQLResult.Success: 
  9.   goto GET_THE_RESULT; 
  10. default
  11.   goto EXECUTION_FAILED; 
  12. ... 

数据库状态

在 BLL 中只有一个异步地提供数据库状态的事件。如果数据库连接被断开了(通常是由于网络问题),OnDatabaseStatusChanged 事件就会被挂起。

另外,如果连接恢复了,这个事件会被再次挂起来通知你新的数据库状态。

有趣的地方

在我开发代码的时候,我明白了连接字符串中的连接时限connection timeout)和SQL命令对象的执行时限execution timeout)同样重要。

首先,你必须意识到最大容许时限是在连接字符串中定义的,并可以给出一些执行指令比连接字符串中的超时时间更长的时间。

其次,每一个命令都有着它们自己的执行时限,在这里的代码中默认为30秒。你可以很容易地修改它,使它适用于所有类型的命令,就像这样:

  1. userData.tsWaitForResult = TimeSpan.FromSeconds(15); 




www.htsjk.Com true http://www.htsjk.com/shujukukf/17672.html NewsArticle 异步地使用代码 假使你不希望调用线程被查询阻塞,你需要周期性地调用 `WaitSqlCompletes` 来检查查询是否完成,执行是否失败。 ///summary ///你需要周期性地...
评论暂时关闭