Rafy 框架 - 执行SQL或存储过程
时间:2022-04-25
本文章向大家介绍Rafy 框架 - 执行SQL或存储过程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有时候,开发者不想通过实体来操作数据库,而是希望通过 SQL 语句或存储过程来直接访问数据库。Rafy 也提供了一组 API 来方便实现这类需求。
IDbAccesser 接口
为了尽量屏蔽各数据库中 SQL 语句参数的不同标识,同时也为了使开发者更简单地实现参数化的查询。Rafy 中提供了 IDbAccesser 接口来方便开发者使用。接口定义如下:
/// <summary>
/// A db accesser which can use formatted sql to communicate with data base.
/// </summary>
public interface IDbAccesser : IDisposable
{
/// <summary>
/// The underlying db connection
/// </summary>
IDbConnection Connection { get; }
/// <summary>
/// 数据连接结构
/// </summary>
DbConnectionSchema ConnectionSchema { get; }
/// <summary>
/// Gets a raw accesser which is oriented to raw sql and <c>IDbDataParameter</c>。
/// </summary>
IRawDbAccesser RawAccesser { get; }
/// <summary>
/// Execute a sql which is not a database procudure, return rows effected.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns>The number of rows effected.</returns>
int ExecuteText(string formattedSql, params object[] parameters);
/// <summary>
/// Execute the sql, and return the element of first row and first column, ignore the other values.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns>DBNull or value object.</returns>
object QueryValue(string formattedSql, params object[] parameters);
/// <summary>
/// Query out some data from database.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns></returns>
IDataReader QueryDataReader(string formattedSql, params object[] parameters);
/// <summary>
/// Query out some data from database.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="closeConnection">Indicates whether to close the corresponding connection when the reader is closed?</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns></returns>
IDataReader QueryDataReader(string formattedSql, bool closeConnection, params object[] parameters);
/// <summary>
/// Query out a row from database.
/// If there is not any records, return null.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns></returns>
DataRow QueryDataRow(string formattedSql, params object[] parameters);
/// <summary>
/// Query out a DataTable object from database by the specific sql.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns></returns>
DataTable QueryDataTable(string formattedSql, params object[] parameters);
/// <summary>
/// Query out a row from database.
/// If there is not any records, return null.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns></returns>
LiteDataRow QueryLiteDataRow(string formattedSql, params object[] parameters);
/// <summary>
/// Query out a DataTable object from database by the specific sql.
/// </summary>
/// <param name="formattedSql">a formatted sql which format looks like the parameter of String.Format</param>
/// <param name="parameters">If this sql has some parameters, these are its parameters.</param>
/// <returns></returns>
LiteDataTable QueryLiteDataTable(string formattedSql, params object[] parameters);
}
该接口使用类似于 String.Format 中的字符串格式来表达 SQL 中的参数。并在连接不同的数据库时,生成相应数据库对应的参数格式。
具体使用方法如下:
执行查询代码示例:
var bookRepo = RF.Concrete<BookRepository>();
using (var dba = DbAccesserFactory.Create(bookRepo))
{
DataTable table = dba.QueryDataTable("SELECT * FROM Books WHERE id > {0}", 0);
}
执行非查询代码示例:
var bookRepo = RF.Concrete<BookRepository>();
using (var dba = DbAccesserFactory.Create(bookRepo))
{
int linesAffected = dba.ExecuteText("DELETE FROM Books WHERE id > {0}", 0);
}
另外,DbAccesserFactory 中也提供了不通过仓库对象,而直接使用‘数据库连接的配置名’进行构建的方法,例如:
using (var dba = DbAccesserFactory.Create("JXC"))
{
int linesAffected = dba.ExecuteText("DELETE FROM Books WHERE id > {0}", 0);
}
参数过多时,则依次按顺序传入即可:
using (var dba = DbAccesserFactory.Create(bookRepo))
{
for (int i = 0; i < 10; i++)
{
dba.ExecuteText(
"INSERT INTO Book (Author,BookCategoryId,BookLocId,Code,Content,Name,Price,Publisher) VALUES ({0},{1},{2},{3},{4},{5},{6},{7})",
string.Empty,
null,
null,
string.Empty,
string.Empty,
i.ToString(),
null,
string.Empty
);
}
}
IRawDbAccesser 接口
由于 IDbAccesser 接口封装了 SQL 语句中参数对应不同数据库中名称的变化,同时也更方便开发者使用,所以一般情况下,都推荐使用该接口。但是,IDbAccesser 接口并不支持存储过程的调用。另外,有时开发者希望自己来构建原生的 SQL 语句和参数,这时,就需要用到 IRawDbAccesser 接口了。(接口定义过长,这里不再贴出。)
该接口的使用方法与 IDbAccesser 类似,不同的地方在于 SQL 中需要传入特定数据库的参数名,并且参数需要自行构造,例如:
using (var dba = DbAccesserFactory.Create(bookRepo))
{
for (int i = 0; i < 10; i++)
{
dba.RawAccesser.ExecuteText(
"INSERT INTO Book (Author,BookCategoryId,BookLocId,Code,Content,Name,Price,Publisher,Id) VALUES ('', NULL, NULL, '', '', :p0, NULL, '', :p1)",
dba.RawAccesser.ParameterFactory.CreateParameter("p0", i),
dba.RawAccesser.ParameterFactory.CreateParameter("p1", i)
);
}
}
另外,IRawDbAccesser 接口也可以使用存储过程了,例如:
using (var dba = DbAccesserFactory.Create(bookRepo))
{
for (int i = 0; i < 10; i++)
{
dba.RawAccesser.ExecuteProcedure(
"InsertBookProcedure",
dba.RawAccesser.ParameterFactory.CreateParameter("p0", i),
dba.RawAccesser.ParameterFactory.CreateParameter("p1", i)
);
}
}
PS:该文已经纳入《 Rafy 用户手册》中。
- Go实战--实现简单的restful api
- 特殊字体神器-fontmin,秒杀一切工具
- 庖丁解牛——深入解析委托和事件
- RestQL:现代化的 API 开发方式
- 在递归函数中因不正确使用公共变量而形成死循环
- 用R语言做时间序列分析(附数据集和源码)
- Windows Live Writer插入代码vs2010插件
- 分布式队列编程优化篇
- 基于机器学习方法的POI品类推荐算法
- 【Scikit-Learn 中文文档】多类和多标签算法 - 监督学习 - 用户指南 | ApacheCN
- 【Scikit-Learn 中文文档】新异类和异常值检测 - 无监督学习 - 用户指南 | ApacheCN
- Golang中使用echo框架、MongoDB、JWT搭建REST API
- 在对象的原型上添加方法?
- KMeans聚类算法思想与可视化
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php+lottery.js实现九宫格抽奖功能
- PHP实现一个按钮点击上传多个图片操作示例
- php实现 master-worker 守护多进程模式的实例代码
- Ubuntu 18.04 Server 设置静态IP 的办法
- PHP依赖注入容器知识点浅析
- centos克隆linux虚拟机的完整步骤分享
- laravel框架中间件简单使用方法示例
- PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
- Smarty模板语法详解
- PHP保留两位小数的几种方法
- PHP七种数据类型知识点总结
- PHP中__set()实例用法和基础讲解
- laravel框架分组控制器和分组路由实现方法示例
- 使用swoole 定时器变更超时未支付订单状态的解决方案
- Yii2 queue的队列使用详解