Posted on 2005-11-08 16:51
听棠.NET 阅读(8514)
评论(79) 编辑 收藏 所属分类:
SmartPersistenceLayer
Feedback
我的毕业设计就是用这个来做的,感觉很不错。
半年没你的消息,今天看见更新的消息真的很高兴,祝SPL越来越强大。。。
感谢更新。不过我插入数据的时候,如果数据类型为日期型,而且我把实体的初始属性取消了。也就是我想插入null,怎么会出错?
非常感谢听棠的更新,SPL非常好用,使用它已经大半年对了。也用它作过了几个项目。
开发效率和各个方面都有很大的提升。
祝SPL应用的越来越广泛。
@子扬 :
对日期字段是不允许插入Null值的,不信你直接使用SQL执行一下。因此应该默认插一个1900-1-1的。取出来时进行比较。
@听棠.NET
你的mysql是哪个版本?我用mysql4.1数据库上date是支持NULL值的~~
@mikespook :
MySql5的最新版本,呵呵,在MySQL里确实是可以的,但在对实体的属性类型为System.DateTime的进行赋值时,无法赋上System.DBNull.Value啊:
CreateDate=System.DBNull.Value;这样的语句是报错的。
而在我的SPL中,对于实体的属性我是需要强类型的,强类型可以带来N多的好处。
因此目前无法实现给DateTime型赋Null值啊!!
用minivalue,当为minivalue时转为null
@iamsunrise :
谢谢你提供的建议,我觉得非常好,目前SPL已经实现了DateTime.MinValue的赋Null功能,下载过的朋友请重新下载一下,目前版本号为3.2.0.1
听棠老大就是强啊~~!!支持
不过请问这个支持mysql到哪个版本的?
@狮子座小哲 :
我是用MySql 的.NET Connector连接的MySql5,我觉得MySql4应该也可以吧,因为连接与访问与数据库基本上不会有太大的关系,主要是Connector的功能。相信是支持的
请教,我遇到一个问题,不知道是不是BUG,
当我的数据库字段和对象实体的名称不一样的时候,我使用以下方法:
private void dgrdSort_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
UpdateCriteria uc = new UpdateCriteria(typeof(StoreSortEntity));
Condition c = uc.GetNewCondition();
c.AddEqualTo(StoreSortEntity.__SERIAL, e.Item.Cells[1].Text);
uc.AddAttributeForUpdate(StoreSortEntity.__NAME, ((TextBox)e.Item.Cells[0].Controls[0]).Text);
if(uc.Perform()>0)
lblInfo.Text = "祝贺,更新成功!";
else
lblInfo.Text = "很抱歉,更新失败…";
dgrdSort.EditItemIndex = -1;
bindSort();
}
就会出现错误:
数据库操作异常:Index #0 Message: 列名 'Name' 无效。 Native: 207 Source: .Net SqlClient Data Provider
当字段名和属性名一样时候正常。
我仔细检查了。应该不是我的错误.
我的列不是Name, Name是对象属性名,列名是Name_stso
@子扬 :
那你看一下ClassMap里,是不是把这个Name属性名映射为Name_stso的字段名了。
<class name="StoreSortEntity" table="StoreSort" database="WXStore">
<attribute name="Serial" column="Serial_stso" type="String" key="primary" />
<attribute name="Name" column="Name_stso" type="String" />
<attribute name="TopID" column="TopID_stso" type="String" />
<attribute name="Orders" column="Orders_stso" type="Integer" />
</class>
不会,我都看了。其他方法都正常,就是不能用UpdateCriteria()
@子扬 :
其他地方都正常的??好的,那我看一下,是不是UpdateCriteria里有BUG。不好意思啊。
@子扬 :
你好,你报的确实是个BUG,当时没有对属性名进行转换成字段名,在其他地方都是处理的,现在已经修改好了,请重新下载一下,目前下载版本已经更新为3.2.0.2
Thanks a lot tintown,i will use it to do something!
RetrieveCriteria的orderby是肯定好用,我一直在用:
RetrieveCriteria rc=new RetrieveCriteria(...);
rc.OrderBy(...);
我在用SmartPersistenceLayer做项目时经常发生配置错误,我把错误页的内容拷下来了,麻烦 听棠.NET 兄给看看。谢谢。(有点长 :))
“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------
配置错误
说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。
分析器错误信息: 访问被拒绝:“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>
源文件: c:\windows\microsoft.net\framework\v1.1.4322\Config\machine.config 行: 198
程序集加载跟踪: 下列信息有助于确定程序集“Oracle.DataAccess”无法加载的原因。
=== Pre-bind state information ===
LOG: DisplayName = Oracle.DataAccess
(Partial)
LOG: Appbase = file:///F:/Test
LOG: Initial PrivatePath = bin
Calling assembly : (Unknown).
===
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Post-policy reference: Oracle.DataAccess
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/root/1eed63df/97764a88/Oracle.DataAccess.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/root/1eed63df/97764a88/Oracle.DataAccess/Oracle.DataAccess.DLL.
LOG: Attempting download of new URL file:///F:/Test/bin/Oracle.DataAccess.DLL.
LOG: Publisher policy file is not found.
LOG: No redirect found in host configuration file (C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet.config).
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\config\machine.config.
LOG: Post-policy reference: Oracle.DataAccess, Version=9.2.0.2102, Culture=neutral, PublicKeyToken=89b483f429c47342
--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:1.1.4322.2300; ASP.NET 版本:1.1.4322.2300
我在用条件时如果有两个并列的条件它就不行,即:
RetrieveCriteria rc=new RetrieveCriteria(typeof(SuppliersEntity));
Condition c=rc.GetNewCondition();
c.AddEqualTo(SuppliersEntity.__COUNTRY,"USA);
c.AddEqualTo(SuppliersEntity.__REGION,"OR");
它只能去到USA的记录,而不能取到同时符合"OR"的记录
@zky:
你那是权限问题吧,DLL无法访问你看看权限吧。不是SPL的问题。
@domy:
如果是OR的关系,不能这样写的,你那样写是AND关系,你可以看看SPL的专门的介绍Codition的文章,一个Codition内部是and的关系,而Condition与Condition之间的关系是OR的关系:
RetrieveCriteria rc=new RetrieveCriteria(typeof(SuppliersEntity));
Condition c=rc.GetNewCondition();
c.AddEqualTo(SuppliersEntity.__COUNTRY,"USA");
Condition c2=rc.GetNewCondition();
c2.AddEqualTo(SuppliersEntity.__REGION,"OR");
这样就可以了,那么如果要实现“A and (B or C)”这样的关系,可以使用OrGoup对象:
RetrieveCriteria rc=new RetrieveCriteria(typeof(SuppliersEntity));
Condition c=rc.GetNewCondition();
c.AddEqualTo(SuppliersEntity.__COUNTRY,"USA"); //A
OrGoup og=c.GetNewOrGoup();
og.AddEqualTo(SuppliersEntity.__REGION,"OR"); //B
og.AddEqualTo(...............................................) // C
请去
http://tintown.cnblogs.com/archive/2004/11/15/64054.html 看吧。
建议有空的时候写出一份完整的帮助,让用户可以方便地使用,让初学者也容易入门
to 听棠.NET :
我想实现的就是AND关系阿,用的方法也没有错,可就是实现不了,所以怀疑是不是bug,你试一下就知道,呵呵
to 听棠.NET:
今天又试了,还是不行,想实现AND关系的时候,它取得的记录只会满足第一个条件,而不会满足第二个条件,请听棠看一下是不是SPL的bug来的,我都看了文档确认我的操作没有错,就是:
RetrieveCriteria rc=new RetrieveCriteria(typeof(SuppliersEntity));
Condition c=rc.GetNewCondition();
c.AddEqualTo(SuppliersEntity.__COUNTRY,"USA);
c.AddEqualTo(SuppliersEntity.__REGION,"OR");
@domy :
这个AND的关系是不可能有BUG的,因为SPL不是我现在写的,而是已经用了三年了,做过几十个项目了,这种条件查询是最经常使用的,不可能存在这样的BUG,你的代码中c.AddEqualTo(SuppliersEntity.__COUNTRY,"USA); USA这里应该是"USA"吧。
如果你还是不行,请使用rc.SqlString属性可以看到最终要执行的SQL语句的,看SQL语句是不是有问题!!
呵呵,不好意思,是我太大意了,
在c.AddEqualTo(SuppliersEntity.__REGION,"OR"); 这一句里把c.AddEqualTo写成了c.AddNotEqualTo,结果怎么样都取不到我想要的结果。谢谢听棠
@ 听棠.NET:
请问SPL3.2的版本和以前的SmartRobot版本兼容吗?还是要重新下载?谢谢!
听棠你好:
我是一名初学者,问一个幼稚的问题,如何在winform中配置数据库连接,可否给一个简单的例子 ,以acess数据库为例
@www_wwj :
你把DatabaseMap.xml与ClassMap.xml放在CS项目的bin目录里。
在main方法中进行初始化:
PersistenceLayer.Setting.Instance().DatabaseMapFile="路径";就可以了
这样,在你的CS项目里可以使用实体了,使用方法跟WEB里的一模一样。
@www_wwj :
比如把access数据库也放在bin目录里,那么databasemap.xml里:
<database name="DMBCN" type="MsAccess">
<parameter name="Provider" value="Microsoft.Jet.OLEDB.4.0" />
<parameter name="Data Source" value="dmbcn.mdb" />
<classMapFile path="ClassMap.xml" />
</database>
因为databasemap.xml与access数据库在一个目录下,所以直接使用mdb文件即可,如果有路径就填相对路径。
在main方法中进行初始化:
PersistenceLayer.Setting.Instance().DatabaseMapFile="databasemap.xml"
接着在其他的WinForm里就可以使用了。比WEB的其实还要方便
听棠,你的msn多少?可否加入我?谢谢!对于你的这些工作,偶感觉很志同道合,呵呵。
我的msn:
juqiang1975@msn.com
Access字段类型Text,做了个 c.AddMatch(LD_BBSEntity.__BODY,"代码");
出错信息[Error Message]: 内存溢出
引发异常的方法[Error Method]:Void ExecuteCommandTextErrorHandling(Int32)
--------------------------------------------------------------------------------
堆栈跟踪[Stack Trace]:
System.Data.OleDb.OleDbException: 内存溢出 at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at PersistenceLayer.MsAccess.AsDataTable(IDbCommand cmd) in I:\PLTEST\PL\SPL_WebTest\PersistenceLayer\Databases\MsAccess.cs:line 59 at PersistenceLayer.PersistenceBroker.ProcessRetrieveCriteria(RetrieveCriteria rc) in I:\PLTEST\PL\SPL_WebTest\PersistenceLayer\Core\PersistenceBroker.cs:line 725 at PersistenceLayer.RetrieveCriteria.AsDataTable() in I:\PLTEST\PL\SPL_WebTest\PersistenceLayer\Criteria\RetrieveCriteria.cs:line 244 at LiuDian.blog.search.getLD_BBSEntityMain(String k1, String k2) in j:\网站\testweb\liudian\blog\search.aspx.cs:line 191 at LiuDian.blog.search.Page_Load(Object sender, EventArgs e) in j:\网站\testweb\liudian\blog\search.aspx.cs:line 67 at System.EventHandler.Invoke(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain()
@寻找错误 :
你好,你报的这个错,我倒还从没遇到过,从你提供的信息来看,也判断不出是什么引起的,你使用的是RetrieveCriteria吗?请使用rc.SqlString属性看一下SQL语句有没有问题。如果还有问题,把你的写的代码帖出来看一下。
好像找到原因了,SQL语句没问题,当字段值里还有某些特殊字符(比如:日文)的时候使用like匹配,会出现 内存溢出 错误,应该是Access的bug。
可以在项目中混用SPL和ADO.NET的自身技术吗?
@盛夏的果实 :
当然可以了。你如果不想使用SPL“实体”的功能,那么ClassMap与实体类都可以不配,而只配DatabaseMap里的数据连接,然后使用Query里的直接SQL语句和执行存储过程等方法,直接对数据库操作,这就是保留了对ADO.NET的扩展。有关这方面的你可以看Query高级篇。
@听棠
我在使用的时候,空项目引用spl,编译,有一个
未能找到依赖项“ICSharpCode.SharpZipLib”。
的提示。虽然不影响使用,感觉怪怪的。
有个问题:PersistenceLayer.Setting.Instance().AppendDatabase()中的DatabaseType没有mysql的选项。
也就是说不支持追加mysql的功能!
还有对databasemap.xml的用法能否给一种变通的处理,也就是说部份属性如用户名,密码能否通过参数传递到程序中:
比如对AppendDatabase()进行重构,
AppendDatabase(string database,string datatype,string ip,string username,string pass,string classmap)...这点应该不难吧,安全呀,谢谢!
@ wmj苏州 :
关于DataBaseType的MySql已经添加进去了。请重新下载即可,目前最新版本是3.2.0.4了。
还有那个AppendDatabase我是无法实现你想的那样的,因为就算是同样的数据库,连接字符串都可能会不一样,有人要设置不同的连接池数等,也就是连接字符串其实也是一个非常复杂的东西,我不可能给你生成死的,还有同一数据库多种连接方式呢。所以,提供灵活的连接字符串,你想怎么连就怎么连。。要不然,连不上你都不知道我SPL里做了什么。。。
有点受不了
之前
objRetrieveEntity = new RetrieveCriteria(typeof(WHCDTBMEntity));
objCondition = objRetrieveEntity.GetNewCondition();
objCondition.AddEqualTo("WH_CODE", this.WH_CODE);
objEntityContainer = objRetrieveEntity.AsEntityContainer();
现在我想用
t.DoRetrieveCriteria( 。。。。)
应该如何写?
问题在于我已经一部分已经用了实时提交的了,另外一部份以前 用AsEntityContainer 的,现在读不到提交的数据,还死锁在那里。
@iamsunrise :
你好,你说的是对的。实时的事务处理,是会锁定数据库的,所以如果一旦采用实时事务处理,那么应该都采用实进事务处理,所以要把那查询也放到事务里。
t.DoRetrieveCriteria(objRetrieveEntity);
只要把RetrieveCriterial的对象传入就可以了,返回DataTable进行处理。
如果前面采用实时处理,那么,在未commit或rollback时,表是被锁定的,无法使用正常的retrieve的,要不然并发性问题又要冒出来了哦。。这也是数据库提供的机制。。
在 Condition 中填写一个布尔型的条件如何填写?
比如
字符
objCondition.AddEqualTo("USER_ID" ,"AAA");
布尔
objCondition.AddEqualTo("enabled" ,????); 如何????
对MsSQL 2005不支持阿,希望能尽快出个支持2005的新版。
反编译一下弄明白了,暂时可以用这种方法解决。
生成的DatabaseMap.xml后把
SQLNCLI.1
替换成
SQLOLEDB.1
就支持sql 2005了
@iamsunrise:
objCondition.AddEqualTo("enabled" ,true);
@nullx :
我还没有MsSQL2005的数据库,就象说的,应该是数据连接字符串有所不同而已,内部的其他的应该都是兼容的!!
对,其他方面没有不同,就是provider字符串不一样而已
@iamsunrise:
objCondition.AddEqualTo("enabled" ,true);
我试过了,真的是不可以这样,产生出来的sql是
[enabled=]
后面少了东西
不能把值放上去
在 SelectionCriteria
中我看到
switch (
case....
少了default,我用的是3.1版本的,不知道3.2是不是有更新。
@iamsunrise:
objCondition.AddEqualTo("enabled" ,true);
产生出来的按照定义应该是enabled<>0
真的可以吗?试过没有?如果你产生出来的是enabled=1好像不太合理
@iamsunrise :
如果你想要enabled<>0,那你要使用:
objCondition.AddNotEqualTo("enabled" ,false);
啊。
就看你想怎么做了
不如 objCondition.AddNotEqualTo("enabled" ,"0");
算了
@iamsunrise :
如果你觉得不会出错的话,也可以的。只是我想尽可能用强类型,如果是字符串的话,你可能会什么字符都输进去。
这个其实无所谓了,随便你想怎么用!!
我想说的是
objCondition.AddNotEqualTo("enabled" ,false);
的写法不直观
objCondition.AddNotEqualTo("enabled" ,"0"); 同样不直观
如果可以
objCondition.AddEqualTo("enabled" ,true);
那是最好的了,但是产生出来的sql语句不符合定义,
我记得mssql 7.0是可以写作enabled=1和enabled=0,mssql 2000就不可以这样写了。要写作enabled<>0和enabled=0,或者是我的记性不好。
以上只是我的个人看法。不代表什么。
感谢,System.DateTime赋null值也解决了,太好了!支持
自定义SQL查询中,
DataTable dt=Query.ProcessSql(sqlString,dbName);
如果是OleDB数据库,dbName怎么写呢?
@yynice :
这跟是不是OleDb一点关系也没有的啊,这里的dbName是在DatabaseMap.xml中配置时的那个数据源名称,“数据源名称”不是指“数据库名称”,就是<database name="..." type="...">
这里的Name值哦。。。所以你使用时只要这个名称就可以了,SPL会自动找到这个数据源并进行访问的。
看到老大的几篇文章,很是心动啊,有点跃跃欲试了,不过可惜我现在用的是FireBird所以,还是用不上。
不过可以考虑在下一个项目上使用sql server试一下
spl 针对access数据库datatime字段的查询存在bug.
condition条件最终被转化为sql语句,条件值被直接嵌入到sql语句中,这样针对时间字段就可能产生bug. 如某一时间为 2005-12-24 2:24:34.850 (millisecond部分大于500), 当你使用该字段查询时就得不到这条记录,但如果是小于500的就可以.
我在access中查看过,2005-12-24 2:24:34.850 会被显示为 2005-12-24 2:24:35,而在spl生成的查询条件中是 #2005-12-24 2:24#
如果把条件查询部分的实现改为参数实现就不会有问题.