SQLite-执行Sql

执行Sql

对于一些极其复杂的 sql 查询,还是得依赖原生 sql,因此,Chloe 提供了原生 sql 查询接口。
获取满足条件的用户信息,将结果映射到 User 类上:

context.SqlQuery<User>("select * from Users where Age>@age", new DbParam("@age", 18)).ToList();

获取满足条件的用户 Id:

context.SqlQuery<int>("select Id from Users where Age>@age", new DbParam("@age", 18)).ToList();

支持存储过程:

context.SqlQuery<User>("Proc_Test", CommandType.StoredProcedure, new DbParam("@age", 18)).ToList();

支持dynamic:

context.SqlQuery<dynamic>("select Id,Name from Users where Age>@age", new DbParam("@age", 18)).ToList();

传参方式2:

context.SqlQuery<User>("select * from Users where Id=@Id", new { Id = 1 }).ToList();

获取 DataTable:
ExecuteDataTable 扩展方法位于 https://github.com/shuxinqin/Chloe/blob/master/src/DotNet/Chloe.Extension/DbSessionExtension.cs 类中。

DataTable dt = context.Session.ExecuteDataTable("select * from users where age>=@age", new { age = 18 });

FormatSqlQuery(仅.NET Core版本支持):
FormatSqlQuery 扩展方法可以执行原生sql语句,并且会自动参数化,方法定义位于 https://github.com/shuxinqin/Chloe/blob/master/src/DotNetCore/Chloe.Extension/DbContextExtension_NETCORE.cs 类中。

int age = 18;
List<User> users = context.FormatSqlQuery<User>($"select * from Users where age>={age}").ToList();

//或者
FormattableString sql = $"select * from Users where age>={age}"; //此处声明变量不能是 var 或者 string,否则会生成非参数化 sql,有潜在的 sql 注入问题
users = context.FormatSqlQuery<User>(sql).ToList();

/*
 * 生成参数化 sql:
 * Input Int32 @P_0 = 18;
   select * from Users where age>=@P_0
 */

ado.net:
基本的 ado.net 接口定义在 DbContext.Session 对象中。

int rowsAffected = context.Session.ExecuteNonQuery("update Users set Age=18 where Id=1");
IDataReader dataReader = context.Session.ExecuteReader("select * from Users where Age>18");