最近有时间在重构项目,发现项目中的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,主要是我不会
*/
希望大家给我点建议,越多越好啊!
顶第二种。第三种貌似逻辑有问题,那读sql的sql写在哪?
“缺点:每次都需要读取XML文件,如果说程序启动时就把XML文件内容全部读取并缓存那跟第一个方案就没什么区别了”。其实是有区别的,前者是重新编译,后者是重启程序。
其实我也挺喜欢第二种的,就是存在着这种问题:
每次编译好程序之后,都需要把XML文件手动拷到Release目下,然后才可以发布系统!
有什么好的方法 - 就是在编译的时候就把XML文件自动放到Release目录下呢?
更新缓存跟xml文件不就可以了,不用重启程序。
@一夏: 其实编译程序的时候XML文件不会自动编译到Release目录下,需要手动拷贝才行!
这是我的问题所在!
@TimYang:
两种办法:
1、XML文件属性“复制到输出目录”
2、工程->属性->生成事件->预生成事件命令行添加复制脚本,样例:
xcopy /x/y/r $(ProjectDir)config\*.config $(TargetDir)config\
@TimYang: 在vs的解决方案里添加。添加--新建项--xml文件。然后右键点击添加的xml文件-属性--生成操作选择“内容”。这样应该就可以了,你试试
@会长: 是不是这样的:
你说的这种操作是不是我在编译的时候会自动把XML文件放到Debug目录下?
@TimYang: 是这样的,你这还是英文的呀。编译方式如果是Release。他就自动去Release目录了。
@会长: 其实写xml也挺费劲的。比如参数.....。估计得专门写个程序从xml里读取sql再根据参数组合新的sql
@会长: 对,不过我写在XML的SQL语句都是查询语句,参数的话比较少,如果是复杂的会用存储过程搞定的!
用xml文件的形式吧,把所有的SQL语句放到内存中的一个集合中。在xml中添加sql时,对应的内存集合类不用重析编辑。
那我这样做:
我定义一个枚举值,每个枚举对应着XML中的一个节点!
当程序启动的时候,读取XML的所有数据并跟枚举一一对应起来放到一个静态Dictionary中去!
这样就不需要每次去读取XML内容了,直接从Dictionary读就可以了!
你觉得这样可以不?
@TimYang: 方案一,直接是一个字符串数组,然后定义一些枚举,枚举都有index。正好对应字符串str[枚举值]。这个缺点是必须是连续的,不方便中间插入值,一般是在尾部加新的str。不过效率高。
第二种就是字典吧。就是键-值对。不这效率不高。可以随便插入。根据有意义的key查找sql命令。取名字蛮费精力的,不过可读性更强。
@angelshelter:
第二种效率为什么不高呢?这个字典的记录不会很多,最多30左右,而且这个字典的值只会在程序启动时才会加载,以后都不会进行添加,删除的操作,只准读取!
173844862.Net高级部落