位置: 编程技术 - 正文

异步的SQL数据库封装详解(数据库 异步)

编辑:rootadmin

推荐整理分享异步的SQL数据库封装详解(数据库 异步),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:异步的sql数据库有哪些,异步mysql,数据库 异步,数据库异步io,数据库异步io,sql异步执行,异步的sql数据库是什么,异步的sql数据库有哪些,内容如对您有帮助,希望把文章链接给更多的朋友!

引言

我一直在寻找一种简单有效的库,它能在简化数据库相关的编程的同时提供一种异步的方法来预防死锁。

我找到的大部分库要么太繁琐,要么灵活性不足,所以我决定自己写个。

使用这个库,你可以轻松地连接到任何 SQL-Server 数据库,执行任何存储过程或 T-SQL 查询,并异步地接收查询结果。这个库采用 C# 开发,没有其他外部依赖。

背景

你可能需要一些事件驱动编程的背景知识,但这不是必需的。

使用

这个库由两个类组成:

1、BLL (Business Logic Layer) 提供访问MS-SQL数据库、执行命令和查询并将结果返回给调用者的方法和属性。你不能直接调用这个类的对象,它只供其他类继承.2、DAL (Data Access Layer) 你需要自己编写执行SQL存储过程和查询的函数,并且对于不同的表你可能需要不同的DAL类。首先,你需要像这样创建 DAL 类:

由于BLL类维护着处理异步查询的线程,你需要提供必要的数据来拼接连接字符串。千万别忘了调用`Stop`函数,否则析构函数会强制调用它。

NOTE:如果需要连接其他非MS-SQL数据库,你可以通过修改BLL类中的`CreateConnectionString`函数来生成合适的连接字符串。

为了调用存储过程,你应该在DAL中编写这种函数:

异步的SQL数据库封装详解(数据库 异步)

正如你所看到的,存储过程的返回值类型可以是`Scalar`,`Reader`和`NonQuery`。对于 `Scalar`,`userData`的`ScalarValue`参数有意义(即返回结果);对于`NonQuery`,`userData`的 `AffectedRows`参数就是受影响的行数;对于`Reader`类型,`ReturnValue`就是函数的返回值,另外你可以通过 `userData`的`resultDataReader`参数访问recordset。

再看看这个示例:

在这个例子中,我们调用 `ExecuteSQLStatement` 直接执行了一个SQL查询,但思想跟 `ExecuteStoredProcedure` 是一样的。

我们使用 `resultDataReader` 的 `.Read()` 方法来迭代处理返回的结果集。另外提供了一些helper方法来避免叠代中由于NULL字段、GetIntValueOfDBField 等引起的异常。

如果你要执行 SQL 命令而不是存储过程,需要传入 ExecuteSQLStatement 的 userData 有三类:

1、ReaderQueryCallbackResult userData:适用于有返回recordset的语句,可以通过userData.resultDataReader获得对返回的recordset的访问。2、NonQueryCallbackResult userData:适用于像UPDATE这种没有返回内容的语句,可以使用userData.AffectedRows检查执行的结果。3、ScalarQueryCallbackResult userData:用于查询语句只返回一个标量值的情况,例如`SELECT code FROM tbl WHEN ID=`,通过userData.ScalarValue 取得返回的结果。对于存储过程,只有一种需要传入 ExecuteStoredProcedure 的数据类型。但在声明变量时你需要指明存储过程的返回值类型:

StoredProcedureCallbackResult userData(eRequestType):除了声明不同外,其他操作与上面相同。异步地使用代码

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

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

数据库状态

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

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

有趣的地方

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

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

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

标签: 数据库 异步

本文链接地址:https://www.jiuchutong.com/biancheng/347391.html 转载请保留说明!

上一篇:sql语句实现四种九九乘法表(sql四种功能)

下一篇:SQL Server 2016 CTP2.3 的关键特性总结

  • 增值税发票平台怎么下载已认证发票
  • 借递延所得税资产贷其他综合收益
  • 购进货物支付的运输费用如何计算增值税
  • 不能抵扣的增值税进项税额是什么
  • 财务报表没申报以后可不可以补申报
  • 街道办事处发票抬头写什么
  • 微信转账报销怎么转换成文字
  • 公司单位性质怎样填写
  • 其他业务支出是
  • 非货币性资产交换固定资产清理
  • 销售商品房属于什么税
  • 税控盘服务费怎么填写申报表
  • 存货账面价值等于成本吗
  • 上市公司发行股票可以自行销售吗
  • 房屋租赁违法
  • 出口退税总是差进项票怎么处理
  • 土地增值税预缴税率
  • 民非企业补贴收入要缴纳增值税会计分录怎么写?
  • 客运服务是指
  • 处于成熟期的企业其预算模式的特点是以什么为起点
  • 购买方红字信息表开具流程图
  • 银行对账单不平衡
  • 挂靠别人的施工单位资质,要交什么税?
  • 房地产开发公司注册资金要求
  • 公司理财取得的成果
  • 理财认购申购
  • win7怎么转移桌面到d盘
  • windows11不显示桌面
  • windos10不显示桌面
  • 出纳员交接工作
  • 银行与银行之间转账会计摘要
  • php拼接url
  • 删除桌面上的图标用什么键
  • 待摊费用从当月摊销还是下月摊销
  • 出售低值易耗品的账务处理
  • 预付购买材料款会引起会计等式
  • 楼房贷款需要什么手续没有银行流水怎么办
  • 退款后发票如何查询
  • 阿里云onedata
  • yii2-admin
  • 本年利润借方红字代表什么意思
  • 电梯销售公司利润
  • 租赁业务
  • dedecms安装步骤
  • 货物搬运费会计科目
  • 获取gridview某行某列的值
  • 企业内部交易如何操作
  • 银行存款属于其他收益吗
  • 个人所得税多计提怎样冲销
  • 交租金没有发票怎么办
  • 关联交易现金流
  • 厂房出租租金收税吗
  • 预提短期借款利息的会计科目
  • 预缴所得税年底怎么算
  • 贷内部往来
  • sqlserver sql日志
  • sqlserver合并脚本工具
  • win8语言栏不见了 怎么调出来
  • 3种不用重装的手机
  • 高端电脑品牌
  • xp系统如何获取ip地址
  • 苹果mac系统怎么用
  • 联想系统win8
  • 一招让你的wifi网速翻倍
  • schedul2.exe - schedul2是什么进程 有什么用
  • fpd文件是什么意思
  • linux 文件夹权限 777
  • 在vs中搭建opengl环境
  • js原型继承和构造继承
  • node.js报错
  • 图像unit8
  • python图片处理酷炫效果
  • 安卓开发
  • shell变量作用范围
  • unity she
  • 设备租赁增值税怎么抵扣
  • 出口退税企业的账务处理
  • 普惠性和非普惠的区别
  • 重庆税务总局重庆电子税务局
  • 混凝土搅拌站如何结转成本
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设