http://www.ikende.com/smarkdata.aspx

Smark.Data是基于Ado.net实现的数据访问组件,提供基于强类型的查询表达式进行灵活的数据查询,统计,修改和删除等操作;采用基于条件驱动的操作模式,使数据操作更简单轻松;内部通过标准SQL92实现对不同数据的支持,包括MSSQL,ORACLE,SQLITE,ACCESS等。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
var emp = 3.Load();
emp.Notes = "smark.data";
emp.Save();
         
(Employee.employeeID == 111).Edit(o => { o.Notes = "text"; });
SQL sql = "delete from employees where employeeid=@p1";
sql["p1", 11].Execute();
sql = "select * from orders where employeeid=@p1 and orderdate >@p2";
var items= sql["p1", 1]["p2", "1996-1-1"].List();
var items = (Order.employeeID == 1 & Order.orderDate > "1996-1-1").List();

  • 1.7新增功能简介

主要功能

  1. 提供强类型的查询表达式,并提供基于条件表达式的数据据查询,汇总,修改,删除和编辑。
  2. 提供多数库支持,运行期提供实体可对应多个数据库操作。
  3. 提供基于线程的事务机制,可在不传递事务对象的情况下可以支持跨方法事务。
  4. 支持表,视图和查询汇总实体描述。
  5. 可在运行期动态调整实体对应的表名。
  6. 支持自定义业务对象填充。
  7. 支持存储过程调用描述和存储过程数据对象填充。
  8. 支持自定义实体成员数据转换器,并自动应用到相应查询条件中。
  9. 支持自定义实体成员数据验证,并可能通过数据查询的方式来验证成员数据有效性.
  10. 支持自定义值描述,可以根据实际情况定义不同的成员默认值,包括从mssql获取自增值,oracle序列或系统的guid值等。

设置访问数据类型和连接信息

  • 配置文件配置
?
1
2
3
4
5
6
7
8
9
10
11
12
<configSections>
  <section name="smarkdata" type="Smark.Data.SmarkDataSection,Smark.Data"/>
</configSections>
<smarkdata>
  <Connection>
    <add name="0" type="Smark.Data.MSSQL,Smark.Data"
         connectionstring="Data Source=192.168.0.x;Initial Catalog=ProductDB;uid=xxx;pwd=xxx"/>
  </Connection>
  <Assembly>
    <clear/>
  </Assembly>
</smarkdata>

  • 代码配置
?
1
2
3
string dbpath = @"Data Source=..\\..\\..\\lib\\northwind.db;Pooling=true;FailIfMissing=false;";
DBContext.SetConnectionDriver<SqliteDriver>(ConnectionType.Context1);
DBContext.SetConnectionString(ConnectionType.Context1, dbpath);

实体定义

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[Table("customers")]
public interface ICustomer
{
    [ID]
    string CustomerID { get; set; }
    [Column]
    string CompanyName { get; set; }
    [Column]
    string ContactName { get; set; }
    [Column]
    string Address { get; set; }
    [Column]
    string City { get; set; }
    [Column]
    string Region { get; set; }
    [Column]
    string PostalCode { get; set; }
    [Column]
    string Country { get; set; }
    [Column]
    string Phone { get; set; }
    [Column]
    string Fax { get; set; }
}

下载实体插件支持vs2010,vs2008(win2003,winxp,win7,win2008)

数据增,删,改

  • 增加

    ?
    1
    2
    3
    4
    5
    Employee emp = new Employee();
    emp.FirstName = "fan";
    emp.LastName = "henry";
    emp.City = "guangzhou";
    DBContext.Save(emp);

组件会根据设置成员值的情况来更新相关字段,当没有更改值的属性并不会生成相关SQL添加到数据库中

  • 删除

    ?
    1
    2
    emp = DBContext.Load<Employee>(3);
    DBContext.Delete(emp);

  • 修改

    ?
    1
    2
    3
    emp = DBContext.Load<Employee>(3);
    emp.Notes = "test,remark";
    DBContext.Save(emp);

