长期来一直在做关于数据库的业务开发。主要是web应用程序,间或会开发windows应用程序。
虽然我经常使用sqlserver数据库。但是也就刚刚开始学习一段时间比较热衷于存储过程
后来一直有个想法就是希望自己的应用能很方便的在各种数据库里面移植。于是自己做了一个简陋的DBHelper
简单的对各种常用数据库的操作进行了封装,然后把各种操作依旧采用sql语句的方法来执行。
后来又觉得每次对sql的调整:比如更改排序方式 更改检索数据的条数等等的操作都需要重新编译比较繁琐。
于是决定自己做一个模块将SQL语句的执行封装到XML脚本中去。
YOK曾经过说编译和修改xml脚本需要的时间差不多
我说万一客户没有安装vs.net怎么办,他说有nant
不过我还是觉得能不能编译就不编译,何况还要重新部署。而且万一客户没有源码怎么办。客户要进行一些简单的hack又怎么办
于是我还是做了现在的XMod:
Xmod的目的是将原来需要放到代码里面的SQL语句及需要传入的参数独立出来存放到xml文件中进行描述。然后在程序执行过程中预加载该xml文件。当需要执行某sql操作时通过对应的函数名去读取xml里面的sql语句然后再执行数据库操作。
在XMod中我定义了一个Boxi.XMod.BoxiFunctions类来处理xml脚本,首先它能够根据名称来获取相应的xml节点,然后我们可以通过一个SetExtendedAttribute的方法将需要的参数传入到实例化后的Boxi.XMod.BoxiFunctions对象中,然后调用exec()方法就能完成一次数据库操作。
其具体的使用方法如下:
2Boxi.XMod.BoxiFunctions function=BoxiFunctions.GetFunction("ShowAllIDAndName",dbhelper);
3function.SetExtendedAttribute("@count",0);
4object Preturn=function.exec();
其中Preturn就是执行后的返回值。它是一个object对象。我们可以根据需要对其进行强制转换。
如果用老式的方法一般为如下操作
2if (count=0)
3sb.Append("select * from [IDAndName] order by id");
4else
5{
6 sb.Append("select top");
7 sb.Append(count.ToString());
8 sb.Append(" * from [IDAndName] order by id");
9}
10/*
11.后边为繁琐的设置和执行过程如:
12SqlConnection conn=new SqlConnection(strConnection);
13*/
通过定义如下格式的xml文件来配置一个需要完成的数据库操作,关于配置文件的配置方法在下面xml文件中的注释部分进行了说明:
2<!--
3参数设定:用来界定执行函数时需要传入的函数的参数
4每次函数执行后均返回一个对象类型,保存到@rerurn中
5
6-->
7 <Parameters>
8 <Parameter Name="@return" Type="dataset" Text="" />
9 <Parameter Name="@count" Type="int" Text="" />
10 </Parameters>
11 <ProgramBody>
12 <!--环节:用来构成函数执行需要步骤,可以由多个句子构成。环节执行时可以采用事务或者单句执行。
13 ConnectionString\DBType:数据库联接字符串.需要单独设定是使用。可为空
14 ProgramName\DBName:用于读取DBHelper特有的数据库配置文件时的参数,如果已经有数据库联接字符串则可为空
15 ReturnType:为函数内SQL的执行后返回的值,根据不同的返回值调用不同的方法来执行数据库操作
16 OutParameterName:环节输出值存放参数
17 Type的值可以为SQL或者SQLT,如果是SQL类型则执行SQL语句;如果为SQLT则执行数据库事务,数据库事务采用多个语句用';'号隔离。
18 -->
19 <Tache Name="1" DBType="" ConnectionString="" ProgramName="Default" DBName="Default" ReturnType="dataset" OutParameterName="@return" Type="SQL"><![CDATA[if @count=0 begin select * from [IDAndName] order by id end else begin select top @count * from [IDAndName] order by id end]]></Tache>
20 </ProgramBody>
21 </Function>
关于xml脚本的编辑软件界面截图如下:
不知道关于这样一个东西大家的感觉如何 希望听听大家的意见