SqlContext文档
一、简介
SqlContext
是一个轻量级的Sql帮助类,旨在提供一种快速、简洁、优雅地数据库访问方法。
相比于重量级的EntityFramework
,SqlContext
非常轻量化,包括空行和注释,代码也不过几百行;而相对于ADO.Net
,SqlContext
又非常简洁、灵活和优雅,你可以以一种直观的方式来访问数据库,而不必关心其实现的细节。本质上,SqlContext
是对ADO.Net
的封装,ADO.Net
能做的事情SqlContext
都能做到。
SqlContext的基本功能:
- 支持任意 SQL
- 支持事务
- 支持简单的 ORM
- 支持多种数据库
- 自动管理连接,支持长连接和短连接
项目地址:点击此处
二、常用操作
1.CreateTable
SqlContext
是基于连接的,在使用SqlContext
之前必须先创建数据库连接,本文以SQLite
数据库为例介绍SqlContext
的使用方法。
var conn = new SQLiteConnection("Data Source=data.db;");
SqlContext的连接是自动管理的,你无需手动打开或关闭连接,SqlContext以下面的规则管理连接:
- 如果在执行Sql语句之前,数据库连接处于打开状态,则执行完毕后,保持打开状态
- 如果在执行Sql语句之前,数据库连接处于关闭状态,则打开连接,并在执行完毕后关闭连接
假设我们现在要创建名为user
的表(包含id
、name
、password
三个字段),采用ADO.Net
我们通常这样写:
conn.Open();
var command = conn.CreateCommand();
command.CommandText = "CREATE TABLE user(id integer primary key autoincrement,name varchar(32),password varchar(32))";
cmd.ExecuteNonQuery();
conn.Close();
而采用SqlContext
,我们只需要这样写:
conn.CreateTable("user", "id integer primary key autoincrement,name varchar(32),password varchar(32)").NonQuery();
在上面的代码中,我们隐藏了创建命令、打开连接和关闭连接等操作,同时也隐藏了"CREATE TABLE"这样的语法(因为我们只需关心表名、列名和类型即可)。
2.Insert
使用Insert
函数,我们可以快速的向指定的表中插入数据。下面的代码向user
表中插入一条记录,其中name='test'
,password='123456'
,由于id
是自增长的,因此无需手动设置。
conn.Insert("user", "name,password", "test", "123456").NonQuery();
在上面的代码中,参数是通过Insert
函数传递的,对于参数较多的情况,我们可以分开传递,如下:
conn.Insert("user", "name,password")
.Parameters("test", "123456")
.NonQuery();
也可以显示的指定参数(或数据类型),如下:
conn.Insert("user", "name,password")
.Parameter("name", "test")
.Parameter("password", "123456")
.NonQuery();
为了不引起混乱,建议只使用一种传参方式。
3.Select
使用Select
语句,我们可以快速的从指定的表中查询所需的记录。下面的代码从user
表中查询所有记录,并转为User
对象,如下:
var userList = conn.Select("user").Many(r => new User
{
Id = (long)r["id"],
Name = (string)r["name"],
Password = (string)r["password"]
});
SqlContext
采用延迟执行的机制,只有在调用下面的函数之一时才会真正的请求数据库:
NonQuery
,执行SQL
而不返回结果Many
,执行SQL
并返回多行结果Single
,执行SQL
并返回单行结果
SqlContext
支持简单的ORM
,只需在程序启动时注册一次Mapper
函数,以后就可以方便的提取数据了,注册Mapper
的代码如下:
SqlContext.RegistMapper(r => new User
{
Id = (long)r["id"],
Name = (string)r["name"],
Password = (string)r["password"]
});
之后,我们在调用Many
和Single
函数时,只需指明期望的数据类型即可,如下:
var userList = conn.Select("user").Many<User>();
4.UpdateSql
使用UpdateSql
语句,我们可以快速更新表中指定的记录。下面的代码找到user
表中id=0
的记录,并把password
更新为abc123
。
conn.UpdateSql("user","password","id=@id")
.Parameter("id",0)
.Parameter("password","abc123")
.NonQuery();
在上面的代码中,我们使用了where
语句,当然Select
、Delete
也都支持where
语句。
由于
DbConnection
类已经定义了一个名为Update
的函数,为了不引起冲突,更新操作命名为UpdateSql
5.Delete
使用Delete
语句,我们可以快速的删除指定表中的记录。下面的代码删除user
表中'id=0'的记录。
conn.Delete("user","id=@id",0).NonQuery();
6.执行任意Sql
如果你要执行的Sql比较复杂, 可以使用sql
函数来执行任意语句。下面的代码用于查询user
表中所有记录的个数,如下:
var count = conn.Sql("select count(*) from user").SingleValue<long>();
三、事务
在SqlContext
中使用事务同样很简单,下面的代码展示了如何在一个事务中执行多个Sql
语句。
var trans = conn.BeginTransaction();
try
{
conn.Delete("user","id=@id",0).NonQuery();
conn.Delete("user","id=@id",1).NonQuery();
conn.Delete("user","id=@id",2).NonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
}
四、完整示例
下面的代码展示了一个使用SqlContext
的完整示例:
class Program
{
static void Main(string[] args)
{
/*0.创建连接*/
var conn = new SQLiteConnection("Data Source=data.db;");
/*1.创建表*/
conn.CreateTable("user", "id integer primary key autoincrement,name varchar(32),password varchar(32)").NonQuery();
/*2.插入数据,无返回值*/
conn.Insert("user", "name,password", "test", "123456").NonQuery();
/*3.查询多行数据*/
var userList = conn.Select("user").Many(r => new User
{
Id = (long)r["id"],
Name = (string)r["name"],
Password = (string)r["password"]
});
/*4.注册Mapper函数*/
SqlContext.RegistMapper(r => new User
{
Id = (long)r["id"],
Name = (string)r["name"],
Password = (string)r["password"]
});
/*5.查询多行数据(使用mapper)*/
userList = conn.Select("user").Many<User>();
/*6.查询单行数据(使用mapper)*/
var user = conn.Select("user").Single<User>();
/*7.传递参数(方式1)*/
userList = conn.Select("user", "id>@min and id<@max", 1, 3).Many<User>();
/*8.传递参数(方式2)*/
userList = conn.Select("user", "id>@min and id<@max")
.Parameters(1, 3)
.Many<User>();
/*9.传递参数(方式3)*/
userList = conn.Select("user", "id>@min and id<@max")
.Parameter("min", 1)
.Parameter("max", DbType.Int32, 3)
.Many<User>();
/*10.执行任意sql(获取单个值)*/
var count = conn.Sql("select count(*) from user").SingleValue<long>();
}
public class User
{
public long Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
}
}