5ifree.eicp.net

瑞雪年

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  221 随笔 :: 0 文章 :: 358 评论 :: 0 引用

DAC 4.0 是一个全新的版本, 几乎全部重写了以前的代码,设计的结构也简化很多,基于.net4,使用lambda表达式代替反射,去除大量过时的功能(如DataTable和DataSet的相关功能等),去除自定义表达式部分,通过解析lambda表达式实现自定义条件查询。 使用.net自带Configuration功能,只要web.config或app.config,不需要额外的配置文件,方便配置使用;去除xml mapping方式,支持DLinq属性。支持多种数据库(已测试sql server, mysql, sqlite及oracle), 支持mono(ubuntu 11.10 +  mono 2.10.5 + mysql 5.1.58测试通过)。

代码示例:

初启化,通过配置文件或connection string构造DataContext:

var dc = new DataContext("RaisingStudio.Data.TestProject.Properties.Settings.DefaultConnectionString");

var dc = new DataContext("server=localhost;User Id=root;password=root;database=test;");

lambda表达式查询:

var q = this.dc.Query<Item>(i => i.Name == "test" && i.Status == "ok");

或linq查询:

var q = from s in dc.GetQuery<Supplier>() 
where s.SuppId > 0 && s.Name == "for Test3"
select s;

增删改:

this.dc.Insert<Product>(new Product
{
ProductId = Guid.NewGuid().ToString(),
CategoryId = categoryId,
Name = "for Test4"
});


this.dc.Delete<Supplier>(suppId);

this.dc.Update<Product>(product);

this.dc.Save<Category>(category);

通过主键获取单个实例:

var product = this.dc.GetEntity<Product>(productId);

支持排序和分页:

List<Item> items = this.dc.Query<Item>(ExpressionExtension.Empty<Item>().Take(3)).ToList();
var q = (from i in this.dc.GetQuery<Item>()
select i).Skip(1).Take(2);
int count = this.dc.Query<Item>(ExpressionExtension.Empty<Item>().Skip(1)).Count();

部分列:

this.dc.Save<Item>(item, new string[] { "UnitCost" });

this.dc.Insert<Item>(item, new Expression<Func<Item, object>>[]
{
i => i.ItemId,
i => i.Name,
i => i.ListPrice,
i => i.ProductId,
i => i.Status
});

无实例类查询:

Command command = new Command("SELECT * FROM Product WHERE CategoryId = @p1");
command.AddParameter("@p1", categoryId);
var q = this.dc.Query(command);
int count = 0;
foreach (dynamic p in q)
{
Assert.IsNotNull(p);
Assert.AreEqual(p.CategoryId, categoryId);
count++;
}

事务处理:

            this.dc.BeginTransaction();
try
{
int result = this.dc.Insert<Supplier>(new Supplier
{
Name = "s for Test6",
Status = "done",
City = "dalian"
});

int suppId = Convert.ToInt32(this.dc.GetIdentity<Supplier>());
result = this.dc.Delete<Supplier>(suppId);

Category category = new Category
{
CategoryId = Guid.NewGuid().ToString(),
Name = "c for Test6",
Descn = "d for Test6"
};
Product product = new Product
{
ProductId = Guid.NewGuid().ToString(),
Name = "p for Test6",
Descn = "d for Test6",
CategoryId = category.CategoryId
};
result = this.dc.Insert<Category>(category);
result = this.dc.Insert<Product>(product);

this.dc.CommitTransaction();
}
catch (Exception ex)
{
this.dc.RollbackTransaction();
throw ex;
}