条件表达式

  • 简单查询

    ?
    1
    2
    Expression exp = Customer.country == "USA" & Customer.city == "OR";
    var items = exp.List<Customer>();

  • 组合查询
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Expression exp = new Expression();
    if (string.IsNullOrEmpty(employeeid))
        exp &= Order.employeeID == employeeid;
    if (string.IsNullOrEmpty(customerid))
        exp &= Order.customerID == customerid;
    if (from != null)
        exp &= Order.orderDate > from;
    if(to !=null)
        exp &= Order.orderDate <to;
    var items = exp.List<Order>();

  • 条件复用
    ?
    1
    2
    3
    4
    5
    exp = Employee.employeeID == 6;
    var employees = exp.List<Employee>();
    var orders = exp.List<Order>();
    exp.Delete<Employee>();
    exp.Delete<Order>();

  • 修改数据
    ?
    1
    (Customer.country == "USA").Edit<Customer>(d => { d.City = "abs"; });
  • 删除数据
    ?
    1
    (Customer.country == new[] { "USA", "UK" }).Delete<Customer>();
  • 数据统计
    ?
    1
    2
    exp.Count<Customer>();
    exp.Sum<double, Product>(Product.unitPrice.Name);

关联,统计查询

  • 单一对象

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [Table("employees")]
    public interface IEmployeeView
    {
        [ID]
        string EmployeeID { get; set; }
        [Column]
        string FirstName { get; set; }
        [Column]
        string LastName { get; set; }
    }

    ?
    1
    2
    Expression exp = new Expression();
    var empviews = exp.List<EmployeeView>();

  • 制定表关联查询
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    [Table("customers inner join orders on customers.customerid=orders.customerid")]
    public interface ICustomerOrders
    {
        [Column]
        string CompanyName { get; set; }
        [Column]
        string ContactName { get; set; }
        [Column]
        [DateTimToLong]
        DateTime OrderDate { get; set; }
        [Column]
        [DateTimToLong]
        DateTime RequiredDate { get; set; }
        [Column]
        string ShipName { get; set; }
        [Column]
        string ShipAddress { get; set; }
        [Column]
        string ShipCity { get; set; }
        [Column]
        string ShipRegion { get; set; }
        [Column]
        string ShipPostalCode { get; set; }
        [Column]
        string ShipCountry { get; set; }
    }

    ?
    1
    2
    Expression exp = new Expression();
    var empviews = exp.List<CustomerOrders>();

  • 数据汇总统计
    数据统计需要制定相关统计对象,以下是统计各城市客户订单数量

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [Table("customers inner join orders on customers.customerid=orders.customerid")]
    public interface ICustOrderGroupByCity
    {
        [Column]
        string Country { get; set; }
        [Column]
        string City { get; set; }
        [Count]
        int Count { get; set; }
    }

    ?
    1
    2
    Expression exp = new Expression();
    var empviews = exp.List<CustOrderGroupByCity>();

自定义对象填充

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[Table("Employees")]
    public interface IEmployee
    {
        [ID]
        int EmployeeID { get; set; }
        [Column]
        string LastName { get; set; }
        [Column]
        string FirstName { get; set; }
        [Column]
        string Title { get; set; }
        [Column]
        string TitleOfCourtesy { get; set; }
        [Column]
        DateTime BirthDate { get; set; }
        [Column]
        DateTime HireDate { get; set; }
        [Column]
        string Address { get; set; }
        [Column]
        string City { get; set; }
        [Column]
        string Region { get; set; }
        [Column]
        string PostalCode { get; set; }
        [Column]
        string Country { get; set; }
        [Column]
        string HomePhone { get; set; }
        [Column]
        string Extension { get; set; }
        
    }

以上是一个简单的雇员信息描述。

?
1
2
Expression exp = new Expression();
var items = exp.List<Employee>();

以上操作是获取所有雇员信息,而产生的SQL如下:

