DbUtility数据库操作

本文详细介绍了一款通用数据库访问类的设计与实现,包括构造函数、增删改查操作、执行SQL语句等功能,并提供了针对不同数据库类型的示例。通过实践代码展示了如何灵活地与多种数据库进行交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Data;  
using System.Data.Common;  
using System.Reflection;  
using System.Text.RegularExpressions;  
  
/// <summary>  
/// 通用数据库访问类,封装了对数据库的常见操作  
/// 作者:周公  
/// 日期:2011-07-18  
/// 博客地址:http://blog.youkuaiyun.com/zhoufoxcn 或http://zhoufoxcn.blog.51cto.com  
/// 说明:(1)任何人都可以免费使用,请尽量保持此段说明。  
///      (2)这个版本还不是最终版本,有任何意见或建议请到http://weibo.com/zhoufoxcn处留言。  
/// </summary>  
public sealed class DbUtility  
{  
    public string ConnectionString { get; private set; }  
    private DbProviderFactory providerFactory;  
    /// <summary>  
    /// 构造函数  
    /// </summary>  
    /// <param name="connectionString">数据库连接字符串</param>  
    /// <param name="providerType">数据库类型枚举,参见<paramref name="providerType"/></param>  
    public DbUtility(string connectionString,DbProviderType providerType)  
    {  
        ConnectionString = connectionString;  
        providerFactory = ProviderFactory.GetDbProviderFactory(providerType);  
        if (providerFactory == null)  
        {  
            throw new ArgumentException("Can't load DbProviderFactory for given value of providerType");  
        }  
    }  
    /// <summary>     
    /// 对数据库执行增删改操作,返回受影响的行数。     
    /// </summary>     
    /// <param name="sql">要执行的增删改的SQL语句</param>     
    /// <param name="parameters">执行增删改语句所需要的参数</param>  
    /// <returns></returns>    
    public int ExecuteNonQuery(string sql,IList<DbParameter> parameters)  
    {  
        return ExecuteNonQuery(sql, parameters, CommandType.Text);  
    }  
    /// <summary>     
    /// 对数据库执行增删改操作,返回受影响的行数。     
    /// </summary>     
    /// <param name="sql">要执行的增删改的SQL语句</param>     
    /// <param name="parameters">执行增删改语句所需要的参数</param>  
    /// <param name="commandType">执行的SQL语句的类型</param>  
    /// <returns></returns>  
    public int ExecuteNonQuery(string sql,IList<DbParameter> parameters, CommandType commandType)  
    {  
        using (DbCommand command = CreateDbCommand(sql, parameters, commandType))  
        {  
            command.Connection.Open();  
            int affectedRows=command.ExecuteNonQuery();  
            command.Connection.Close();  
            return affectedRows;  
        }  
    }  
    /// <summary>     
    /// 执行一个查询语句,返回一个关联的DataReader实例     
    /// </summary>     
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
    /// <returns></returns>   
    public DbDataReader ExecuteReader(string sql, IList<DbParameter> parameters)  
    {  
        return ExecuteReader(sql, parameters, CommandType.Text);  
    }  
    /// <summary>     
    /// 执行一个查询语句,返回一个关联的DataReader实例     
    /// </summary>     
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
    /// <param name="commandType">执行的SQL语句的类型</param>  
    /// <returns></returns>   
    public DbDataReader ExecuteReader(string sql, IList<DbParameter> parameters, CommandType commandType)  
    {  
        DbCommand command = CreateDbCommand(sql, parameters, commandType);  
        command.Connection.Open();  
        return command.ExecuteReader(CommandBehavior.CloseConnection);  
    }  
    /// <summary>     
    /// 执行一个查询语句,返回一个包含查询结果的DataTable     
    /// </summary>     
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
    /// <returns></returns>  
    public DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters)  
    {  
        return ExecuteDataTable(sql, parameters, CommandType.Text);  
    }  
    /// <summary>     
    /// 执行一个查询语句,返回一个包含查询结果的DataTable     
    /// </summary>     
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
    /// <param name="commandType">执行的SQL语句的类型</param>  
    /// <returns></returns>  
    public DataTable ExecuteDataTable(string sql, IList<DbParameter> parameters, CommandType commandType)  
    {  
        using (DbCommand command = CreateDbCommand(sql, parameters, commandType))  
        {  
            using (DbDataAdapter adapter = providerFactory.CreateDataAdapter())  
            {  
                adapter.SelectCommand = command;  
                DataTable data = new DataTable();  
                adapter.Fill(data);  
                return data;  
            }  
        }  
    }  
    /// <summary>     
    /// 执行一个查询语句,返回查询结果的第一行第一列     
    /// </summary>     
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>     
    /// <returns></returns>     
    public Object ExecuteScalar(string sql, IList<DbParameter> parameters)  
    {  
        return ExecuteScalar(sql, parameters, CommandType.Text);  
    }  
  
    /// <summary>     
    /// 执行一个查询语句,返回查询结果的第一行第一列     
    /// </summary>     
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>     
    /// <param name="commandType">执行的SQL语句的类型</param>  
    /// <returns></returns>     
    public Object ExecuteScalar(string sql, IList<DbParameter> parameters,CommandType commandType)  
    {  
        using (DbCommand command = CreateDbCommand(sql, parameters, commandType))  
        {  
            command.Connection.Open();  
            object result = command.ExecuteScalar();  
            command.Connection.Close();  
            return result;  
        }  
    }  
    /// <summary>  
    /// 创建一个DbCommand对象  
    /// </summary>  
    /// <param name="sql">要执行的查询语句</param>     
    /// <param name="parameters">执行SQL查询语句所需要的参数</param>  
    /// <param name="commandType">执行的SQL语句的类型</param>  
    /// <returns></returns>  
    private DbCommand CreateDbCommand(string sql, IList<DbParameter> parameters, CommandType commandType)  
    {  
        DbConnection connection=providerFactory.CreateConnection();  
        DbCommand command = providerFactory.CreateCommand();  
        connection.ConnectionString = ConnectionString;  
        command.CommandText = sql;  
        command.CommandType = commandType;  
        command.Connection = connection;  
        if (!(parameters == null || parameters.Count == 0))  
        {  
            foreach (DbParameter parameter in parameters)  
            {  
                command.Parameters.Add(parameter);  
            }  
        }  
        return command;  
    }  
}  
/// <summary>  
/// 数据库类型枚举  
/// </summary>  
public enum DbProviderType:byte  
{  
    SqlServer,  
    MySql,  
    SQLite,  
    Oracle,  
    ODBC,  
    OleDb,  
    Firebird,  
    PostgreSql,  
    DB2,  
    Informix,  
    SqlServerCe  
}  
/// <summary>  
/// DbProviderFactory工厂类  
/// </summary>  
public class ProviderFactory  
{  
    private static Dictionary<DbProviderType, string> providerInvariantNames = new Dictionary<DbProviderType, string>();  
    private static Dictionary<DbProviderType, DbProviderFactory> providerFactoies = new Dictionary<DbProviderType, DbProviderFactory>(20);  
    static ProviderFactory()  
    {  
        //加载已知的数据库访问类的程序集  
        providerInvariantNames.Add(DbProviderType.SqlServer, "System.Data.SqlClient");  
        providerInvariantNames.Add(DbProviderType.OleDb, "System.Data.OleDb");  
        providerInvariantNames.Add(DbProviderType.ODBC, "System.Data.ODBC");  
        providerInvariantNames.Add(DbProviderType.Oracle, "Oracle.DataAccess.Client");  
        providerInvariantNames.Add(DbProviderType.MySql, "MySql.Data.MySqlClient");  
        providerInvariantNames.Add(DbProviderType.SQLite, "System.Data.SQLite");  
        providerInvariantNames.Add(DbProviderType.Firebird, "FirebirdSql.Data.Firebird");  
        providerInvariantNames.Add(DbProviderType.PostgreSql, "Npgsql");  
        providerInvariantNames.Add(DbProviderType.DB2, "IBM.Data.DB2.iSeries");  
        providerInvariantNames.Add(DbProviderType.Informix, "IBM.Data.Informix");  
        providerInvariantNames.Add(DbProviderType.SqlServerCe, "System.Data.SqlServerCe");  
    }  
    /// <summary>  
    /// 获取指定数据库类型对应的程序集名称  
    /// </summary>  
    /// <param name="providerType">数据库类型枚举</param>  
    /// <returns></returns>  
    public static string GetProviderInvariantName(DbProviderType providerType)  
    {  
        return providerInvariantNames[providerType];  
    }  
    /// <summary>  
    /// 获取指定类型的数据库对应的DbProviderFactory  
    /// </summary>  
    /// <param name="providerType">数据库类型枚举</param>  
    /// <returns></returns>  
    public static DbProviderFactory GetDbProviderFactory(DbProviderType providerType)  
    {  
        //如果还没有加载,则加载该DbProviderFactory  
        if (!providerFactoies.ContainsKey(providerType))  
        {  
            providerFactoies.Add(providerType, ImportDbProviderFactory(providerType));  
        }  
        return providerFactoies[providerType];  
    }  
    /// <summary>  
    /// 加载指定数据库类型的DbProviderFactory  
    /// </summary>  
    /// <param name="providerType">数据库类型枚举</param>  
    /// <returns></returns>  
    private static DbProviderFactory ImportDbProviderFactory(DbProviderType providerType)  
    {  
        string providerName = providerInvariantNames[providerType];  
        DbProviderFactory factory = null;  
        try  
        {  
            //从全局程序集中查找  
            factory = DbProviderFactories.GetFactory(providerName);  
        }  
        catch (ArgumentException e)  
        {  
            factory = null;  
        }  
        return factory;  
    }  
}  
/*SQLITE
string connectionString = @"Data Source=D:\VS2008\NetworkTime\CrawlApplication\CrawlApplication.db3";  
string sql = "SELECT * FROM Weibo_Media order by Id desc limit 0,20000";  
DbUtility db = new DbUtility(connectionString, DbProviderType.SQLite);  
DataTable data = db.ExecuteDataTable(sql, null);  
DbDataReader reader = db.ExecuteReader(sql, null);  
reader.Close();  
*/

