Posted on 2005-01-17 11:14
听棠.NET 阅读(12153)
评论(244) 编辑 收藏 所属分类:
SmartPersistenceLayer
自从SPL2.0发布以来,得到好多朋友的关注,SPL只有在使用后,才会真正体会到它的魅力。
其实大家也看了很多关于ORM的资料,但理论性的较多,真正在使用持久层进行开发的朋友我想也不是很多。
SPL以其小巧、易上手、资料全、示例源码,可以让大家真正的体验一下持久层开发带来的乐趣!
目前SPL发布了3.1.0.5,在数据访问选择上,有了更多的选择。
为了方便大家对SPL的讨论与交流,请在这里发表意见或签名!
感谢各位!
Feedback
晕倒,听棠.NET,你发的DLL每收到阿,我的hotmail是不是有问题哟?
麻烦你发到topcoldheart@163.com.
谢谢!
Hotmail一般比较慢,而且可能会有问题。我又发到topcoldheart@163.com了,你只要建起来了,覆盖DLL就可以用新的功能了。新版本在积累一些修改以后一起发布。
哈哈,我也是要来问xuandme提出的时间戳问题的,没想到没问就解决了,麻烦请听棠老大也发给我一下最新的dll吧,谢谢~
我的邮箱xingzhe1980@sina.com
我看了你得sample,如果那些事务能够在business层或者facade层里面提交就好了:)。我们期望的是这些事务控制不在web层里面控制。不知道实现是否有问题?
其实我说的意思,比如一个提单的修改,它包含了提单基本资料,还有货主,货代等资料,如果我能在business层利用你得spl进行修改。这样可能在一个事务里面,同时存在insert/update/delete的操作。是否可行?
@wildfish :
你的意思我还是不太明白,现在SPL中的事务就是可以这样处理啊。比如一个提交,你只要把实体的Save,或是UpdateCriteria都可以加到事务里:
Transaction t=new Transaction();
t.AddSave...(aEntity);
t.AddUpdateCriitera(uc);
.....
你只要参考一下事务的文档,这些就自动加到事务中,进行统一处理。
如果数据库里的test表中字段a1为bit类型
那么查询获取数据时使用ObjCondition.AddEqualTo(testEntity.__A1,false);添加查询条件时会出现错误异常。请问是怎么回事?
恩,很不错,实用!比NH易用
3.0.0.5版本,什么时候发布?
能发给我一份,谢谢!
email: nk912114@163.com
@nk912114 :
已经发给你了。
至于发布,我想还要等一阵子,想多加强一些功能。
不公开源码,但免费使用。
而且公开源码,大家乱改,最后版本乱七八糟。
听棠兄,后来偶明白了,其实在外观层,传入多个spl的object,自行控制事务就行了:)。还有就是你的sample,如果有一些三层应用的,我相信对更多的人会有吸引力,会让更多的人用这个spl:)
呵,其实当时我想建三层应用框架的,但我后来想了想,这会让大家觉得层与层调的太麻烦了,误以为SPL会这么麻烦。所以我的sample还是以直接的调用方式,而三层架构在SPL上也是非常之容易的。而且也不能以三层而三层,不同的项目规模决定真正的分层意义。
希望以后发布能打包为安装文件,这样就不用再去下载Infragistics NetAdvantage了
能不能提供一个稳定的下载啊,现在这个我实在是没有办法下到机器上啊,总是半路就不行了,重新开始后竟然是从头开始下,真晕……
:)主要是想看看做成remoting 或者 webservice是否可行。所以才不得不使用n层结构
@wildfish :
做成Remoting或是WebService是完全可行的,你可以在SPL层上建一个业务Facade层,用于业务数据返回,然后WebService调用Facade层的数据即可。SPL作为最低层的数据访问不会影响上面的。
呵呵,我的问题最多,如果用remoting架构或者webservice架构,我所加的facade层是否可以用一个基类,用静态的构造函数来引导配置?然后里面所有的类都来继承他?
签名!
也希望听棠能够开源,让我们也学习学习,真不愿一直这样子徘徊在一些表面上的东西,想更深入的学习一下.net
我们现在的项目中用的DAL不能实现复杂的查询。比如单张表的操作还可以直接对表映射的实体类来操作,但涉及到多张表,就只能写sql了。不知道听棠您的spl实现了对多张表的操作了吗?
@chengyayu :
查询,这本身是一个最具复杂性的东西,因此不管是什么,都无法很好的解决,包括SPL,NH等。
对于查询,我的建议是使用视图,用视图可以在数据库层把数据处理好,而且在性能方面也是比较好的,采用视图后,在SPL也只能写SQL语句来实现查询,这其实没有什么不对的地方,因为查询已经不在OO的范畴了。我并不推荐象NH一样,推出一个HQL的语法,这会让好不容易可以从复杂中解脱出来的程序员又开始新的复杂的HQL。
之所以对视图不采用实体映射,因为视图的随时变化性会让映射失去意义,而且视图不具有OO的特性,不需要CRUD。
因此,在SPL中,对查询的使用是:建立自己的视图,然后用相对比较简单的SQL语句执行。
>>是的,int型在数据库里也是不允许Null的。谢谢支持。
天啦!在我遇到的项目中,不仅int允许为空,并且是否为空本身也是一种状态,0和空表达的是不同的业务涵义。象sql中的column is null这样的约束也是常用的。本人认为对Null状态的处理是持久层应该具备的基本能力之一。
int类型是处理最快的数据类型之一,也是SQL Server比Oracle性能卓越的主要体现。数据库设计中多数属性都可能基于int来实现。
Field-Property到Column的映射方式是一种非常便利的处理方式,被广泛重视应用于属性映射中(如XPO)。但是在.net环境下所有ValueType类型(对应java中的primative类型)都不支持null,从资源调度的角度看这是非常合理的。java中的Primative类型有包装类,而.net中是自动Boxing的。所以直接采用Field-Property是无法处理Null状态的。为每个Can null的Column定义一个bool类型的Field来记录Null状态是可行的,但是代价太大,过于铺张。因此,如何处理ValueType的空值就需要使用一些技巧来实现(听棠.net不妨借鉴一下Borland的ECOII)。
我现在正在学习,也正在用spl3.1发现很好用,谢谢。
听棠兄辛苦了.
听棠兄
我在用spl3.1,的Transaction 类时,想调用DoDeleteCriteria方法进行事物处理时,怎么找不到该方法.请帮忙。谢谢
布舍依伊
谈点看法。
昨天第一次看到这个spl及其工具,下载后整体上看了一下,认为这个框架解决了某些持久层的问题,易于使用,对于简单业务以及OO入门者会有较大的帮助。但这个框架离真正的持久层还有非常大的距离。
本人认为持久层要解决的问题在于四个方面:
一是抽象数据层。这一层的目标是在业务层的模型构建中可以完全不需要关注数据层。因为是抽象的,所以一定是可以扩展的。具体数据层只需要实现抽象层所需要的接口,并且接口应该完全开放。大部分抽象数据层都采用适配器模式,包括ADO.NET。基于ADO.NET的持久层至少应该可以支持已实现IDbConnection、IDbTransaction、IDbCommand和IDataReader接口的数据库引擎,而不是框架自己指定的引擎。至于不同数据库驱动间SQL的差异性应该交给每个驱动器的适配器自己去处理,而不应该由框架来包办。
二是CRUD。在目前的开发环境下,还不能仅仅只考虑单一业务对象的CRUD,还必须考虑一簇相关对象的CRUD。这簇相关的对象不仅是事务共享的,而且还携带了业务对象间的复杂关系。
对于数据加载。本人一直无法接受HQL这样的脚本,感觉完全是冒OO之名,行结构化之实。本人认为软件界凭空冒出的一些概念破坏了业务建模的纯净。将一个应该完全隐藏起来的复杂性暴露给了软件的使用者。这方面SPL采用的是一个Condition对象。只可惜作者对这个对象的设计过于草率,不能完成所负载的使命。
三是关系。没有关系的OO是没有任何意义的,单纯的实现CRUD毫无价值。业务关系包括聚合、关联、继承、体系化等。通过自定义的关系,持久层有义务自动筛选、加载、更新和删除相关的对象。关系的映射从来都是持久层的重点。
四是工具。工具是为了便于开发,加速开发,尽可能减少开发中可能出现的错误。NUnit如果没有NUnit GUI根本无法被人接受。但是NUnit的GUI又与Visual studio完全脱节,受以无法象JUnit一样受到开发者的广泛欢迎。SPL附带的代码生成工具只能从数据库元数据中导出符合框架要求实体类结构。这是很不够的,数据库中的元数据信息根本无法表达映射过程的全部需要。除了复杂的业务关系外(例如自引用的树型关系就无法通过数据库元数据来表达,至少SQL Server是无法表达的),本人认为,开发工具应该考虑到开发应用的多样性。映射所需的全部细节来源于某个公共的规范体。而从数据库只能导出相关的元数据到这个规范体中这样开发者有机会将其它信息补齐。例如,supplier是数据库空间的列名,Supplier是对象空间的属性名,而“供应者”才是业务空间的属性名。数据库的元数据中只能表达数据库空间的列名。
SPL的文档的确非常齐备,令本人肃然起劲。仅从这一点就可以看出SPL的作者是一个严肃认真的、负责任的软件开发者,本人自愧不如。文档是软件本身的一部分,文档不全只能说明这个软件还没有最终完成。本人前年就写出了一个持久层框架(已应用于多个项目,支持从Visio、PowerDesigner导出代码并且代码的导出支持扩展),但是到现在文档还没有补全。仅从这个角度来说就必须向作者努力学习。
@布舍依伊 :
你要下载新版的3.1.0.5,我已经提供下载了。
@barton131420@163.com :
你的建议很好,我也学到不少。不过,要实现这么多也确实挺困难的,而且也是势单力溥,可能也没有那么多精力,毕竟我也有自己的工作与生活,所以这个SPL只能算是简单的持久层,但我觉得我目前的SPL可以满足中小型系统的开发,先凑和着。
听棠兄﹕
我是今天到﹕
http://www.cnblogs.com/tintown/archive/2005/04/11/135582.html下載了一次,使用時還是沒有﹕DoDeleteCriteria方法
我看PersistenceLayer.dll的修改日期時是﹕
2005年4月12日, 上午 09:51:37
幫忙看看﹐是我下載錯了﹐還是怎樣?。謝謝。
首先,感谢您提供了这个东东,减少了劳动强度!
请问,可以免费用于商业用途吗??
大哥,自从sf2.0发布后,已经有很多人把我当成spl的作者,并一直在不懈的问这么一个问题:spl开源吗?
我的回答一律是“您可以用反射器查看”,不知这么回答是否合适啊 ?
另外,我也想知道 ,spl准备开源吗?
@jy :
可以免费使用,当然是因为免费的,所以如果遇到问题或是由此引出的损失,我是不承担责任的。
@Notus@下雨吧~~ :
哈哈。我没准备开源,一呢是我的辛苦努力,二呢不想被搞的乱七八糟。要是他们问,你给个指向过来就可以了。
好东西,原来SF2.0所说的作者就是老大您呀!以前接触过Hibernate,转。NET后也一直钻研NH方向,无意看到SF2.0,才有缘拜读老大的文章。有意思,用用先,再请教!
用着,感觉不错,有些小问题也向听棠请教了,希望能越搞越精彩.支持.
听棠老大,我是个新手,刚开始用你的spl
有个问题请教:就是RetrieveCriteria 获取标准 时候,
c.OrderBy(StudentEntity.__NO); //按学号排
我的dll里怎么么这个OrderBy方法?
还有要是按照多个字段排序怎么做?
order by id desc, bbsid desc
是否为:
c.OrderBy(StudentEntity.__NO,StudentEntity.__BBSNO);
因为我下的dl中没这个方法,不能测试,希望大家给我这个新手讲讲
谢先
@overred :
你好,文档中可能是我写错了,不是C应试是rc,因为这个OrderBy是RetrieveCriteria的方法。
如果要多字段排序,只要使用:
rc.OrderBy("Id",false);
rc.OrderBy("bbsid",false);
按顺序写就可以按次序来排序。
听棠.NET 你好,请教一个问题,
假设有两个实体:
Company ( id name )
department ( id pid name ) pid 指所属Company的id.
在。net 中对于这两个实体我用如下表达方式:
Company
departmentCollection 集合类
department
通过实例化一个company ,便可以通过 company.departments 可以到属于该公司的所有部门的集合,company.departments[i] 得到一具体部门。那么请问 我这种方式可以使用 SPL吗?
@小李程式™ :
我在MSN上已经回答了,可以采用RetrieveCriteria的方式来获取department的集合。
提个意见:
在取数据或保存数据的时候,能否考虑直接填充DataSet或是DataTable或通过DataSet或是DataTable中的数据进行保存呢?
@jy:
老兄。。你那个DataSet与DataTable也算是业务层的吧。SPL怎么可能呢,SPL就是要让你在OO层面上思考问题,解决问题的。
签名~~
不知道用到大数据量交互的项目里性能如何?有兄弟进行国这样的测试否?
有个问题请教一个,我在一个表中定了一个主键,并定义他为自动增长后,我每次对该表进行添加记录的SAVE时都会出错(我没有对自动增长的项进行附值),错误如下:
CLASS_INFOEntity对象或其关联对象中有自动编号属性,不能指定特定值!参考:Cannot insert explicit value for identity column in table 'CLASS_INFO' when IDENTITY_INSERT is set to OFF.
请问有什么会造成这样的错误。
自动代码生成器,生产的代码没有自动加上using System.Data;命名空间。要收工自己做,比较麻烦。可不可以改进一下?
看了些vs.net的资料,以为懂了,便想用.net 做东西,因为需要页面载入后同时显示产品类别及其相应的几个产品这样的效果,就到网上查,就发现什么存储过程,分层结构,面向对象,感觉.net自己的示例都没有达到这个要求一样(.net示例分布式好像都不是这种),开始晕了,至今困在之中一事无成,我想如果我没看见这些,可能我已经实现了一个像示例那样的分布式程序了。
现在我想在这里问一下各位高高手,
结合spl怎么实现这个效果,如果听棠太忙,也请其他朋友给予指点,
前端能不能用objdatasorus绑定
谢谢
SPl 中
以datatable方式返回的时候,dt里面的内容似乎是通过映射classmap.xml 的方式返回字段的,为什么不返回类的属性呢?
比如说: 表里面有firstname、lastname
定义了 lastname与firstname的映射以后
我在类里自定义了属性 fullname
public string fullname
{
get
{
return firstname+' '+lastname;
}
}
我的目的是返回datatable的时候能有个 fullname 列
签名
我昨天刚下了StellaForum,刚接触SPL,很感兴趣,我会一直关注下去
支持
@spacedragon :
你好,你的建议是好的,功能也是好的,不过,要实现这样的功能还是有点难度的。不知道NH有没有实现,是如何实现的。
我发现一个性能问题,就是在获取实体的时候:
StudentEntity student=new StudentEntity(); //实例化
student.Id=5; //给主键赋值
student.Retrieve();
假设物理表Student包含有CLOB字段,保存如“合同”,“人头照片”,“学校评价”,文件流附件等大文本字段。可能80%的xx.Retrieve()是不需要这些大文本字段的。我认为可不可以这样增加一个XML标记“IsTimeLapseRetrieve”是否延时获取,默认为False;
<class name="StudentEntity" table="Student" database="MyDB" >
<attribute name="Id" column="Id" type="Integer" increment="true" key="primary" />
<attribute name="Name" column= StudentEntity "Name" type="String" />
<attribute name="Remark" column= StudentEntity "Remark" type="string" IsTimeLapseRetrieve="true" />
</class>
然后:
student.Retrieve(); //从数据库读取ID,Name字段信息
string sss = student.Remark //再次从数据库读取Remark字段
还有一个改进的建议
StudentEntity student=new StudentEntity(); //实例化
student.Id=5;
student.Name ="无名";
//student.Age 不设置值,默认应该为空
但是对类的实例来说Age(int)不能为Null;
这样Age不处理也是0,2个问题出来了,一个从性能上考虑不需要更新那么多字段,第二个是记录字段空值的问题。我觉得可以有2个方法来解
决
(1)XML特殊空值标记(SpecialNullValue):
<class name="StudentEntity" table="Student" database="MyDB" >
<attribute name="Id" column="Id" type="Integer" increment="true" key="primary" />
<attribute name="Name" column= StudentEntity "Name" type="String" />
<attribute name="Remark" column= StudentEntity "Remark" type="string"
SpecialNullValue="-9999" />
<attribute name="Money" column= StudentEntity "Money" type="Double"
SpecialNullValue="-9999999.99" />
</class>
StudentEntity student=new StudentEntity(); //实例化,并且用SpecialNullValue初始化各字段成员
student.Save();//再将特殊值转换为System.Data.DBNull.Value