?
1
2
3
4
5
Select  (EmployeeID) as p_EmployeeID,(LastName) as p_LastName,(FirstName) as p_FirstName,
(Title) as p_Title,(TitleOfCourtesy) as p_TitleOfCourtesy,(BirthDate) as p_BirthDate,
(HireDate) as p_HireDate,(Address) as p_Address,(City) as p_City,(Region) as p_Region,
(PostalCode) as p_PostalCode,(Country) as p_Country,(HomePhone) as p_HomePhone,
(Extension) as p_Extension from Employees

但有些时候并不想获取所有信息,如只获取雇员的简单联系信息。在1.5版本前的做法重新描述一个对象,并添加相关映射属性;在1.5版里就相对简单很多只需描述信息对象,并不需要描述映射属性:

?
1
2
3
4
5
6
7
8
9
10
11
public class EmployeeContact
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string Region { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
    public string HomePhone { get; set; }
}

在查询的时候只需要,调用List方法的另一版本即可.

?
1
2
Expression exp = new Expression();
var items = exp.List<Employee, EmployeeContact>();

以上生成的SQL并不会获取所有字段,而是根据EmployeeContact和Employee相匹配的属性进行生成查询字段.

?
1
2
3
Select  (LastName) as p_LastName,(FirstName) as p_FirstName,(Address) as p_Address,
(City) as p_City,(Region) as p_Region,(PostalCode) as p_PostalCode,(Country) as p_Country,(HomePhone)
as p_HomePhone from Employees

存储过程描述

可以通过以下代码来描述一个存储过程:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Proc]
public class CustOrderHist
{
    [ProcParameter]
    public string CustomerID
    {
        get;
        set;
    }
    [ProcParameter(Direction= System.Data.ParameterDirection.ReturnValue)]
    public int Result
    {
        get;
        set;
    }
}

通过一个Proc属性来描述对象是一个存储过程描述对象,如果属性不指定名称则用对象名称作为存储过程名称调用;通过PorcParameter来描述一个属性对应的存储过程参数。这样描述后就可以进行一个存储过程执行

?
1
2
3
CustOrderHist p = new CustOrderHist();
p.CustomerID = "ALFKI";
DBContext.ExecProc(p);

如果有输出类型参数,执行完成后组件会自动把输出参数值填充到对应的属性上.

当需执行存储过程返回一个对象列表的时候可以,通过以下方法调用即可:

?
1
2
3
CustOrderHist p = new CustOrderHist();
p.CustomerID = "ALFKI";
var items = DBContext.ExecProcToObjects<OrderHist>(p);

其属性对应关系是属性名和字段一致即可,对象成员不需要添加任何属性描述。

事务

  • 普通事务

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Expression exp = new Expression();
    exp = Employee.employeeID == 5;
    using (IConnectinContext cc = DBContext.Context1)
    {
        cc.BeginTransaction();
        exp.Delete<Order>();
        exp.Delete<Employee>();
        cc.Commit();
    }
    DBContext.TransactionExecute(c => {
        exp.Delete<Order>();
        exp.Delete<Employee>();
         
    });

  • 跨方法事务

运行时更新映射表对象

多数据库访问和切换

Smark.Data相关推荐

  1. Smark.Data 值转换器

    组件支持属性转换描述,主要用于对象属性值和数据存储之前的转换,如常见的枚举和数值,枚举和字符,用户密码等信息转换存储.实际上也可以扩展更灵活的转换如对象关联字段转换,对象序列化转等等. 在Smark. ...

  2. Smark.Data 1.5更新详解

    由于一直忙于Beetle的开发和优化,Smark.Data组件已经有很长一段时间更新.这段时间发现Smark.Data在某些情况下不足,而这些情况又比较普遍所以进行了1.5版的更新.其更新的主要功能包 ...

  3. Smark.Data 灵活的查询描述

    使用Smark.Data进行数据查询时必须通过对象来描述,其主要描述信息包括查询来源于那些表和需要那些信息等,即使平常的最常面对的关联查询,数据汇总查询等都可以通过实体描述来完成.因此实体描述在组件中 ...

  4. 开源数据访问组件Smark.Data 1.8入门编

    本章节主要讲述如何使用Smark.Data 1.8进行快速的数据库应用开发,主要内容包括配置,执行SQL和存储过程等基础的数据操作. 配置 在组件使用之前必须进行一个初始化配置,主要配置数据访问设备和 ...

  5. Smark.Data 功能强大又灵活的Expression

    Expression对象是Smark.Data的核心对象,虽然Expression是个条件对象,但它所具备的功能是你想象不到的:),以下把Expression的功能列出来. public RESULT ...

  6. 开源数据访问组件Smark.Data 1.8

    Smark.Data一直强调以最简单和高效的方式访问数据库,在这个版本中组件引入了Query<T>对象,它是一个查询值描述对象,通过它可以更方便地进行数据查询并获取结果.组件会分析T的具体 ...

  7. Smark.Data实体默认值描述

    在数据设计的时候会针对一些字段设置默认的值,Smark.Data同样支持这样的功能,组件通过在属性中描述一个Value属性来告诉组件这个值如果在没有设置的情况应该提供怎样的值.组件提供一个描述的基类, ...

  8. 开源数据访问组件Smark.Data 1.7新增功能

    借助于扩展方法的功能,这一版本的改进可以让数据库操作变得更简单方便,在数据库操作相关会给你一种全新的体验.主要改进有以下几点: 条件表达式可以直接和string进行组合,从而更灵活地创建复杂的查询条件 ...

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

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

最新文章

  1. windows系统启动时显示cpu over voltage error错误解决办法
  2. PHP获取文件的绝对路径
  3. python 网站发送验证码_Python爬虫模拟登录带验证码网站
  4. Java实验二 计算机 1501 王奕开 18
  5. 中国科学院计算机网络信息中心怀柔分中心,计算机网络信息中心怀柔分中心(二期)建设项目荣获2018年度“北京市安装工程优质奖”...
  6. 计算机网络的带宽是指网络可通过的,计算机网络及带宽概念.ppt
  7. Unity大中华区总经理兼全球副总裁张俊波:5G的来临,游戏运行于云端变得可能
  8. 评委打分表模板_为什么你的学习/工作计划,总是执行不下去?(附计划表模板)...
  9. 博图advanced关于vb自动弹出画面
  10. 2022计算机二级全套资料:视频+练习软件+真题资料
  11. android 多开app store,原来 iOS 也有双开助手,还是上架了苹果官方 App Store 的
  12. 【自然语言处理概述】文本词频分析
  13. MySQL COUNT(*) 和 COUNT(1) 比较
  14. Manjaro通过deepin/Arch库安装Tim出现版本太低无法登录问题[解决]
  15. 超级详细!!!Spring、SpringMVC、Mybatis知识点完整版更新!IOD、DI依赖注入、Mybatis配置、SQL、MVC拦截器、Web开发、SSM整合案例。
  16. PXI和LXI平台如何选择?
  17. 【旅游景点分析】--从数据搜集到清洗再到可视化呈现
  18. 关于:Error: error:0308010C:digital envelope routines::unsupported错误报告问题与解决
  19. 把windows里面的文件复制到linux系统中
  20. termux怎么生成木马_metasploit 生成木马常用命令

热门文章

  1. 饿了么:云端调度,饭来张口
  2. web项目---severlet简介
  3. 珠峰新高程:8844.43米
  4. Qt画环状图的几种简单方法
  5. 计算机思维导论优课在线答案,吉大20秋《现代远程学习概论》在线作业题目【标准答案】...
  6. github开源项目
  7. 【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
  8. android:theme 华为,Launcher for Huawei, Theme Huawei Free
  9. 高级程序员如何面对职场压力 3 --明确目标赢在职场
  10. Win10家庭版更改C盘user文件夹名称