5ifree.eicp.net

瑞雪年

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

置顶随笔 #

摘要: 问题交流在这里。阅读全文
posted @ 2005-07-13 16:18 瑞雪年 阅读(415) 评论(10) 编辑

2012年1月7日 #

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 @ 2012-01-07 19:25 瑞雪年 阅读(1861) 评论(18) 编辑

2011年12月30日 #

一晃,又一个月过去了,这是个忙碌的一个月,主要是把dac重构了一下,也可以说是重新设计或重写,因为类结构和功能都作了大量调整,采用.net4,使用lambd表达式代替反射,代码大量删减,去除了对DataTable及DataSet的支持,使用结构大幅简化,最终生成一个dll. 到目前为至功能代码基本完成,打算写完单元测试用例,并测试通过后,发布dac 4.0版,预计在2012年1月附近。还有就是最近有项目需要,在研究BizTalk, 主要用来发送和接收EDI文件,本来打算还是写个入门实践来着,可实在是研究不深入,都想不出写点什么好了,就此作罢。

 

posted @ 2011-12-30 21:55 瑞雪年 阅读(14) 评论(0) 编辑

2011年11月27日 #

Mono.CSharp.Evaluator提供了方便的动态编译功能,但默认的Compile方法,
只支持无参的方法,如:

Mono.CSharp.Evaluator evaluator = new Mono.CSharp.Evaluator(new Mono.CSharp.CompilerSettings(), new Mono.CSharp.Report(new ConsoleReportPrinter()));
var method = evaluator.Compile("System.Console.WriteLine(\"dynamic compiled\");");
// or with return value.
method = evaluator.Compile("new System.DateTime();");
object value = null;
method(ref value);


其实,要支持带参数的方法也很容易,使用Lambda表达式轻松实现:

evaluator.ReferenceAssembly(typeof(Form1).Assembly);
var action = (System.Action<WindowsFormsApplication1.Form1, object>)evaluator.Evaluate("new System.Action<WindowsFormsApplication1.Form1, object>((instance, value) => { instance.Test(value); });");
action(this, "test8");


于是,本人写了个EvaluatorExtension将这样的代码简化一下:

var action = evaluator.Compile<Action<Form1, object>>("(instance, value) => { instance.Test(value); }");
action(this, "test12");
// or with return value
var func = evaluator.Compile<Func<Form1, object, string>>("(instance, value) => { instance.Test(value); return (string)value; }");
string value = func(this, "test13");


或者,使用参数的方法定义“参数名”:

var action = evaluator.Compile<Action<Form1, object>>(new[] { "instance", "value" }, "instance.Test(value);");

Mono.CSharp.dll 下载: Mono.CSharp.dll




posted @ 2011-11-27 12:48 瑞雪年 阅读(15) 评论(0) 编辑

2011年10月14日 #

     最近一个项目用到BO的东西,于是研究了一下,项目要求不多,只是作几张报表,所以研究不深入,那就写个入门教程吧。

1. Universe
要在BO中创建报表(Crystal Report不在此列),首先要创建Universe,通俗一点理解,在本人看来就是个数据源(Data Source),
因为大多数报表工具都把这种东西叫作数据源,只是BO很有创新精神地给它起了个“响亮的”名字。


Universe只是数据结构的描述,真正的数据当然还是要从数据库中取,所以在创建Universe时还是要先建立一个数据库连接,
Universe支持各种我知道的和不知道的类型的数据库,选择一个用的类型的就是了,不知道的就让它继续“未知”好了。
然后,就插入我们报表要用的表或视图,如果要作多张报表分别用到不同的表或视图,那就把它们都拽进来吧。


好了,Universe创完了,使用Export,导出到服务器上,就可以在报表中使用了。


Universe本身支持多种关联,条件,函数等,也许在BO专家的眼中,它是无所不能的,对于菜鸟也别慌,
把那复杂的逻辑就放在视图里作吧,让Universe"干净干净"不也挺好看的嘛。

2. Webi
BO有两种方式创建报表,Desktop Intelligence和Web intelligence, 一个桌面版,一个网页版,两个功能都差不多,
概况的说,那就是相当弱,甚至都赶不上vs.net自带的RDLC。好在它在网页上查看报表时支持html,所以还是可以通过javascript
来干一些很有意思的事的。在Desktop Intelligence中发现合并列不好用(路过的有知道的,还望指教!),所以本人选择了Web intelligence (简称Webi).