(2)附加各字段是否为Null属性
public int Age
{
get
{
return this.m_Sex;
}
set
{
this.m_Sex = value;
}
}
public bool AgeIsNull
{
get
{
return this.m_SexIsNull;
}
set
{
this.m_SexIsNull= value;
}
}
听棠兄﹕
有問題想請教:
在C#中我寫了一個函數GetFlowDefinitionID﹐為了取得一個ID,之后在for語句中調用﹐且用到了transaction類中的doSaveObject方法類進行事務處理,問題出在在for語句中第一次調用GetFlowDefinitionID沒有問題﹐第二次調用時就有問題﹐錯誤如下﹕
***对象操作出错!参考:数据库操作异常:Index #0\nMessage: 已超過連接逾時的設定。在作業完成之前超過逾時等待的時間,或者是伺服器未回應。\nNative: -2\nSource: .Net SqlClient Data Provider\n"
程式結構大致如下﹕
//取ID的函數
private int GetFlowDefinitionID(string no,decimal version)
{ int retint=int.MinValue;
try
{
RetrieveCriteria rc=new RetrieveCriteria(typeofFlowDefinitionEntity));
Condition c=rc.GetNewCondition();
c.AddEqualTo(FlowDefinitionEntity.__NO,no);
c.AddEqualTo(FlowDefinitionEntity.__VERSION,version);
FlowDefinitionEntity dt=(FlowDefinitionEntity)rc.AsEntity() ;
if (dt!=null)
{
retint= dt.FlowDefinitionID;
}
rc=null;
c=null;
dt=null;
return retint;
}
catch(Exception e)
{
ApplicationException ae=new ApplicationException(e.Message);
throw ae;
}
}
//處理函數
public bool saveFlow(flow define)
{
//開始事務處理
Transaction tran=new Transaction();
tran.IsForceCommit=true;
try
{
ArrayList flowparamlist=new ArrayList();
flowparamlist=define.Params;
FlowParamEntity myParamsEntity=new FlowParamEntity();
FlowParam myParams=new FlowParam();
for(int i=0;i<flowparamlist.Count;i++)
{
myParams=(FlowParam)flowparamlist[i];
myParamsEntity.FlowDefinitionID=GetFlowDefinitionID(define.No,define.Version);
myParamsEntity.ParamNo=myParams.No;
myParamsEntity.Retrieve();
myParamsEntity.Description=myParams.Description;
myParamsEntity.Kind=(int)myParams.Kind;
myParamsEntity.Value=myParams.Value;
//提交事務
tran.DoSaveObject(myParamsEntity);
}
//釋放物件
flowparamlist=null;
myParamsEntity=null;
myParams=null;
}
catch(Exception e)
{ //回退事務
tran.RollBack();
ApplicationException ae=new ApplicationException(e.Message);
throw ae;
}
//釋放物件
finally
{
tran=null;
}
听棠兄﹕
出現上的問題時我的sql server 2000服務器是沒有問題的﹐
經過我多次測試﹐發現在事務處理時,如果用for語句多次調用同一
函數來查詢資料是就會有問題。
您看看這是那方面的問題﹐如何避免。
Ps.
不好意思上面的代碼中忘記寫上提交﹕tran.Commit()了.
@建平 :
你提的问题非常好,有些朋友也可能没有注意到,使用Do处理事务,在Commit之前,这些被操作的表都会被锁上,因此,此时你再使用“非要事务”的Retrieve方法时,肯定会死掉的。因此我提供了DoRetrieveObject()、DoRetrieveCriteria()的事务获取方法,所以,只要你使用这两种方法来实现就不会有问题了。
哈哈。。。
因此,要记住的是,如果使用新的事务机制(Do)的话,那么从begin事务到commit,之间都要使用do的操作方式。。
具体实现请参考:
http://www.cnblogs.com/tintown/archive/2005/05/25/162315.html
有个小建议。关于实体的xml文件的问题。期待能够根据数据库自动生成。在VS中可以使用添加组件,然后选择DataSet;然后把服务器资源管理器中打开的表拖到设计界面就会自动生成DataSet;希望能有个自动生成实体的方法。这样可以大大提高使用性能。
对了,也可以考虑设计一个可执行软件自动生成你的实体文件。
呵呵。谢谢了。还有个建议,视图还是希望能够生成实体的好。查询中经常需要使用视图。特别是多表的数据显示的时候。
首先感谢听棠老大的的spl
但是我想请教个问题:
你的SmartRobot3.1代码生成器是用c#窗体写的吧?
能否给小弟讲讲如何制作的(简单几句)
现在我对窗体程序特别感兴趣
非常感谢!!
对啊,是用c#在vs中的做的吗?
教教我们这些新手吧!谢谢谢谢
听棠兄﹕
在近開發的系統中要用到自定義帳號﹐我之前也有看過SPL3.1對多帳套的支持。
現在有几個疑問想請教﹐耽擱你几分鐘時間﹕
1.例如﹐用要自定義三個帳套﹕培訓帳套﹐測試帳套及正式上線使用之帳套.
因SPL對多資料庫類型的支持﹐所以這三個帳套的資料庫類型有可能不一樣,當然資料庫表的
結構會一樣只不過在特定資料庫類型中會有點差別﹐如在ms sql server 2000中
的numeric,在oracle中就用number表示,在ms access 中用的是numeric.
而您說多帳套只要改變"數據源"就行﹐因為實體(entity)是共用一個.
我的疑問是﹕在不同資料庫類型之間實現多帳套﹐可以共用一個實體嗎?
在相同資料庫類型時可以共用一個實體一定可以。不知道你在不同資料庫
的各種數據類型與實體的資料類型是怎么對應的?
2.您的多帳套的實現是用append....的形式﹐即要程式員來處理﹐而目前帳套原則上是用戶自定義的﹐不會有程式員參與的情況下進行的,為了做到讓用戶自定義﹐
我只好將這些連接資料庫的信息存到一個地方(不是databasemap.xml),每次切換帳套的時候找到聯接資料的信息﹐之后再用Setting.Instance().apppd。。。,才可以.
請問我將連接信息放到databasemap.xml中直接在用的時候用一個變量來切
換資料庫﹐這樣行嗎?如我在databasemap.xml配置如下﹕
<?xml version="1.0" encoding="utf-8"?><map>
<database name="Messagecenter1" type="MsSqlServer">
<parameter name="Provider" value="SQLOLEDB.1" />
<parameter name="Password" value="19784122" />
<parameter name="Initial Catalog" value="Messagecenter1" />
<parameter name="User ID" value="sa" />
<parameter name="Data Source" value="(local)" />
<classMapFile path="ClassMap.xml" />
</database>
<database name="Messagecenter2" type="MsSqlServer">
<parameter name="Provider" value="SQLOLEDB.1" />
<parameter name="Password" value="19784122" />
<parameter name="Initial Catalog" value="Messagecenter2" />
<parameter name="User ID" value="sa" />
<parameter name="Data Source" value="(local)" />
<classMapFile path="ClassMap.xml" />
</database>
</map>
我在用的時候,直接用....DatabaseName=connname,
這里的connname是個變量﹐變量的值就是前面定義的﹕Messagecenter1或Messagecenter2.為了少一個帳套與資料庫的對應我就用帳套代號﹐當資料庫名﹐
即帳套代號和資料庫名都叫:messagecentr1或messagecenter2。請問這樣可以嗎?本來自己先試再來問您﹐因這几天都有點事﹐就直接問您了﹐不好意思。
3.請問在使用多帳套的系統中在何時啟用SPL較好?.
您給我們用的spl例子當中您是在Global.ascx文件中的的Application_beginRequest的時候啟用的﹐您用了一個StartSPL函數。且用了一個
Application["Y"]變量來記錄﹐如果在多帳套系統中這樣就有問題﹐因每次我都有可能
切換帳套﹐如過放到類的構造器中﹐效力﹐性能有不很好﹐所以想請問一下﹐在
何時啟用spl較合適﹐謝謝。
所有的评论都看了一篇,除了建平的繁体字,准备下载下来看看,好用的话准备以后就永它做数据访问层了.
@ 建平 :
1.SPL本身是支持异构数据库的。你说的ORACLE、SQL、ACCESS使用的都是数字,那么对于SPL来说,都是一样对待的,所以实体完全可以正常于这三种数据库上。
2.我之所以采用Append的方式来追加“数据源”,就是为了让客户来自定义,这里你忘了一个原则,虽然你是多帐套,但必须有个"基本帐套",这个"基本帐套"是最基本的数据库,里面记录了客户自动了的帐套数据库信息,所以这样,你就可以从这个"基本帐套"里读取客户自定义的帐套信息,进行Append实现动态的帐套数据库加载。
在登录界面上提供"选择帐套数据库"的功能,选择后把选中的数据源名称放到Session中,只要在实体操作的地方,都使用DatabaseName=Sessino["xxx"]。这样,不同的用户可以选择自己的帐套数据库执行了。这些我都在项目中都已经实现过。。
3.数据库的加载,还是应该在最初就加载,这些信息量其实不大的,你象帐套数据库,由于它们的结构都是一样的,只是数据源不同,所以只要加载数据源就可以了,实体只要加载一次就可以通用的。性能没有任何的影响的。
听棠兄﹕
1.能正常独立于这三种数据库之上,就可以了,那我就可以放心的使用了,之前还有点在想是否要为每一种资料库类型开一套实体层.
2.你说得对,是要有个“基本帐套”,我也在想如果不搞个“基本帐套”是不好做多帐套,那我就明白你说的用append的方式来切换“数据源”了.
3.如果对性能影响不大的话,那就好,我那就在最初加载.谢谢
ps.
我白天在公司上班,因是台资企业所以是用繁体字,晚上回到寝室里是用的简体了.不好意思,下次我转换成简体之后再发上来.
听棠兄﹕
不知道你做过后台是oracle的多帐套没有?
在ms sql server 中和ms access中到好做,因为让用户自定义帐套时,可以动态的将资料库和表建好,但是在oracle中要将这个”数据源“建立起来,好象有点难度,据我所知道的oracle中是用他自己的工具:net easy configare 。。。来建立
数据源的,我们怎么来动态建立这个数据源名称?之后才可以用这个名称来切换呢?
不知听棠兄是怎么处理的,谢谢.
想问一下,如果视图也用你生成表格的方式生成文件,是否可以进行查询?
如果可以的话,你的工具能增加视图直接生成文件的功能吗?
@莫秋:
也可以的,不过,要是视图也生成XML映射生成对应的实体类,对于查询是没有问题,不过,由于这是视图,不具有实体的CRUD,因此,这应该不属于真正的实体。
再者,对视图的查询一般是比较复杂的,SPL也只能提供简单的查询,要是复杂的话,还得使用SQL语句啊。
而且视图的修改相对表来说更频繁,比如视图中忘了显示某个字段了什么的,这要去重新配置XML与实体的属于,我想复杂远远超过了方便性。
因此,我不提倡这种,而且在我的工具中也不想增加这个功能(多数据库对视图的处理也未必一致),如果你实在是喜欢用这个,那只能自己配XML与实体类了。
1、谢谢听棠兄对视图使用的指点.
2、我在使用你提供的例子的时候不能编译通过:
类型或命名空间名称“UltraWebGrid”在类或命名空间“Infragistics.WebUI”中不存在(是否缺少程序集引用?)
类型或命名空间名称“UltraWebTab”在类或命名空间“Infragistics.WebUI”中不存在(是否缺少程序集引用?)
我尝试添加了引用,浏览对象发现确实没有这两个东东.还有对于BusinessEntity是不
3、是否在引用中添加了BusinessEntity.dll后就不必再添加BusinessEntity项目了呢?
4、EntityAction怎么使用好像没有提到;
我的代码:
PersistenceLayer.EntityContainer Bjs = new EntityContainer();
Bjs = BusinessEntity.xy_banjiEntityAction.Retrievexy_banjiEntity() ;
DataGrid1.DataSource = Bjs;
DataGrid1.DataBind();
第二句:未找到名为[xy_banjiEntity]实体类相对应类影射信息!
楼主,你的spl很好用,帮我节省了很多时间
但我现在碰到一个问题:
我是使用sql server2000资料库,原来资料表的拥有者是dbo
但现在因为要放到正式资料库上,它上面的拥有者是PubUser
结果一放上去,就出错了,有什么办法可以解决这个拥有者不是dbo的问题吗?
希望楼主能够帮忙救救我?
我的mail是:tsoukw@163.com
听棠大哥:
久闻其名,今天我来报个到,以后请多指教!
I want and will use it! and thanks a lot!
有时重新编译项目后会出现如下错误,重启机器后又正常了,是什么原因?
配置错误
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
分析器错误信息: 访问被拒绝:“Oracle.DataAccess”。
源错误:
行 196: <add assembly="System.EnterpriseServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
行 197: <add assembly="System.Web.Mobile, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
行 198: <add assembly="*"/>
行 199: </assemblies>
行 200: </compilation>