原生 Sql 操作 ,Sql和存储过程

功能介绍

下面的方法支持复杂的Sql  、 返回多个结果集 、存储过程等  、可以理解为了一个高级DbHelper

1、用法介绍

//调用Sql
db.Ado.具体方法

//调用存储过程
db.Ado.UseStoredProcedure().具体方法

2、方法列表

方法名描述返回值
SqlQuery< T >查询所有返回实体集合List
SqlQuery<T,T2>

可以返回2个结果集

Tuple<List, List>

SQLITE(驱动)需要查询前面加上

this.Context.Ado.IsClearParameters=false;

SqlQuerySingle查询第一条记录T
SqlQuery<dynamic>查查询所有返回匿名对象dynamic
GetDataTable查询所有DataTable
GetDataReader读取DR需要手动释放DRDataReader
GetDataSetAll获取多个结果集DataSet
ExecuteCommand返回受影响行数,一般用于增删改int
GetScalar获取首行首列object
GetString获取首行首列string
GetInt获取首行首列int
GetLong获取首行首列long
GetDouble获取首行首列Double
GetDecimal获取首行首列Decimal
GetDateTime获取首行首列DateTime

t3、使用案例

技巧:Sql中的关键词用@可以支持多库 

//无参数
var dt=db.Ado.GetDataTable(sql) //上面列表中 SqlQuery 等方法都可以不一定是GetDataTable

//参数1:简化用法
var dt=db.Ado.GetDataTable("select * from table where id=@id and name like @name",
new{id=1,name="%"+jack+"%"});

//参数2:复杂用法
var dt=db.Ado.GetDataTable("select * from table where id=@id and name like @name",
new List<SugarParameter>(){
  new SugarParameter("@id",1),
  new SugarParameter("@name","%"+jack+"%") //执行sql语句
});

//参数3:结合用法
var pars =db.Ado.GetParameters(new{p=1,p2=p}); 
pars[1].DbType=System.Data.DbType.Date;
var dt=db.Ado.GetDataTable(sql,pars)


//原生SQL用实体 sql 查询
List<ClassA> t=db.Ado.SqlQuery<ClassA>(sql);//比db.SqlQueryable兼容性更强,支持复杂SQL存储过程,缺点没有自带的分页操作


//原生SQL用匿名对象 sql 查询
List<dynamic> t=db.Ado.SqlQuery<dynamic>(sql); 


//插入 更新操作一般用
db.Ado.ExecuteCommand(sql);

//db.Ado.xxx 还有更多方法看文档最下面

Sql 查询用  

GetDataTable

SqlQuery 

Sql 增删改用

 增删 改可以用 ExecuteCommand

4、 调用存储过程

//简单用法
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",new{name="张三",age=0}); 



//带有output的存储过程 
var nameP= new SugarParameter("@name", "张三");
var ageP= new SugarParameter("@age", null, true);//设置为output
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);//返回dt
var list = db.Ado.UseStoredProcedure().SqlQuery<Class1>("sp_school",nameP,ageP);//返回List
//更多返回方法 看文档最下面

//ageP.Value可以拿到output值


//SqlSever Datatable参数 看文档 SqlServer 中有介绍 

//Oracle 游标参数用法 Blob类型 Clob类型  看文档 Oracle中有介绍 


//如果是ReturnValue
var nameP=new SugarParameter("@name", "张三", typeof(string),ParameterDirection.ReturnValue);


//我们还可以用 GetParameters 来简化参数操作 
 SugarParameter [] pars =db.Ado.GetParameters(new{p=1,p2=p}); 
 pars[1].Direction=ParameterDirection.Output;

5、in参数用法

 var dt = db.Ado.SqlQuery<Order>(
                      "select * from [order] where  id in(@ids)",
                       new { ids = new int[] { 1,2,3 } }); //是个数组不是字符串
                       // new SugarParamter("@ids",int[] { 1,2,3}) 
 //select * from [order] where  id in('1','2','3')

6、SqlServer带Go的脚本处理

db.Ado.ExecuteCommandWithGo(sql) //go语句是独立一行就支持

7、查询2个结果集

等同于Dapper中的 querymultiple

var views=db.SqlQuery<T,T2>("select * from t; select * from t2");//多实体
var t1list=views.Item1;
var t2list=views.Item2;

8、集合参数批量操作

和Dapper中的2层集合的参数功能是一样的,SqlSugar中不用写SQL用法如下

//删除 
List<Dictionary<string,object>> list= new List<Dictionary<string,object>>;
list.Add(字典);//只需要条件列
db.Deleteable<object>().AS("[Order]").WhereColumns(list).ExecuteCommand();


//插入
List<Dictionary<string,object>> list= new List<Dictionary<string,object>>;
list.Add(字典)//插入所有要的所有列
db.Insertable(list).AS("student").ExecuteCommand();


//更新
List<Dictionary<string,object>> list= new List<Dictionary<string,object>>;
list.Add(字典)//更新和条件所需要的所有列
var t66 = db.Updateable(list).AS("student").WhereColumns("id").ExecuteCommand();

特殊SQL批量

//5.0.6.3
 using (db.Ado.OpenAlways()) { //开启长连接
     
      foreach(var pars in List<parameter[]>)
      {
         db.Ado.ExecuteCommand(sql,paras);
      }
             
 }

10、表值参数、游标参数 

文档搜索你用的具体数据库 : SqlServer  (表值)

文档搜索你用的具体数据库 : Oracle(表游标)

11、Dapper用户转SqlSugar

https://www.cnblogs.com/sunkaixuan/p/18206516

12、DataSet转List<类>

SqlQuery<T,T2,T3..>最多只能有7个,我们可以用db.Ado.GetDataSetAll拿出超过7个结果集

var datables=ds.Tables.Cast<DataTable>().ToList();
foreach (var item in tables)
{
    var list = db.Utilities.DataTableToList<Order>(item);
}

13、类作为参数

默认只支持匿名类作为参数,普通类参数是不支持的

如果想支持类作为参数可以自个封装个方法

代码如下:

var pars=new {id=1;name="a"};//默认支持匿名类

//普通类作为参数最大问题 会把所有属性都变成参数 ,匿名类型就不存在这个问题
var obj = new Order(){ ....} ;//类对象
SugarParameter[]  pars=obj.GetType().GetProperties()
 .Select(it => new SugarParameter(it.Name, it.GetValue(obj))).ToArray();


关闭
果糖网