首页 新闻 会员 周边

怎么来集中管理SQL语句呢?

0
悬赏园豆:5 [已解决问题] 解决于 2013-05-08 22:27

最近有时间在重构项目,发现项目中的SQL都是写在程序里面的,很分散,然后我就想把这些SQL语句集中管理起来!

这些SQL语句不复杂,都是一些查询语句,复杂的都用存储过程写了!

下面我结合网上想了三个方案,如下:

* 1.把所有的SQL作为一个常量定义在一个类中?
* 优点:直接把所有的SQL缓存到内存中去了,不过现在项目好像也是这样做的,只是SQL分散了,没有这么明显而已
*
* 缺点:如果SQL语句改变了,需要重新编译下
*
* 2.把SQL集中放到XML文件中去?
* 优点:把所有的SQL都用一个文件保存起来了,如果代码没有改,只是改了SQL语句就不需要重新编译了
*
* 缺点:每次都需要读取XML文件,如果说程序启动时就把XML文件内容全部读取并缓存那跟第一个方案就没什么区别了! 
*
* 3.把SQL存储到数据库中去,然后当程序启动时缓存所有的SQL供程序调用?
* 优点:如果要可维护还必须要有个专门管理SQL语句的界面
* 网址: http://jeffsang.iteye.com/blog/1693967
* 缺点:好复杂,在现在的环境下实现起来困难

* 最后如果叫我把这些SQL都写成存储过程那就不必要了
* 还有不需要使用Entity Framework,主要是我不会
*/

 

希望大家给我点建议,越多越好啊!

TimYang的主页 TimYang | 初学一级 | 园豆:12
提问于:2013-05-06 15:51
< >
分享
最佳答案
1

顶第二种。第三种貌似逻辑有问题,那读sql的sql写在哪?

“缺点:每次都需要读取XML文件,如果说程序启动时就把XML文件内容全部读取并缓存那跟第一个方案就没什么区别了”。其实是有区别的,前者是重新编译,后者是重启程序。

收获园豆:5
会长 | 专家六级 |园豆:12401 | 2013-05-06 16:35

其实我也挺喜欢第二种的,就是存在着这种问题:

 

每次编译好程序之后,都需要把XML文件手动拷到Release目下,然后才可以发布系统!

 

有什么好的方法 - 就是在编译的时候就把XML文件自动放到Release目录下呢?

TimYang | 园豆:12 (初学一级) | 2013-05-06 16:43

更新缓存跟xml文件不就可以了,不用重启程序。

一夏 | 园豆:200 (初学一级) | 2013-05-06 17:44

@一夏: 其实编译程序的时候XML文件不会自动编译到Release目录下,需要手动拷贝才行!

 

这是我的问题所在!

TimYang | 园豆:12 (初学一级) | 2013-05-06 17:59

@TimYang: 

两种办法:

1、XML文件属性“复制到输出目录”

2、工程->属性->生成事件->预生成事件命令行添加复制脚本,样例:

xcopy /x/y/r $(ProjectDir)config\*.config $(TargetDir)config\

五行缺木 | 园豆:386 (菜鸟二级) | 2013-05-06 18:01

@TimYang: 在vs的解决方案里添加。添加--新建项--xml文件。然后右键点击添加的xml文件-属性--生成操作选择“内容”。这样应该就可以了,你试试

会长 | 园豆:12401 (专家六级) | 2013-05-07 09:13

@会长: 是不是这样的:

你说的这种操作是不是我在编译的时候会自动把XML文件放到Debug目录下?

TimYang | 园豆:12 (初学一级) | 2013-05-07 09:29

@TimYang: 是这样的,你这还是英文的呀。编译方式如果是Release。他就自动去Release目录了。

会长 | 园豆:12401 (专家六级) | 2013-05-07 10:32

@会长: 其实写xml也挺费劲的。比如参数.....。估计得专门写个程序从xml里读取sql再根据参数组合新的sql

会长 | 园豆:12401 (专家六级) | 2013-05-07 10:34

@会长: 对,不过我写在XML的SQL语句都是查询语句,参数的话比较少,如果是复杂的会用存储过程搞定的!

TimYang | 园豆:12 (初学一级) | 2013-05-07 16:36
其他回答(2)
0

用xml文件的形式吧,把所有的SQL语句放到内存中的一个集合中。在xml中添加sql时,对应的内存集合类不用重析编辑。

angelshelter | 园豆:9887 (大侠五级) | 2013-05-06 21:06

那我这样做:

我定义一个枚举值,每个枚举对应着XML中的一个节点!

当程序启动的时候,读取XML的所有数据并跟枚举一一对应起来放到一个静态Dictionary中去!

这样就不需要每次去读取XML内容了,直接从Dictionary读就可以了!

 

你觉得这样可以不?

支持(1) 反对(0) TimYang | 园豆:12 (初学一级) | 2013-05-07 09:21

@TimYang: 方案一,直接是一个字符串数组,然后定义一些枚举,枚举都有index。正好对应字符串str[枚举值]。这个缺点是必须是连续的,不方便中间插入值,一般是在尾部加新的str。不过效率高。

 

第二种就是字典吧。就是键-值对。不这效率不高。可以随便插入。根据有意义的key查找sql命令。取名字蛮费精力的,不过可读性更强。

支持(0) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2013-05-07 12:37

@angelshelter: 

第二种效率为什么不高呢?这个字典的记录不会很多,最多30左右,而且这个字典的值只会在程序启动时才会加载,以后都不会进行添加,删除的操作,只准读取!

支持(0) 反对(0) TimYang | 园豆:12 (初学一级) | 2013-05-07 16:39
-3

173844862.Net高级部落 

辛巴 | 园豆:622 (小虾三级) | 2013-05-07 09:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册