以前没有学过数据库,来了公司后就赶鸭子上架的做起数据库方面的开发来了...经过一段时间的工作后,觉得访问数据库这块的工作有些冗余,而且也会遇到一些同一个应用程序要移植到不同的数据库中去的问题。于是乎就写了一个db访问的组件,当时也没有了解相关的框架,直接就写了。不过当初要是知道有那么多成熟的东西,也不会写这个了。现在自己开发的东西都是用这个组件,越来越顺手,感觉还是不错的。
这个组件中有很多很杂的东西,大都是工作中封装的东西,不过封装时想的比较多,看相关的开源代码比较少,所以有些实现可能有些多余。在开发过程中觉得绝大部分的数据库操作实际上都是很简单的增删改查,而且这些操作在不同的数据库中有比较相似,大部分时间都花在了拼写select、update、insert字段上。因此对数据库的操作不再通过sql语句进行操作,而是通过几个基本命令(ComCommand的子类)来访问数据库。主要有:判断存在命令、解析命令、创建命令、丢弃命令、查询命令、删除命令、更新命令、插入命令、sql命令。对数据库中的表、字段的引用也不再通过字符串,而是通过一个个对象(DBObject的子类)来引用,这些对象主要有:表、视图、字段、函数、表达式、(本来还想做索引和存储过程不过不是太好实现,也没有迫切要求实现)。
命令介绍:
- 判断存在命令(ComExistCommand):用来判断数据库中是否存在一个DBObject对象(仅通过名称和类型来判断)。
- 解析命令(ComParseCommand):用来将数据库中的表或视图等资源解析成一个DBObject对象实例。
- 创建命令(ComCreateCommand):用来将DBObject对象实例创建到数据库中。
- 丢弃命令(ComDropCommand):用来丢弃DBObject对象描述的表或视图。
例如有一数据库,有一张表tbl,有一个字段a,varchar(20)类型。如下的代码表示判断数据库中是否存在该表,如果存在,则解析这个表为DBTable的实例(DBObject子类),然后丢弃这个表。如果不存在则创建一个名为tbl,有一个字段a的表:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Auxilibary.Business.DB;
using Auxilibary.Business.DB.SqlServer;
using Auxilibary.Business.DB.Oracle;
using Auxilibary.Business.DB.DB2;
using Auxilibary.Business.DB.MySql;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//通过ExcuteDataBase类实例访问数据库,该实例封装了对数据库的open和close操作,但是不支持事物,如果需要事物查询则使用
//IAuxiDataBase实例自己管理数据库的open、close和事物操作。
ExcuteDataBase edb = new ExcuteDataBase(
new SqlServerDataBase(@"server=./SQL2000;database=testdb;user id=sa;password="));//不同的类型可以实现不同的数据库
//判断表是否存在
if (edb.Exist(new ComExistCommand("tbl", DBObjectTypes.DataTable)))
{
//解析表结构
DBTable tbl = (DBTable)edb.ParseDBObject(new ComParseCommand(DBObjectTypes.DataTable, "tbl"));
//将表丢弃
edb.Drop(new ComDropCommand(tbl));
}
else
{
//构造表a的DBTable实例
DBTable tbl = new DBTable("tbl", "测试表a", new DBDataColumn("a", 20, null, DbType.AnsiString, "测试字段"));
//将表创建到数据库中
edb.Create(new ComCreateCommand(tbl));
}
return;
}
}
}
- 插入命令(ComInsertCommand):insert数据
- 查询命令(ComSelectCommand):select数据
- 修改命令(ComUpdateCommand):update数据
- 删除命令(ComDeleteCommand):delete数据
下边的代码演示如何处理数据:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using Auxilibary.Business.DB;
using Auxilibary.Business.DB.SqlServer;
using Auxilibary.Business.DB.Oracle;
using Auxilibary.Business.DB.DB2;
using Auxilibary.Business.DB.MySql;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//通过ExcuteDataBase类实例访问数据库,该实例封装了对数据库的open和close操作,但是不支持事物,如果需要事物查询则使用
//IAuxiDataBase实例自己管理数据库的open、close和事物操作。
ExcuteDataBase edb = new ExcuteDataBase(
new SqlServerDataBase(@"server=./SQL2000;database=testdb;user id=sa;password="));//不同的类型可以实现不同的数据库
//创建表实例
DBTable tbl = new DBTable("tbl", "测试表a", new DBDataColumn("a", 20, null, DbType.AnsiString, "测试字段"));
//也可以从数据库中解析
//DBTable tbl = (DBTable)edb.ParseDBObject(new ComParseCommand(DBObjectTypes.DataTable, "tbl"));
//创建一个与此数据结构对应的DataTable
DataTable insdata = tbl.DataTableStruct;
//先将数据写入内存
for (int i = 0; i < 10; ++i)
{
DataRow dr = insdata.NewRow();
dr["a"] = i.ToString() + "行";
insdata.Rows.Add(dr);
}
//通过插入命令插入数据库
edb.Insert(new ComInsertCommand(tbl, insdata));
//构造查询命令,返回字段a为“2行”的数据行
DataTable selecttbl = edb.SelectTable(new ComSelectCommand(false, null, tbl, tbl.Columns["a"] == "2行", null, null), 0, int.MaxValue);
//构造修改命令,修改字段内容
foreach (DataRow dr in selecttbl.Rows)
{
edb.UpDate(new ComUpdateCommand(tbl, tbl.Columns["a"] == dr["a"].ToString(), new SetData(tbl.Columns["a"], "Updated")));
}
//构造删除命令,删除字段a为“Updated”的数据行
edb.Delete(new ComDeleteCommand(tbl, tbl.Columns["a"] == "Updated"));
return;
}
}
}
以上是一些简单的应用,如果通过代码生成工具生成表的表述类和强类型的datetable,可以实现较为快速的开发,同时更改数据库时只需更改数据库访问类型即可。目前该组件支持sqlserver、oracle、db2、mysql等,都是平时用到哪种库顺手就写上了,没有用到的地方还有一些bug和为题待解决,比如各个数据库不同的数据类型、函数的使用,对象在创建时的一些参数等。不过整体上说确实使我的工作效率有所提高,通过这个组件的设计,也使得我在比较复杂的面向对象设计上有很到提高。