配置文件示例:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="raisingstudio.data" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="CommandConverter.Settings" type="RaisingStudio.Data.CommandConverterSettings, RaisingStudio.Data" />
<section name="CommandBuilder.Settings" type="RaisingStudio.Data.CommandBuilderSettings, RaisingStudio.Data" />
</sectionGroup>
</configSections>
<system.data>
<DbProviderFactories>
<add name="System.Data.SQLite" invariant="System.Data.SQLite" description="ADO.NET Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<add name="Oracle.DataAccess" invariant="Oracle.DataAccess" description="Oracle.DataAccess" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess" />
</DbProviderFactories>
</system.data>
<raisingstudio.data>
<CommandConverter.Settings>
<add name="System.Data.OracleClient" providerName="System.Data.OracleClient" usePositionalParameters="false" parameterPrefix=":" useParameterPrefixInParameter="false" useParameterPrefixInSql="true" />
<add name="Oracle.DataAccess" providerName="Oracle.DataAccess" usePositionalParameters="false" parameterPrefix=":" useParameterPrefixInParameter="false" useParameterPrefixInSql="true" />
</CommandConverter.Settings>
<CommandBuilder.Settings>
<add name="MySql.Data.MySqlClient" providerName="MySql.Data.MySqlClient" pagingMethod="LIMIT" identityMethod="LAST_INSERT_ID" useBrackets="false" />
<add name="System.Data.SQLite" providerName="System.Data.SQLite" pagingMethod="LIMIT" identityMethod="LAST_INSERT_ROWID"/>
<add name="System.Data.OracleClient" providerName="System.Data.OracleClient" pagingMethod="ROWNUM" identityMethod="CURRVAL" />
<add name="Oracle.DataAccess" providerName="Oracle.DataAccess" pagingMethod="ROWNUM" identityMethod="CURRVAL" useBrackets="false" />
</CommandBuilder.Settings>
</raisingstudio.data>
<connectionStrings>
<add name="RaisingStudio.Data.TestProject.Properties.Settings.DefaultConnectionString"
connectionString
="Data Source=localhost;Initial Catalog=test;Integrated Security=True"
providerName
="System.Data.SqlClient" />
<add name="RaisingStudio.Data.TestProject.Properties.Settings.MySqlConnectionString"
connectionString
="server=localhost;User Id=root;password=root;Persist Security Info=True;database=test"
providerName
="MySql.Data.MySqlClient" />
<add name="RaisingStudio.Data.TestProject.Properties.Settings.SqliteConnectionString"
connectionString
="Data Source=test.db" providerName="System.Data.SQLite" />
<add name="RaisingStudio.Data.TestProject.Properties.Settings.OracleConnectionString"
connectionString
="Data Source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = zhongzf-PC)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) );User Id=demo;Password=demo;"
providerName
="Oracle.DataAccess" />
</connectionStrings>
</configuration>

 

下载地址:http://dac.codeplex.com/

相关阅读:

http://www.cnblogs.com/zhongzf/archive/2009/04/05/1429780.html (实体生成工具使用RazorEngine,模版可轻松实制)

 

 

posted on 2012-01-07 19:25 瑞雪年 阅读(1975) 评论(22) 编辑 收藏

评论

#1楼 2012-01-07 20:29 xwy      
支持,以前版本用过
新版本更要支持
 回复 引用 查看   

#2楼 2012-01-07 21:04 秋叶抚风      
DataTable和DataSet过时了,5555~~~
 回复 引用 查看   

#3楼 2012-01-07 22:20 DYStudio      
恭喜恭喜~~~
 回复 引用 查看   

#4楼 2012-01-07 22:33 DYStudio      
我去,链接字符串名称搞那么长干什么
 回复 引用 查看   

#5楼 2012-01-07 23:14 给力的程序员      
请问LZ的跟Linq to sql有什么区别
 回复 引用 查看   

#6楼[楼主] 2012-01-08 11:01 瑞雪年      
引用给力的程序员:请问LZ的跟Linq to sql有什么区别

dac借用了linq的expression和attribute, 实现对部分常用表达式的解析,从而实现对多种数据库的支持,也可以说在查询方面一定程度(单实体)上兼容部分linq to sql,但在数据更新上,采用了更直接的方式。本质上讲dac还算不上orm,所以一直叫它“数据访问组件”。
 回复 引用 查看   

#7楼[楼主] 2012-01-08 11:08 瑞雪年      
同时dac在支持多种数据源,和多种运行环境方面作了很多尝试,如:对sharepoint的支持,对windows mobile的支持,这是在其它数据层很少见的,本次发布,对mono的支持,也可以说是一大亮点,本人对mono充满热情,希望它走的更好!
 回复 引用 查看   

