开源组件Smark.Data处理SQL和存储过程
完全通过组件对象描述的方式来完成所有数据库操作是不太现实的事情,所以组件提供SQL和存储过程的执行支持.随着组件版本的不断完善在1.7后组件在使用SQL和存储也是一件极其方便的事情.其简洁的操作方式相信在其他数据访问组件中难以体验到.
SQL处理
组件提供一个SQL对象用于直接处理SQL语句,由于重写了运算符,所以对象可以直接通过string来进行初始化.
1SQL sql =
"delete from employees where employeeid=@p1"
;
SQL是组件1.7开始提供的对象,它提供以下基础操作方法
- int Execute()
获取受影响的行数,一般用于执行insert,delete和update时候需要.- T GetValue<T>
获取查询结果第一行第一列的值,主要用于执行一此汇总统计,count,sum等- ListFirst<T>
获取符合查询的第一条记录并填充到相应的对象中- List<T>
获取符合查询的记录填充到相应对象中执行删除数据
12SQL sql =
"delete from employees where employeeid=@p1"
;
sql[
"p1"
, 11].Execute();
执行查询
12sql =
"select * from orders where employeeid=@p1 and orderdate >@p2"
;
var
items= sql[
"p1"
, 1][
"p2"
,
"1996-1-1"
].List<Order>();
SQL合并操作
123456sql =
"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>();
统计
123456sql =
"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描述相对来说会更简单简洁.
123Expression exp = Order.orderDate >
"1996-1-1"
;
exp &=
" customerid in(select customerid from customers where country=@p1)"
;
items= exp[
"p1"
,
"usa"
].List<Order>();
存储处理
组件支持直接存储过程执行,而存储过程的描述基本和表实体描述一样.以下是一个简单的存储过程描述:
123456[Proc]
public
class
CustOrderHist
{
[ProcParameter]
public
string
CustomerID {
get
;
set
; }
}
以上对象描述的存储过程名是CustOrderHist,而存储带一个CustomerID的输入参数.描述存储只要有两个Attribute:
- Proc
用于描述一个类和存储过程的映射,如果不指定Name参数的情况下则用类名称对应存储过程名称.- ProcParameter
用于描述类成员作为存储过程的参数,如果不指定Name参数的情况则用成员名称作为参数名;通过Direction属性来指定参数的类型,默认是输入类型,如果是输出类型则存储过程的返回值会绑定到相关成员中.执行存储过程:
123CustOrderHist cohist =
new
CustOrderHist();
cohist.CustomerID =
"ANATR"
;
cohist.ExecProc_();
也可以根据执行存储返回一个数据集,以下存储过程的结果如下:
可以针对相应的字段定义一个对象:
12345678910111213public
class
CustOrderHistData
{
public
string
ProductName
{
get
;
set
;
}
public
decimal
Total
{
get
;
set
;
}
}
定义后就可以存储过程返回相应的对象集合.
123CustOrderHist cohist =
new
CustOrderHist();
cohist.CustomerID =
"ANATR"
;
IList<CustOrderHistData> datas = cohist.ExecProcToObjects_<CustOrderHistData>();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2011-10-19 缺省数据库描述对象的数据库访问模式