Fly with the wind-TerryDong

.NET on the way
posts - 14, comments - 42, trackbacks - 1, articles - 0

最新评论

呵呵,谢谢,您太客气了~~!
--引用--------------------------------------------------
YuHui: 谢谢回复~~!请问:
CreateNewConnection()方法可以这样写吗?

private static string CreateNewConnection(string keyName)
{
string connectionString="";
根据keyName选择相应的连接字符串 //方法省略
return connectionString;
}
--------------------------------------------------------

是这样的,sorry啦,来晚了,估计您早就知道答案了。。。呵呵
谢谢回复~~!请问:
CreateNewConnection()方法可以这样写吗?

private static string CreateNewConnection(string keyName)
{
string connectionString="";
根据keyName选择相应的连接字符串 //方法省略
return connectionString;
}
@YuHui

CreateNewConnection(keyName) 是一个获取connectionString的方法

connectionString 就是你要连接数据库的连接串

如何调用
List<string[]> sqls = new List<string[]>();
sqls.Add(new string[] { “链接串KeyName”, “具体sql语句” });
sqls.Add(new string[] { “链接串KeyName”, “具体sql语句”});
bool reval=DbHelperSQLFactory.ExecuteMultiTran(sqls);
您好,我是新手想请教一下问题:
能把sqlStrings的结构

CreateNewConnection(keyName)方法

conn = new SqlConnection(connectionString)中的connectionString加以说明吗?
能提供一个调用的实例吗?谢谢~~~
能否给个DbProviderFactory连接mysql数据库的列子?
zhmvb@tom.com 非常感谢。
re: 用户控件之间的互操作 Terry Dong 2008-05-13 13:35  
你可以试一下,是无法直接找到控件类和类的方法的
re: 用户控件之间的互操作 xlander 2008-05-12 21:42  
文中说:不能直接使用B中的自定义方法和属性

为什么不能直接调用?属性的名字、方法的名字都知道了呀.
re: vs2008与mysql Argo 2008-01-15 19:33  
Nice
帮你顶
有个专门针对工厂模式三层的代码生成器,下载地址http://www.maticsoft.com/softdown.aspx
我也正准备结合工作实际,参照些成熟框架,自己总结出一套方案,虽然说不会有什么大用途,至少对个人学习和提高还是很有帮助的。
--引用--------------------------------------------------
大柳树: 真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很&quot;闲&quot;的
--------------------------------------------------------
SqlServer2005很强了,帮你做了很多事
只要开始设计的时候是针对接口编辑,事情就并不是想像中复杂.
规范很重要,注释也很重要。偶是新手,学到了点。谢谢楼主

--引用--------------------------------------------------
Terry Dong: 其实项目选型有多种方案,选择适合的项目类型就好了,各有利弊的

存储过程是提醒大家慎用,sql也有维护的问题,这些都依赖于编码是否规范

我公司原来写的存储过程,每个数据库就几百个,很多都是200多行代码,没注释,没文档,没规范。。。可谓人走茶凉。所以大家适当选择取舍吧,嘿嘿
--------------------------------------------------------
多谢楼主指点。

--引用--------------------------------------------------
Terry Dong: --引用--------------------------------------------------
CoolDog: @沙加
@Terry Dong
我们开发的系统是基于三层架构的。最近需求有很多变动,尤其是要修改表结构时。开发的时候麻烦的很,需要修改很多地方。请问有没有更好的解决办法?

--------------------------------------------------------
表结构改动很大,这对项目的影响确实很大,我现在公司的项目的几个主表都在重构ing。。。

如果是旧系统升级,要看原来系统实现的方式了
可能会对存储过程,sql,实体都要优化,如果你们原来架构的分层还不错,逻辑层和UI层应该不用改动太大吧。

如果新开发,有几种选择吧
1.基于代码生成的方式,可以根据数据库生成dal,entity,这样每次数据库更新再重复生成即可,dal的类最好写成partial类的,当然自己扩展的方法还是要手工改动的。
2.基于or-mapping的,也可以通过or-mapping工具做配置

希望对你有点帮助
--------------------------------------------------------
asfasdf
其实项目选型有多种方案,选择适合的项目类型就好了,各有利弊的

存储过程是提醒大家慎用,sql也有维护的问题,这些都依赖于编码是否规范