效果图:


在设计报表方面,和大多数报表工具没什么差别,下面说点“电视台不让说的”(引自郭德刚相声,用于指代非官方文档说明内容):
1. 单元格背景色:
将单元格内容属性由“文本”改为“HTML”,然后使用条件表达式,如:

= If ([Bs] > 4 ;
    "<div style='width:100%;height:100%;background-color:#B0B0F0;color:#000000;padding-top:8px'>"+[Dt]+"</div>" ;
    If ([Bs] > 3 ;
    "<div style='width:100%;height:100%;background-color:#B0B0B0;color:#000000;padding-top:8px'>"+[Dt]+"</div>" ;
    If ([Bs] > 2 ;
    "<div style='width:100%;height:100%;background-color:#FF0000;color:#000000;padding-top:8px'>"+[Dt]+"</div>" ;
    If ([Bs] > 1 ;
    "<div style='width:100%;height:100%;background-color:#FFFF00;color:#000000;padding-top:8px'>"+[Dt]+"</div>" ;
    "<div style='width:100%;height:100%;background-color:#00B050;color:#000000;padding-top:8px'>"+[Dt]+"</div>"))))


2. 超链接元素:
写完上面的代码后,这个就是“小儿科”了,如:

= "<a href='http://somewhere/?id=" + [Prvnc Id] +"'>" + [Prvnc Nm Ch] + "</a>"


3. javascript去表头:
在Webi中合并行后,表头上出了一个尴尬的问题,那就是要么多个表头,要么就是没表头,在请教专家无果后(路过的专家们,也请指点迷津),决定上javascript大法,
(javascript大法好啊!本人曾在sharepoint项目,屡试不爽!)
在报表的最下边,拖一个“空白单元格”上来,按惯例,还是改成HTML,然后上脚本,搞定:

<script src="http://code.jquery.com/jquery-1.6.4.min.js"></script>
<script>
var count = 0;
$('.s11 > tbody > tr').each(function()
{
   var height = parseInt($(this).height());
   if(height == 58)
   { 
     count++;
     if(count > 1)
     {   
       $(this).remove();
     }
  }
});
</script>


4. 报表筛选条件:
在Webi编辑查询时,可以在下面条件区域直接拖入字段,生成查询条件,我们先搞个“提示”类型,给后边用。



5. 报表导航:
结合上面的“超链接元素”,就可以生成带导航功能的报表了,首先要找到目标报表的id, 这个很容易,用IE Developer或Firebug,你懂的。
然后就是连接地址,BO提供了一个直接打开报表的连接,换上自已报表的id(iDocID=0001),加上参数,就轻松搞定。

= "<a href='http://somewhere/businessobjects/enterprise115/desktoplaunch/opendoc/openDocument.jsp?sIDTyp=CUID&sType=wid&iDocID=0001&lsSparaPrvncid=" + [Prvnc Id] +"'>" + [Prvnc Nm Ch] + "</a>"

这里要注意,条件字段要是字符型,否则不好用,切记!


posted @ 2011-10-14 13:14 瑞雪年 阅读(994) 评论(1) 编辑

2011年9月17日 #

装了win8 with developer tools,发现一个有意思的事情,win8已激活,有评估版字样,但没说过期的事儿,可vs11 express却有近300天的试用期,要知道vs.net express一向是免费的啊!

这个时间,应该能说明两件事,第一,正式版发布应该不会超过这个期限,第二,vs11 express可能要收费了!!!

Windows也有了自已的Store了,会是怎样的经营模式呢?象苹果一样收99刀许可费呢?还是干脆收工具的钱呢?

看发布会上那免费派送的开发机,又感觉微软不象差钱儿的样儿?

微软会向开发者收费吗?大家一起来说出你的观点!

ps. Win8开发预览版会不会永远也连不上Windows Store???!!!!

posted @ 2011-09-17 01:03 瑞雪年 阅读(611) 评论(8) 编辑

2011年9月16日 #

摘要: 翅膀本上Win8,一个字巨爽!“用Win8,还得用翅膀!”,昨天晚上下的iso,今早第一时间装上。所有设备全驱,包括摄像头。使用iso文件直接装两系统(使用EasyBCD设置ISO启动项),不用作启动盘,使用vhd,还分区都不用。无痛,超快度安装,参考资料:http://www.cnblogs.com/wpf_gd/archive/2011/09/15/2177810.htmlhttp://en.wikipedia.org/wiki/EasyBCDWin8自动创建启动菜单项,其实我看就是换了,因为当系统启动到选择win7还是win8时,感觉win8的内核已经启来了,选择win7的话,系统还是要阅读全文
posted @ 2011-09-16 11:18 瑞雪年 阅读(199) 评论(5) 编辑