#8楼 2012-01-11 16:55 ucfar      
指定的转换无效:ID主键必须为int64才行
private static void Main(string[] args)
{
var dc = new DataContext("Data Source=Temp.db");
IQueryable<JDC> q = from s in dc.GetQuery<JDC>()
where s.ID <= 10
select s;
foreach (var jdc in q)
{
Console.WriteLine(jdc.Title);
}

dc.Log = Console.Out;
Console.ReadLine();
}
 回复 引用 查看   

#9楼 2012-01-12 16:56 ucfar      
public int Insert<T>(T dataObject)
{
//修改插入自增功能;
string[] keyNames;
Type[] keyTypes;
string[] keyColumnNames;
string[] keyColumnTypes;
object[] primaryKeys = GetEntityKeys(dataObject, out keyNames, out keyTypes, out keyColumnNames,
out keyColumnTypes);
string[] columns;
//dbGeneratedColumns = keyNames;

CommandBuilder commandBuilder = GetCommandBuilder(null, tableName, propertyNames, propertyTypes, columnNames,
columnTypes);

bool isGUID = false;
foreach (Type a in keyTypes)
{
if (a.Name.ToLower() == "string")
{
isGUID = true;
break;
}
}
if (isGUID)
{
columns = propertyNames.Except(dbGeneratedColumns).ToArray();
}
else
{
columns = propertyNames.Except(keyNames).ToArray();
}
//自增结束;
 回复 引用 查看   

#10楼 2012-01-13 17:06 ucfar      
没发现有存储过程
 回复 引用 查看   

#11楼[楼主] 2012-01-13 18:43 瑞雪年      
引用ucfar:没发现有存储过程

可以使用command.CommandType = CommandType.StoredProcedure,执行存储过程,不过关于返回参数,目前还没考虑,以后应该会加上。
谢谢你的支持,dac还会陆续添加一些功能,我基本上业余有空闲时间都会想着给它加点功能,以希望你多提宝贵建议!
 回复 引用 查看   

#12楼[楼主] 2012-01-13 21:45 瑞雪年      
引用ucfar:
指定的转换无效:ID主键必须为int64才行
private static void Main(string[] args)
{
var dc = new DataContext("Data Source=Temp.db");
IQueryable<JDC> q = from s in dc.GetQuery<JDC>()
where s.ID <= 10
select s;
...


搞不懂sqlite的INTEGER为啥是64位?难道是因为我的系统是64位的???
 回复 引用 查看   

#13楼[楼主] 2012-01-13 22:46 瑞雪年      
引用ucfar:没发现有存储过程

刚加了获取返回参数值,感谢建议!
 回复 引用 查看   

#14楼 2012-01-14 20:38 ucfar      
SQLSERVER中数据类型不全,导致实体生成器无法正常运行
such as:MSSql2005DBSchemaProvider:_sqlTypes中datetime2。。。
 回复 引用 查看   

#15楼 2012-01-16 17:23 ucfar      
建议增加实体缓存功能
 回复 引用 查看   

#16楼[楼主] 2012-01-22 20:14 瑞雪年      
谢谢建议!

过年还在写代码,这是一种什么“精神”?!!!
http://dac.codeplex.com/SourceControl/changeset/changes/67321
添加对jqGrid支持。
 回复 引用 查看   

#17楼[楼主] 2012-01-23 00:36 瑞雪年      
大过年,还有人下载,啥也不说了,感谢啊!!!
 回复 引用 查看   

#18楼 2012-01-26 05:19 ucfar      
过来下载看看
 回复 引用 查看   

#19楼 2012-02-13 11:12 ucfar      
oracle下,实体生成工具生成不了。提示RazorEngine.Razor的类型初始值设定引发异常。晕
 回复 引用 查看   

#20楼 2012-02-13 14:40 ucfar      
下载新版本后,int类型的主键又不行了,报错
 回复 引用 查看   

#21楼 2012-02-13 14:42 ucfar      
哎,问题一大堆
 回复 引用 查看   

#22楼 2012-02-13 14:46 ucfar      
等稳定后再用吧
 回复 引用 查看