我公司原来写的存储过程,每个数据库就几百个,很多都是200多行代码,没注释,没文档,没规范。。。可谓人走茶凉。所以大家适当选择取舍吧,嘿嘿
--引用--------------------------------------------------
CoolDog: @沙加
@Terry Dong
我们开发的系统是基于三层架构的。最近需求有很多变动,尤其是要修改表结构时。开发的时候麻烦的很,需要修改很多地方。请问有没有更好的解决办法?

--------------------------------------------------------
表结构改动很大,这对项目的影响确实很大,我现在公司的项目的几个主表都在重构ing。。。

如果是旧系统升级,要看原来系统实现的方式了
可能会对存储过程,sql,实体都要优化,如果你们原来架构的分层还不错,逻辑层和UI层应该不用改动太大吧。

如果新开发,有几种选择吧
1.基于代码生成的方式,可以根据数据库生成dal,entity,这样每次数据库更新再重复生成即可,dal的类最好写成partial类的,当然自己扩展的方法还是要手工改动的。
2.基于or-mapping的,也可以通过or-mapping工具做配置

希望对你有点帮助
@苯苯的考拉熊
--引用--------------------------------------------------
苯苯的考拉熊: --引用--------------------------------------------------
大柳树: 真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很&amp;quot;闲&amp;quot;的
--------------------------------------------------------

那要看你的系统了,我们这里的小型机,才不到100个Client,就是由于把大量的工作都放在了存储过程中,CPU长期50%以上。
--------------------------------------------------------
楼主的意思是:如果大型系统就写存储过程,如果小型系统就写SQL语句了?写SQL语句也很难维护的啊?为了以后的开发是不是建议用存储过程呢
@沙加
@Terry Dong
我们开发的系统是基于三层架构的。最近需求有很多变动,尤其是要修改表结构时。开发的时候麻烦的很,需要修改很多地方。请问有没有更好的解决办法?
@Vincent Yang

呵呵,应该写成基于工厂模式的三层.net平台解决方案

这只是工厂模式的.net应用而已,这个架构中BLL与DAL层是通过工厂模式实现多类型数据库支持的,数据访问类也是基于DbProviderFactory来封装的。
@Terry Dong
你说的不完全对,.NetTiers在生成时是可以配置的,完全可以不使用存储过程.使用它我看中的是方便的查询使用方法. 可以看看俺写的这个 http://www.cnblogs.com/darkangle/archive/2007/11/29/976493.html 它提供多库支持,只需要显式指定连接定串就好了.

另外,在大点的项目里面要管理一堆的SQL是相当不便的,最好是有一些ORM之类的工具来用. 我们现在的项目近50张表, 需求还经常变,要是自己写SQL,一改库的话SQL语句就得跟着变多累啊~~~
呵呵,PetShop 4中确实有很多值得学习的地方。恭喜你,进入正途~~~~
re: [原创]构建基于工厂模式的三层解决方案 苯苯的考拉熊 2007-12-07 07:36  
--引用--------------------------------------------------
大柳树: 真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很&quot;闲&quot;的
--------------------------------------------------------

那要看你的系统了,我们这里的小型机,才不到100个Client,就是由于把大量的工作都放在了存储过程中,CPU长期50%以上。
不明白你这里跟工厂模式有什么关系,你只是用了微软的而已
“3.编程性方面,如果一个存储过程的业务逻辑需要调用另外一个数据库的表或存储过程,需要链接的方式来联接,效能上一样有影响 ”

这点说的很不错,一个逻辑中需要同时操作多数据库的时候性能确实影响不小,最近在看阿拉丁的地图的东西,他们用的存储过程也很少,不过他们设计的数据库也很垃圾,40个字段的表 一半没有用
关于用存储过程的性能好处我的见解是:
1、预编译过,所以性能不会差去哪里
2、能维持很好的查询计划

当然,像博主那样需要用到数据工厂的,逻辑还是放在BLL合适点
存储过程带来的实际问题:

1.维护代价非常高,试想下很多N年前写的存储过程,一个数据库内包括的几百个存储过程的情况

2.性能方面,试想下,一个大型web在线实时系统,业务逻辑都在存储过程中,性能完全依靠数据库服务器的场景会是怎样,如果是性能分散到n个web服务器又会如何

3.编程性方面,如果一个存储过程的业务逻辑需要调用另外一个数据库的表或存储过程,需要链接的方式来联接,效能上一样有影响