2011年9月14日 #

摘要: 每个月总有那么几天,我们会看一个各大语言的排行榜,看到的Objective-C迅猛上窜,我们知道了,微软在移动和平板上失尽先机,随首老乔的退去,微软的这次反击真是太给力了!!!作为一个开发者,微软的开发平台和工具是我目前用过的一些中的最好的,Windows Store终于也来了,是啊,该来的还是会来的!那就让它来得更猛烈些吧!阅读全文
posted @ 2011-09-14 21:41 瑞雪年 阅读(28) 评论(0) 编辑

2011年9月12日 #

摘要: Small Program 是 Microsft Small Basic 的一个克隆版本(山寨),支持C#语言。特性:1. 支持完整的C#语法。2. 与Small Basic使用相同的API (参考手册)。3. 通过Small Basic的“Import ID”导入程序,并自动转换成C#代码。4. 导出生成C#项目,可用vs.net 2010打开。截屏:下载地址:程序: SmallProgram.zip源码: code.zip谢谢支持!!!阅读全文
posted @ 2011-09-12 18:44 瑞雪年 阅读(892) 评论(2) 编辑

2011年8月25日 #

摘要: 眼看着MonoGame就要"所有平台"(MonoTouch, MonoDroid, Mac OS X, Windows & Linux)通吃了,这倍增了我对XNA的兴趣,为了打下一个良好的基础,就从最基本的绘图函数开始吧。这个XNA Graphics API Library基于XNA的类库,实现了最基本最常用的绘图类库,如:画线,画矩形,画圆等。特点:1. API十分简单。2. 性能非常好。3. 支持多线程。代码示例:1. DrawingBatch drawingBatch = new DrawingBatch(GraphicsDevice); d...阅读全文
posted @ 2011-08-25 21:09 瑞雪年 阅读(1036) 评论(1) 编辑

2011年8月8日 #

摘要: 前几天还看MonoGame的Discussions在讨论支持Linux的问题,今天再一看,已经有可以运行的代码下了,Great!https://github.com/mono/MonoGame阅读全文
posted @ 2011-08-08 20:37 瑞雪年 阅读(73) 评论(0) 编辑

2011年7月15日 #

摘要: http://www.cocos2d-iphone.org/cocos2d-iphone-1.0.0.tar.gzI’m happy to announce that:after 3 years, 2 months and 4 days (1st commit)with more than 140 contributorsafter more than 2600 commitsafter63 releases(~41 commits per release)with more than 2500games in the AppStore (many games in the Top #10, 阅读全文
posted @ 2011-07-15 13:46 瑞雪年 阅读(37) 评论(1) 编辑

2011年6月26日 #

摘要: 在我们学习一门新的语言时,总要把它和我们熟悉的语言对比着来学习,就象学习英语时,都要记单词的汉语意思,来帮助我们对单词的理解和记忆。下面通过与C#的对比来学习Objective-C, 首先对比一下语言的定义: Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是在C的基础上,加入面向对象特性扩充而成的编程语言。目前,Objective-C主要应用于Mac OS X和iOS这两个NeXTSTEP的派生系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在任何gcc支持的平台上进行编译,因为gcc本地支持Objective-.阅读全文
posted @ 2011-06-26 20:11 瑞雪年 阅读(1330) 评论(5) 编辑

2011年6月16日 #

摘要: 今天看到了一篇关于Windows支撑世界的文章,不知怎的,我却想到了国货,这和国货有半毛钱的关系吗?!细想一下,原来我对Linux和国货的情感是相似的,所以,大脑才产生了如此的联想。会不会可以有篇叫《这是一个由进口货支撑的中国》的文章呢?!就是因为有你对Windows的“支持”,才有了今天的Windows支撑世界,如果你能支持国货,相信一定会有一天国货可以支撑中国,就像大家都支持Linux,Linux一定可以支撑世界一样!!! --即使这种支持很微弱,但也是一种支持!!!阅读全文
posted @ 2011-06-16 21:22 瑞雪年 阅读(28) 评论(0) 编辑

