codecamp

SqlContext文档

一、简介

SqlContext是一个轻量级的Sql帮助类,旨在提供一种快速、简洁、优雅地数据库访问方法。 相比于重量级的EntityFrameworkSqlContext非常轻量化,包括空行和注释,代码也不过几百行;而相对于ADO.NetSqlContext又非常简洁、灵活和优雅,你可以以一种直观的方式来访问数据库,而不必关心其实现的细节。本质上,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以下面的规则管理连接:

  1. 如果在执行Sql语句之前,数据库连接处于打开状态,则执行完毕后,保持打开状态
  2. 如果在执行Sql语句之前,数据库连接处于关闭状态,则打开连接,并在执行完毕后关闭连接

假设我们现在要创建名为user的表(包含idnamepassword三个字段),采用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采用延迟执行的机制,只有在调用下面的函数之一时才会真正的请求数据库:

  1. NonQuery,执行 SQL 而不返回结果
  2. Many,执行 SQL 并返回多行结果
  3. Single,执行 SQL 并返回单行结果

SqlContext支持简单的ORM,只需在程序启动时注册一次Mapper函数,以后就可以方便的提取数据了,注册Mapper的代码如下:

SqlContext.RegistMapper(r => new User
{
    Id = (long)r["id"],
    Name = (string)r["name"],
    Password = (string)r["password"]
});

之后,我们在调用ManySingle函数时,只需指明期望的数据类型即可,如下:

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语句,当然SelectDelete也都支持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; }
    }
}
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }