组件是基于ado.net接口扩展的数据访问组件,提供基于对象描述的条件操作方式,支持各种不同数据库,操作方式简洁高效。
简易数据操作
制实体类型后,只需通过实体成员构造的条件表达式就能进行数据查找操作
[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; }
}
组件提供一个插件帮助以上接口生成附属类文件,插件下载http://smark.codeplex.com/releases/view/45483#DownloadId=175073(插件暂时只支持c#,文件custom tools:i2m)
Expression exp = Customer.country == "USA" & Customer.city == "OR";
var items = exp.List<Customer>();
设置访问数据类型和连接信息
组件可以通过配置文件或代码的方式设置需要访问的数据设备类型和连接信息
string dbpath = @"Data Source=..\\..\\..\\lib\\northwind.db;Pooling=true;FailIfMissing=false;";
DBContext.SetConnectionDriver<SqliteDriver>(ConnectionType.Context1);
DBContext.SetConnectionString(ConnectionType.Context1, dbpath);
组件可以设置多个数据访问类型,通过ConnectionType来设置相关数据库访问类型,在操作数据如果不指定数据库,则使会使第1个配置的数据库类型。
数据增,删,改
Employee emp = new Employee();
emp.FirstName = "fan";
emp.LastName = "henry";
emp.City = "guangzhou";
DBContext.Save(emp);
组件会根据设置成员值的情况来更新相关字段,当没有更改值的属性并不会生成相关SQL添加到数据库中。
emp = DBContext.Load<Employee>(3);
DBContext.Delete(emp);
组件除了提供这种删除方法外,还可以在编写条件的时候直接进行删除操作
emp = DBContext.Load<Employee>(3);
emp.Notes = "test,remark";
DBContext.Save(emp);
批修改后面会提到,通过条件表达式简单实现以上功能.
条件表达式
Expression exp = Customer.country == "USA" & Customer.city == "OR";
var items = exp.List<Customer>();
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>();
exp = Employee.employeeID == 6;
var employees = exp.List<Employee>();
var orders = exp.List<Order>();
exp.Delete<Employee>();
exp.Delete<Order>();
(Customer.country == "USA").Edit<Customer>(d => { d.City = "abs"; });
(Customer.country == new[] { "USA", "UK" }).Delete<Customer>();
exp.Count<Customer>();
exp.Sum<double, Product>(Product.unitPrice.Name);
关联,统计查询
[Table("employees")]
public interface IEmployeeView
{
[ID]
string EmployeeID { get; set; }
[Column]
string FirstName { get; set; }
[Column]
string LastName { get; set; }
}
Expression exp = new Expression();
var empviews = exp.List<EmployeeView>();
[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; }
}
Expression exp = new Expression();
var empviews = exp.List<CustomerOrders>();
数据统计需要制定相关统计对象,以下是统计各城市客户订单数量
[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; }
}
Expression exp = new Expression();
var empviews = exp.List<CustOrderGroupByCity>();
事务
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>();
});
运行时更新映射表对象
多数据库访问和切换
支持那些数据?
组件内置支持MSSQ,MYSQL,ACCESS,SQLITE,ORACLE等数据库,使用者可以根据需要扩展对SQL92支持的数据访问设备。
public class SqliteDriver : Smark.Data.DriverTemplate<
System.Data.SQLite.SQLiteConnection,
System.Data.SQLite.SQLiteCommand,
System.Data.SQLite.SQLiteDataAdapter,
System.Data.SQLite.SQLiteParameter,
Smark.Data.SqlitBuilder>
{
}