2011年5月20日 #

摘要: 之前ubuntu使用Canonical时,我曾尝试过,严重受挫(2010/06/13).这次在得知ubuntu转投OpenStack后赶紧再次尝试,真不愧时代进步啊!!!基本上全自动化,无悬念搞定!!!wget --no-check-certificate https://github.com/elasticdog/OpenStack-NOVA-Installer-Script/raw/master/nova-installsudo chmod 755 nova-installsudo bash nova-install -t cloudsudo bash nova-install -t co阅读全文
posted @ 2011-05-20 00:36 瑞雪年 阅读(765) 评论(7) 编辑

2011年5月17日 #

摘要: Mono喜迁新家-http://www.xamarin.com/http://tirania.org/blog/archive/2011/May-16.html发条新闻赚点人气!Today we start Xamarin, our new company focused on Mono-based products.今天我们开始Xamarin,我们公司关注基于Mono的产品。These are some of the things that we will be doing at Xamarin: 这是一些我们在Xamarin将作的:Build a new commercial .NET o阅读全文
posted @ 2011-05-17 08:19 瑞雪年 阅读(2202) 评论(12) 编辑

2011年5月7日 #

摘要: 说实话,写的太粗糙,真有点不好意思拿出来示人,可是又一想,写都写了,还怕给人看?!俗话有说,“丑媳妇早晚还是要见公婆”, 不是吗?!主要功能:通过自定义Razor(C#)表达式,对Orchard中Content的Handler添加处理程序,说白了,就是在内容有新建,发布等时,可以自已干点啥,比如:通过输入的内容创建另外类型的内容。支持IContentHandler 定义的全部事件:namespace Orchard.ContentManagement.Handlers { public interface IContentHandler : IDependency { void Activat阅读全文
posted @ 2011-05-07 19:42 瑞雪年 阅读(840) 评论(2) 编辑

2011年5月5日 #

摘要: 书接上回:Razor view for Orchard又添加了些新功能:1. Razor Filter for Body Part:正常Body内容,在开启此Feature后,可以启用对Razor表达式的执行: 1.1 开启Razor Filter 1.2 创建新页 2.3 查看效果 2.4 对比未开启Razor Filter的效果2. 在编辑Razor时 ,添加了TinyMce支持,可以作到HTML"所见即所得" 2.1 开启Razor TinyMce 2.2 使用TinyMce编辑Razor Page 2.3 查看效果3. 重新定义了Razor Model,添加了Con阅读全文
posted @ 2011-05-05 22:28 瑞雪年 阅读(1155) 评论(2) 编辑

2011年5月4日 #

摘要: 本人刚刚创建了个项目Razor4Orchard(http://razor4orchard.codeplex.com/), 是为Orchard(http://orchard.codeplex.com/)开发的一个模块,使用了RazorEngine(http://razorengine.codeplex.com/)用于在Orchard页面上使用C#代码定制更加丰富的扩展功能。可以在asp.net mvc3项目中测试通过后*.cshtml 代码直接的粘贴至页面上使用。如何使用:1. 安装Razor4Orchard模块:从http://razor4orchard.codeplex.com/是下载Orc阅读全文
posted @ 2011-05-04 21:27 瑞雪年 阅读(1085) 评论(6) 编辑

2011年4月23日 #

摘要: http://drupal.org/project/csharphttp://drupal.org/node/1136450Download Size md5 hashcsharp-6.x-1.0.tar.gz 8.23 KB ae6a76a65c7bdd5d81755e6ab542dff8csharp-6.x-1.0.zip 9.31 KB b4ca4f865b980f59292c9543dc757e97阅读全文
posted @ 2011-04-23 23:32 瑞雪年 阅读(27) 评论(0) 编辑

2011年4月16日 #

摘要: 准备:PostgreSQL RDBMS version 8.2 或更高 (推荐8.4)tasksel install postgresql-serverMono 2.10.1 目前的Ubuntu默认安装最高支持到mono 2.6.7,所以要上2.10.1可以自已编译,参见: http://mono-project.com/Compiling_Mono 编译mod_mono,可在这里下载源码: http://ftp.novell.com/pub/mono/sources/mod_mono/mod_mono-2.10.tar.bz2Apache 2apt-get install apache2添加阅读全文
posted @ 2011-04-16 23:09 瑞雪年 阅读(997) 评论(1) 编辑