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 用户手册》中。
Rafy 框架 - 执行SQL或存储过程的更多相关文章
- 使用 ODBC .NET 提供程序和 Visual C# .NET 执行 SQL 参数化存储过程
http://support2.microsoft.com/kb/310130/zh-cn 此分步指导文章描述如何使用 ODBC .NET 托管提供程序和 Visual C# .Net 调用参数化 S ...
- ABP中连接已有数据库执行Sql或存储过程
一:在EntityFramework项目中创建类如:ZSWDbContext. public class ZSWDbContext : AbpDbContext { public ZSWDbConte ...
- Yii2.0调用sql server存储过程并获取返回值
1.首先展示创建sql server存储过程的语句,创建一个简单的存储过程,测试用. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE P ...
- string中执行sql语句
Spring(JdbcTemplate.class)中的queryForMap().queryForObject().queryForLong().queryForInt()等方法都会去调用publi ...
- Entity Framework——执行sql语句
EF版本:6.0.0 EF对大量数据或多表连接一次操作耗时较大,或要求响应时间尽可能小,因此采用EF框架执行SQL语句的方案 1DbContext.Database 这个类包含了大量的操作方法,见截图 ...
- 跨服务器执行SQL
--exec sp_helpserver 可以以存储过程形式执行以下: --1.1 创建登录信息(或叫创建链接服务器登录名映射)(只需选择一种方式) --1.1.1 以windows认证的方式登录 / ...
- Farseer.net轻量级开源框架 中级篇:执行SQL语句
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 下一篇:Farseer.net轻量级开源框架 中级篇: DbFacto ...
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
- SQL查询语句执行速度快,存储过程执行慢
今天一个生成10w条数据的存储过程执行了95s,但是单独执行SQL语句只需要28s,查资料后发现原来这是存储过程的机制导致的,也就是传说中的参数嗅探 网上的一段话: (1)可能是发生了参数嗅探,第一次 ...
随机推荐
- WPF 有用博客地址
增加智能感知的RichTextBox扩展控件(WPF) WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式.水印.Label标签. ...
- jQuery学习之路(3)- 事件
▓▓▓▓▓▓ 大致介绍 jQuery增加了并扩展了基本的事件处理机制,不但提供了更加优雅的事件处理语法,而且极大地增强了事件处理能力 ▓▓▓▓▓▓ jQuery中的事件 ▓▓▓▓▓▓ 加载DOM 在j ...
- PHP设计模式(二)工厂方法模式(Factory Method For PHP)
简单工厂简述: 简单工厂模式实现了生产产品类的代码跟客户端代码分离,在工厂类中你可以添加需要生成长跑的逻辑代码(new 产品类),但是问题来了,优秀的代码是符合"开闭原则"如果你要 ...
- git 命令总结
1 删除分支 git push origin :branch name(Task_******) //删除远程分支 git branch -D branch name(Task_******) ...
- SMBus set up a 2-byte EEPROM address for read/write
Sequencer Engine spec: http://www.analog.com/media/en/technical-documentation/data-sheets/ADM1260.pd ...
- SQLServer2005创建定时作业任务
SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
- 关于sqlmap的使用
好记性不如烂笔头,记录一下. 带cookie的注入 python sqlmap.py -u "http://www.xxx.com?id=1" --cookie="coo ...
- 2DToolkit官方文档中文版打地鼠教程(三):Sprite Collections 精灵集合
这是2DToolkit官方文档中 Whack a Mole 打地鼠教程的译文,为了减少文中过多重复操作的翻译,以及一些无必要的句子,这里我假设你有Unity的基础知识(例如了解如何新建Sprite等) ...
- OAuth2 理解
OAth2 是为了某个应用向第三方应用开放服务时,控制权限的. 因为不可以直接将账户体系开放出去,要求重新登录. 其实本质是让用户在客户端来判断是否要给该应用开放平台的权限,如果用户同意,那么可以拿到 ...