开源组件Smark.Data处理SQL和存储过程

完全通过组件对象描述的方式来完成所有数据库操作是不太现实的事情,所以组件提供SQL和存储过程的执行支持.随着组件版本的不断完善在1.7后组件在使用SQL和存储也是一件极其方便的事情.其简洁的操作方式相信在其他数据访问组件中难以体验到.

SQL处理

组件提供一个SQL对象用于直接处理SQL语句,由于重写了运算符,所以对象可以直接通过string来进行初始化.

1
SQL sql = "delete from employees where employeeid=@p1";

SQL是组件1.7开始提供的对象,它提供以下基础操作方法

  • int Execute()
    获取受影响的行数,一般用于执行insert,delete和update时候需要.
  • T GetValue<T>
    获取查询结果第一行第一列的值,主要用于执行一此汇总统计,count,sum等
  • ListFirst<T>
    获取符合查询的第一条记录并填充到相应的对象中
  • List<T>
    获取符合查询的记录填充到相应对象中

执行删除数据

1
2
SQL sql = "delete from employees where employeeid=@p1";
sql["p1", 11].Execute();

执行查询

1
2
sql = "select * from orders where employeeid=@p1 and orderdate >@p2";
var items= sql["p1", 1]["p2", "1996-1-1"].List<Order>();

SQL合并操作

1
2
3
4
5
6
sql = "select * from orders where 1=1";
if (from != null)
    sql = " and orderdate >=@p1" + sql["p1", from.Value];
if (to != null)
    sql = " and orderdate <=@p2" + sql["p2", to.Value];
items = sql.List<Order>();

统计

1
2
3
4
5
6
sql = "select count(*) from orders where 1=1";
if (from != null)
    sql = " and orderdate >=@p1" + sql["p1", from.Value];
if (to != null)
    sql = " and orderdate <=@p2" + sql["p2", to.Value];
int count = sql.GetValue<int>();

混合条件

由于组件提供基于对象的描述表达,但对于一些复杂的条件其某些字条件用string描述相对来说会更简单简洁.

1
2
3
Expression exp = Order.orderDate > "1996-1-1";
exp &= " customerid in(select customerid from customers where country=@p1)";
items= exp["p1", "usa"].List<Order>();

存储处理

组件支持直接存储过程执行,而存储过程的描述基本和表实体描述一样.以下是一个简单的存储过程描述:

1
2
3
4
5
6
[Proc]
public class CustOrderHist
{
    [ProcParameter]
    public string CustomerID { get; set; }
}

以上对象描述的存储过程名是CustOrderHist,而存储带一个CustomerID的输入参数.描述存储只要有两个Attribute:

  • Proc
    用于描述一个类和存储过程的映射,如果不指定Name参数的情况下则用类名称对应存储过程名称.
  • ProcParameter
    用于描述类成员作为存储过程的参数,如果不指定Name参数的情况则用成员名称作为参数名;通过Direction属性来指定参数的类型,默认是输入类型,如果是输出类型则存储过程的返回值会绑定到相关成员中.

执行存储过程:

1
2
3
CustOrderHist cohist = new CustOrderHist();
cohist.CustomerID = "ANATR";
cohist.ExecProc_();

也可以根据执行存储返回一个数据集,以下存储过程的结果如下:

可以针对相应的字段定义一个对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class CustOrderHistData
{
    public string ProductName
    {
        get;
        set;
    }
    public decimal Total
    {
        get;
        set;
    }
}

定义后就可以存储过程返回相应的对象集合.

1
2
3
CustOrderHist cohist = new CustOrderHist();
cohist.CustomerID = "ANATR";
IList<CustOrderHistData> datas = cohist.ExecProcToObjects_<CustOrderHistData>();

     项目地址:http://smark.codeplex.com/

     官网主页:http://www.ikende.com/SmarkData.aspx

posted @   beetlex  阅读(1488)  评论(11编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2011-10-19 缺省数据库描述对象的数据库访问模式
点击右上角即可分享
微信分享提示