/*MySQL
 string connectionString = @"Server=localhost;Database=crawldb;Uid=root;Pwd=root;Port=3306;";  
string sql = "SELECT * FROM Weibo_Media order by Id desc limit 0,20000";  
DbUtility db = new DbUtility(connectionString, DbProviderType.MySql);  
DataTable data = db.ExecuteDataTable(sql, null);  
DbDataReader reader = db.ExecuteReader(sql, null);  
reader.Close();
*/


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

目前有的版本,可以去周公的博客园看看

SQLUtility - SQLServer 工具箱 软件说明:   在使用SQLServer企业管理器生成SQL脚本时,并没有按照数据库对象的依赖关系对脚本顺序进行排序。这个BUG导致了生成的脚本无法直接执行,开发人员必须手工对其进行排序或者寻找其他替代方案,从而增加了很大的工作量和麻烦。写本工具的初始原因就是为了解决上述问题,既然写好了,就应该和大家共享。在发布之前顺便又添加了清除事务日志的功能,以后有时间、有需要的话,打算添加更多的实用功能。希望这个小工具能给大家带来一些帮助。 运行环境:   由于是使用.NET写的,所以运行前需要安装.NET运行环境,这可能会给您带来一些麻烦(下载和安装运行环境),在此,我对所有受到影响的朋友表示歉意! 本工具支持SQLServer2000+sp2以上版本,希望大家帮忙测试、报告BUG或提出建议,欢迎到我的BLOG来讨论,谢谢! 运行环境下载地址(23M): http://www.microsoft.com/downloads/details.aspx?FamilyId=262D25E3-F589-4842-8157-034D1E7CF3A3&displaylang=en http://www.ustc9703.com/download/get.asp?id=21&type=1&url=1 http://cq.down.chinaz.com/down/NETFramework.exe 如何选择和连接数据库: • 先从下拉框中选择服务器 • 如果使用用户名和密码登录,则填入用户名和密码(不要选择“集成Windows认证”复选框) • 如果使用Windows认证登录,则选中“集成Windows认证”复选框 • 完成上述步骤后,就可以从下拉框中选择数据库了(您也可以点击“重新连接”以刷新数据库信息) • 选择好数据库后,就可以执行以下各项功能 SQL脚本排序: • 使用前请先在SQLServer企业管理器里生成SQL脚本,保存为文件 • 运行本程序,在主界面上选择数据库,点击“脚本排序”按钮进入排序界面 • 在脚本排序界面点“浏览”按钮选择刚才生成的文件,点击“开始排序”按钮 清除事务日志: • 运行本程序,在主界面上选择数据库,点击“清除日志”按钮 数据导出: • 运行本程序,在主界面上选择数据库,点击“数据导出”按钮进入数据导出界面 • 导出XML:在数据导出界面中选择要导出的数据表,点击“导出XML”按钮,选择要保存的文件后等待导出结束即可;导出的结果是XML文件,该文件可以用“数据导入”功能导入到目标数据库。 • 导出SQL:在数据导出界面中选择要导出的数据表,点击“导出SQL”按钮,选择要保存的文件后等待导出结束即可;导出的结果是SQL脚本,该脚本可以用查询分析器执行。 数据导入: • 运行本程序,在主界面上选择数据库,点击“数据导入”按钮进入数据导入界面 • 进入界面时会要求您选择数据文件,您也可以点击“打开XML数据文件”选择其他的数据文件 • 在数据导入界面中选择要导入的数据表,点击“数据检测”按钮可以检查目标数据库中是否有已存在的数据 • 在数据导入界面中选择要导入的数据表,点击“导入数据”按钮可以将所选数据导入到目标数据库 • 说明:导入过程中会自动处理Identity列,并且会根据表之间的依赖关系,先导入主键表再导入外键表 作者联系方式: Email : xian@vip.163.com Blog : http://www.cnblogs.com/happyprogram/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值