一个通用数据库操作组件DBUtil(c#)、支持SqlServer、Oracle、Mysql、Access、SQLITE

时间:2022-12-11 15:10:39

DBUtil参考手册

(github地址:https://github.com/jackletter/DBUtil)

成品1.0:http://pan.baidu.com/s/1bIAGG2

一、概述

数据库操作工具,支持SQLSERVERoraclemysqlsqliteaccessoldeb连接。

二、快速示例(以SQLSERVER为例)

  环境准备:添加对DBUtil.dll的引用

  代码操作如下:    

    DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Data Source=.;Initial Catalog=JACKOA;User ID=sa;Password=sa;","SQLSERVER");
//1.快速查询
Console.WriteLine(iDb.GetFirstColumnString("select Name from SysUser"));
//2.执行sql语句
Console.WriteLine(iDb.ExecuteSql("updatetest set CaseNo=CaseNo+'e'"));
//3.执行带参数的SQL语句
Console.WriteLine(iDb.ExecuteSql("updatetest set CaseNo=@case",newIDataParameter[] { iDb.CreatePara("case","123") }));
//4.添加数据
Hashtable ht = newSystem.Collections.Hashtable();
ht.Add("CaseNo", "456");
ht.Add("Name", "ji");
Console.WriteLine(iDb.AddData("test",ht));
//5.修改数据
Hashtable ht2 = newSystem.Collections.Hashtable();
ht2.Add("Name", "jiko");
Console.WriteLine(iDb.UpdateData("test",ht2," and CaseNo='123'"));
//6.删除数据
Console.WriteLine(iDb.DeleteTableRow("test"," and id=11"));
//7.一般查询
Console.WriteLine(iDb.GetDataSet("select* from sysuser").Tables[0].Rows.Count);

三、类说明

3.1 IDBFactory

主要用于创建iDb对象,其IDSNOManage字段是ID和编号生成控制的实现,可以在程序初始化时设置来扩展ID和编号生产控制

3.2 IDbAccess

数据库访问对象,常见操作见注释

3.3 Result

处理结果模型属性Success代表是否成功,Data代表返回的附加信息

3.4 DataBaseType

数据库种类枚举,ORACLE = 0, SQLSERVER = 1, MYSQL = 2, SQLITE = 3, ACCESS = 4

3.5 GridProp

表格参数模型

3.6 SearchResult

表格查询结果

3.7 TableStruct

表结构描述对象(当前只用于SQLSERVER中,在SqlServerIDbAccess中会看到),另外还有: Proc、Func、TableStruct. Column、TableStruct. Constraint、TableStruct. Trigger、TableStruct. Index

3.8 SerialChunk

自动编号的参数模型

3.9 IDSNOManager

用于管理自动编号生成的接口

3.10 SimpleIDSNOManager

简单实现ID和自动编号生成控制的类

3.11 SqlServerIDbAccess

实现IDbAccess,用于操作MS SQLSERVER,额外扩展了IDbAccess的方法

3.12 OracleIDbAccess

实现IDbAccess,用于操作ORACLE

3.13 MySqlIDbAccess

实现IDbAccess,用于操作MYSQL

3.14 SQLiteIDbAccess

实现IDbAccess,用于操作SQLITE

3.15 OleIDbBase

实现IDbAccess,代表OLEDB数据连接的操作对象的抽象基类

3.16 AccessIDbAccess

继承OleIDbBase,实现ACCESS数据库操作

四、创建iDb对象

4.1 SQLSERVER

(1).添加对DBUtil.dll引用

(2). DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("DataSource=.;Initial Catalog=JACKOA;User ID=sa;Password=sa;","SQLSERVER");

4.2 ORACLE

(1).添加对DBUtil.dll引用,将Oracle.DataAccess.dll拷贝到程序运行目录,如果需要对oracle进行细粒度操作则需要添加对Oracle.DataAccess.dll的引用
(2). DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Data Source=ORCLmyvm2;Password=sys123;User ID=sys;DBA Privilege=SYSDBA;" , "ORACLE");

4.3 MYSQL

(1).添加对DBUtil.dll引用,将MySql.Data.dll拷贝到程序运行目录,如果需要对mysql进行细粒度操作则需要添加对MySql.Data.dll的引用
(2). DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Data Source=localhost;Initial Catalog=test;User ID=root;Password=hujie110;" , "MYSQL");

4.4 SQLITE

(1).添加对DBUtil.dll引用,将System.Data.SQLite.dll、SQLite.Interop.dll拷贝到程序运行目录,如果需要对SQLITE进行细粒度操作则需要添加对System.Data.SQLite.dll的引用
(2). DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Data Source=f:\demo.db;" , "SQLITE");

4.5 ACCESS

(1).添加对DBUtil.dll引用
(2). DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:\work\Multiplan.mdb;", "ACCESS");或DBUtil.IDbAccess iDb = DBUtil.IDBFactory.CreateIDB("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Administrator\Desktop\demo.accdb;", "ACCESS");

五、其他常见方法

5.1 测试连接是否成功

DBUtil.Result res = iDb.OpenTest();

5.2 事务控制

iDb.BeginTrans();//开启事务
IDbTransaction tran= iDb.tran;//获得事务对象
iDb.Commit();//提交事务
iDb.Rollback();//回滚事务
bool b = iDb.IsTran;//是否开启了事务

5.3 控制连接打开和关闭

iDb.IsKeepConnect = true;//保持连接的打开状态

5.4 获取数据库参数模型和前缀

IDataParameter para= iDb.CreatePara();//获取空参数模型
IDataParameter para2 = iDb.CreatePara("name","jack");//获取设置好的参数模型
string str = iDb.paraPrefix;//获取sql中参数名的前缀

5.5 获取日期型过滤字符串

string filter=iDb.GetDateFilter("end", "2016-12-1", "2017-01-01", true, false);//返回 and end>='2016-12-1' and end<'2017-01-01'

5.6 生成分页查询语句

string sql = iDb.GetSqlForPageSize("select ID,Name from SysUser where ID>100", " order by ID desc", 10, 1);//MySql返回select ID,Name from SysUser where ID>100 order by ID desc limit 10 offset 10

5.7 判断表、视图、列是否存在

bool b=iDb.JudgeTableOrViewExist("test");//判断test表是否存在
bool b2 = iDb.JudgeColumnExist("test", "id");//判断test表中是否有列id

六、ID和自动编号生成控制

6.1 说明

(1).该库默认使用的生成控制是SimpleIDSNOManager,如果需要扩展可以自定义实现IDSNOManager,并在应用程序启动时书写:IDBFactory. IDSNOManage= new 自定义实现();
(2).默认控制操作将ID和编号的生成控制是将上一次的ID或编号驻留在了内存中,当有生成操作时会先去内存查找是否存在这种类型的上一个记录,如果有则直接递增一个,如果没有就根据参数去数据库里对应生成

6.2 优点

(1). ID生成时解放数据库字段设置
只需将数据库的ID字段设置为数字类型即可,不在需要自增或触发器+序列控制
(2). 提升速度
除第一次需要从后台数据库中生成ID和编号外,其余全部采用内存记录+程序锁实现
(3). 生成进度的可视化操作
用户可以在页面上看到当前ID生成的进度和编号生成的进度,并且可以删除或修改上一次生成的记录(删除生效后其后的生成操作将首先从数据库中初始化ID和编号),对于ID可以手动增加控制项(可以新的表名和列名,要保证数据库中真实存在的,如果不存在程序在重启或故障时将不能继续控制这个ID的生成)

6.3 操作方法

  6.3.1 ID操作

     //生成下一个ID
int id = iDb.IDSNOManager.NewID(iDb, "test", "id");
//强制从数据库中生成ID
int id2 = iDb.IDSNOManager.NewIDForce(iDb, "test", "id");
//重置ID生成的进度
iDb.IDSNOManager.ResetID("test", "id", 1);
//显示当前控制的所有ID进度
iDb.IDSNOManager.ShowCurrentIDs(null,null);

  6.3.2 自动编号操作

    //生成下一个编号
      iDb.IDSNOManager.NewSNO(iDb, "test", "caseno", new List<SerialChunk>(){
           new SerialChunk("prefix_GWFW","Text[GWFW][4]"),
           new SerialChunk("RiQiCtr","DateTime[yyyyMMdd][8][incycle]"),
           new SerialChunk("SerialNo","SerialNo[1,1,5,,day]")
      });
    //获取当前编号的生成进度
    List<string[]> li = iDb.IDSNOManager.ShowCurrentSNOs(null, null, null);
    //重置当前的编号生成
    List<SerialChunk> li = new List<SerialChunk>();
    li.Add(new SerialChunk(“prefix_GWFW”,null));
    li.Add(new SerialChunk(“RiQiCtr”,null));
    li.Add(new SerialChunk(“SerialNo”,null));
    iDb.IDSNOManager.ResetSNO(tableName, colName, li, null);
    iDb.IDSNOManager.NewSNO(iDb, "test", "caseno", new List<SerialChunk>(){
    new SerialChunk("prefix_GWFW","Text[GWFW][4]"),
    new SerialChunk("RiQiCtr","DateTime[yyyyMMdd][8][incycle]"),
    new SerialChunk("SerialNo","SerialNo[1,1,5,,day]")
    });
    //获取当前编号的生成进度
    List<string[]> li = iDb.IDSNOManager.ShowCurrentSNOs(null, null, null);
    //重置当前的编号生成
    List<SerialChunk> li = new List<SerialChunk>();
    li.Add(new SerialChunk(“prefix_GWFW”,null));
    li.Add(new SerialChunk(“RiQiCtr”,null));
    li.Add(new SerialChunk(“SerialNo”,null));
    iDb.IDSNOManager.ResetSNO(tableName, colName, li, null);