当然如果基于sql的方式然后用各种join关联表去实现,性能上也会有问题。

以上是我在项目中遇到的几点原因,现在我们都是基于单表查询,逻辑层组合的方式。欢迎大家继续探讨,一起提高^_^

真的不明白楼上说的存储过程用的越少越好是什么意思,好像微软有个建议,说是尽可能让数据库做最多的事情,因为一般情况下数据库总是很"闲"的
存储过程用的越少越好,业务逻辑最好写在逻辑层,虽然会增加一些开发时间,但对系统可读性、debug还有后期性能,维护都有好处,我的想法是除非是大数据量的分页用存储过程协助(当然Linq和Sql2005也可以避免使用分页存储过程),其它尽量不使用存储过程
to:SoulHuang
没有petshop的模板:)
to:Enzo
是一起用的,这也是利用工厂模式的原因
to:沙加
.nettiers我以前给一个项目后台用过,代码依赖性很强,是基于存储过程的,不太适合复杂系统,而且系统迁移性,可维护性都不是很好,性能压力都在数据库那边
有没PetShop的CodeSmith模版??

懒人就会用.NetTiers
re: DAL层接口代码 预备役中尉 2007-12-06 19:48  
互相切磋下.请多指教.
/// <summary>
/// <see cref="IDataAccessor&lt;T&gt;"/>为<c>JasonNet</c>平台提供的进行业务实体数据访问的接口,用于进行
/// <typeparamref name="T"/>所指定业务实体的CRUD操作。
/// </summary>
/// <typeparam name="T">业务实体的类型,必须实现<see cref="IEntity"/>接口。</typeparam>
/// Title: IDataAccessor
/// Author: 姜辉
/// Version: 1.0
/// History:
/// 2007-03-28 姜辉 [创建]
public interface IDataAccessor<T> where T : IEntity
{
/// <summary>
/// 进行业务实体的插入操作。
/// </summary>
/// <param name="entity">待进行插入操作的业务实体</param>
/// <returns>
/// 插入数据库后的业务实体,除主键外,返回的业务实体中的各属性值均与传入时对应的属性值一致。
/// </returns>
/// <exception cref="UniqueKeyDuplicatedException">
/// 当数据库表中的唯一键出现重复的情况时所抛出的异常。</exception>
/// <exception cref="ColumnValueNotValidException">
/// 当进行操作时,如果发生数据库表中的字段值不合法时所抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
T Insert(T entity);

/// <summary>
/// 进行业务实体的插入操作。
/// </summary>
/// <param name="entity">待进行插入操作的业务实体</param>
/// <param name="transaction">进行操作时所用到的数据库事务对象</param>
/// <returns>
/// 插入数据库后的业务实体,除主键外,返回的业务实体中的各属性值均与传入时对应的属性值一致。
/// </returns>
/// <exception cref="ArgumentNullException">当<paramref name="transaction"/>为空时抛出的异常。</exception>
/// <exception cref="UniqueKeyDuplicatedException">
/// 当数据库表中的唯一键出现重复的情况时所抛出的异常。</exception>
/// <exception cref="ColumnValueNotValidException">
/// 当进行操作时,如果发生数据库表中的字段值不合法时所抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
T Insert(T entity, DbTransaction transaction);

/// <summary>
/// 根据指定的Id进行业务实体的删除操作。
/// </summary>
/// <param name="entityId">待进行删除操作的业务实体的Id</param>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
void Delete(object entityId);

/// <summary>
/// 根据指定的Id进行业务实体的删除操作。
/// </summary>
/// <param name="entityId">待进行删除操作的业务实体的Id</param>
/// <param name="transaction">进行操作时所用到的数据库事务对象</param>
/// <exception cref="ArgumentNullException">当<paramref name="transaction"/>为空时抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
void Delete(object entityId, DbTransaction transaction);

/// <summary>
/// 进行业务实体的更新操作,只更新非默认值的属性。
/// </summary>
/// <param name="entity">待进行更新操作的业务实体</param>
/// <exception cref="EntityNotFoundException">当无法找到数据库表中的指定记录时所抛出的异常。</exception>
/// <exception cref="UniqueKeyDuplicatedException">
/// 当数据库表中的唯一键出现重复的情况时所抛出的异常。</exception>
/// <exception cref="ColumnValueNotValidException">
/// 当进行操作时,如果发生数据库表中的字段值不合法时所抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
void Update(T entity);

/// <summary>
/// 进行业务实体的更新操作,只更新非默认值的属性。
/// </summary>
/// <param name="entity">待进行更新操作的业务实体</param>
/// <param name="transaction">进行操作时所用到的数据库事务对象</param>
/// <exception cref="ArgumentNullException">当<paramref name="transaction"/>为空时抛出的异常。</exception>
/// <exception cref="EntityNotFoundException">当无法找到数据库表中的指定记录时所抛出的异常。</exception>
/// <exception cref="UniqueKeyDuplicatedException">
/// 当数据库表中的唯一键出现重复的情况时所抛出的异常。</exception>
/// <exception cref="ColumnValueNotValidException">
/// 当进行操作时,如果发生数据库表中的字段值不合法时所抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
void Update(T entity, DbTransaction transaction);

/// <summary>
/// 进行业务实体的更新操作,根据<paramref name="updateAll"/>的值来判断是否只更新非默认值的属性。如果
/// <paramref name="updateAll"/>为<c>true</c>,则更新实体中的所有属性,否则只更新非默认值的属性。
/// </summary>
/// <param name="entity">待进行更新操作的业务实体</param>
/// <param name="updateAll">是否更新全部属性的标志</param>
/// <exception cref="EntityNotFoundException">当无法找到数据库表中的指定记录时所抛出的异常。</exception>
/// <exception cref="UniqueKeyDuplicatedException">
/// 当数据库表中的唯一键出现重复的情况时所抛出的异常。</exception>
/// <exception cref="ColumnValueNotValidException">
/// 当进行操作时,如果发生数据库表中的字段值不合法时所抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
void Update(T entity, bool updateAll);

/// <summary>
/// 进行业务实体的更新操作,根据<paramref name="updateAll"/>的值来判断是否只更新非默认值的属性。如果
/// <paramref name="updateAll"/>为<c>true</c>,则更新实体中的所有属性,否则只更新非默认值的属性。
/// </summary>
/// <param name="entity">待进行更新操作的业务实体</param>
/// <param name="updateAll">是否更新全部属性的标志</param>
/// <param name="transaction">进行操作时所用到的数据库事务对象</param>
/// <exception cref="ArgumentNullException">当<paramref name="transaction"/>为空时抛出的异常。</exception>
/// <exception cref="EntityNotFoundException">当无法找到数据库表中的指定记录时所抛出的异常。</exception>
/// <exception cref="UniqueKeyDuplicatedException">
/// 当数据库表中的唯一键出现重复的情况时所抛出的异常。</exception>
/// <exception cref="ColumnValueNotValidException">
/// 当进行操作时,如果发生数据库表中的字段值不合法时所抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
void Update(T entity, bool updateAll, DbTransaction transaction);

/// <summary>
/// 根据指定的Id读取业务实体对象。
/// </summary>
/// <param name="entityId">需要读取的业务实体的Id</param>
/// <returns>数据表中<paramref name="entityId"/>所对应的业务实体</returns>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
T Get(object entityId);

/// <summary>
/// 根据指定的Id读取业务实体对象。
/// </summary>
/// <param name="entityId">需要读取的业务实体的Id</param>
/// <param name="transaction">进行操作时所用到的数据库事务对象</param>
/// <returns>数据表中<paramref name="entityId"/>所对应的业务实体</returns>
/// <exception cref="ArgumentNullException">当<paramref name="transaction"/>为空时抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
T Get(object entityId, DbTransaction transaction);

/// <summary>
/// 查询符合<see cref="IFilter"/>过滤条件,且在<paramref name="pageIndex"/>和<paramref name="pageSize"/>
/// 所指定范围内的业务实体对象的记录。
/// </summary>
/// <param name="pageIndex">在符合搜索条件的查询结果范围内获取记录的起始页数,该值从<c>0</c>开始,
/// 即<c>0</c>表示查询结果记录集的第一页,如果值小于<c>0</c>,则抛出<see cref="ArgumentOutOfRangeException"/>。
/// </param>
/// <param name="pageSize">指定查询结果记录集的每一页的大小,如果该值取<c>-1</c>,则只要参数
/// <paramref name="pageIndex"/>是一个合法的值,都会将符合查询条件的所有查询结果记录返回;如果该参
/// 数的值为非<c>-1</c>的负数,则抛出<see cref="ArgumentOutOfRangeException"/>。</param>
/// <param name="filter">一个<see cref="IFilter"/>的实现,<see cref="IFilter"/>定义了进行数据过滤
/// 的接口,该参数可以为<c>Null</c>,表示无查询条件。</param>
/// <param name="sort">一个<see cref="ISort"/>的实现,<see cref="ISort"/>定义了进行查询的接口,该参数可以为
/// <c>Null</c>,表示以主键进行排序。</param>
/// <param name="totalRecords">符合<paramref name="filter"/>查询条件的结果记录集的记录个数</param>
/// <returns>符合过滤条件且在指定范围内的业务实体对象记录集。</returns>
/// <exception cref="ArgumentOutOfRangeException">
/// 当<paramref name="pageIndex"/>的值小于0或<paramref name="pageSize"/>非-1的负数时抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "4#")]
IList<T> Find(int pageIndex, int pageSize, IFilter filter, ISort sort, out long totalRecords);

/// <summary>
/// 查询符合<see cref="IFilter"/>过滤条件,且在<paramref name="pageIndex"/>和<paramref name="pageSize"/>
/// 所指定范围内的业务实体对象的记录。
/// </summary>
/// <param name="pageIndex">在符合搜索条件的查询结果范围内获取记录的起始页数,该值从<c>0</c>开始,
/// 即<c>0</c>表示查询结果记录集的第一页,如果值小于<c>0</c>,则抛出<see cref="ArgumentOutOfRangeException"/>。
/// </param>
/// <param name="pageSize">指定查询结果记录集的每一页的大小,如果该值取<c>-1</c>,则只要参数
/// <paramref name="pageIndex"/>是一个合法的值,都会将符合查询条件的所有查询结果记录返回;如果该参
/// 数的值为非<c>-1</c>的负数,则抛出<see cref="ArgumentOutOfRangeException"/>。</param>
/// <param name="filter">一个<see cref="IFilter"/>的实现,<see cref="IFilter"/>定义了进行数据过滤
/// 的接口,该参数可以为<c>Null</c>,表示无查询条件。</param>
/// <param name="sort">一个<see cref="ISort"/>的实现,<see cref="ISort"/>定义了进行查询的接口,该参数可以为
/// <c>Null</c>,表示以主键进行排序。</param>
/// <param name="totalRecords">符合<paramref name="filter"/>查询条件的结果记录集的记录个数</param>
/// <param name="transaction">进行操作时所用到的数据库事务对象</param>
/// <returns>符合过滤条件且在指定范围内的业务实体对象记录集。</returns>
/// <exception cref="ArgumentOutOfRangeException">
/// 当<paramref name="pageIndex"/>的值小于0或<paramref name="pageSize"/>非-1的负数时抛出的异常。</exception>
/// <exception cref="ArgumentNullException">当<paramref name="transaction"/>为空时抛出的异常。</exception>
/// <exception cref="DatabaseException">当数据库发生其他General错误时所抛出的异常。</exception>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "4#")]
IList<T> Find(int pageIndex, int pageSize, IFilter filter, ISort sort, out long totalRecords, DbTransaction transaction);
}
这个啊~~~看看.NetTiers吧,你想要的它都有,只不过比较复杂你可修改一个简化版的出来用.
Oracle、SqlServer、MySql一起用的,还是可选的啊?
一起用的话就太牛了
re: 实体类demo代码 Argo 2007-11-21 02:04  
很好!
有一个建议,构造函数的参数太多了,最好不要这个构造函数了,只有一个默认的就好了。
仅仅就是文件夹遍历而言,用API去遍历可以提高效率1倍以上。我做过测试。
如果是匹配文字的算法,google索引仅仅使用0.0x秒就可以遍历整个电脑(普通的),所以直接用sourceString.Contains 是很没有技巧的。
to:随心所欲

这个类是工作中临时写的,还真没在性能方面考虑

刚才测试了一下,遍历了一下D盘下的所有文件中是否包含“orders”
Total access files:30651
Total run time:18秒

另外有什么好的办法去做这样的搜索,不吝赐教~~
测试过执行效率么?比如说文件夹内文件超过1万个。
在向其他办法吧,这个效率问题太大了。