惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
博客园_首页
H
Help Net Security
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
V
Visual Studio Blog
The Cloudflare Blog
腾讯CDC
Jina AI
Jina AI
Last Week in AI
Last Week in AI
月光博客
月光博客
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
爱范儿
爱范儿
N
Netflix TechBlog - Medium
F
Fortinet All Blogs

博客园 - Loder

Bye2025, Hi2026 Bye 2024, Hi 2025 Bye 2023, Hi2024 Bye2022, Hi2023 公文常用字体下载 【知乎经典回答】假如日本沉没,你认为日本会选择强攻一个地方还是谈判? Bye2021, Hi2022 家庭记账之会计科目设置 Bye2020, Hi2021 Bye2018, Hi2019 会计平台常见问题QA(2021年停止更新) bye 2016, hi 2017 某软件某平台常见问题处理方法 某软件某接口常见问题处理方法 某软件常见问题SQL排查方法 为什么说程序员的前三年不要太看重工资水平 Oracle查看锁表与解锁方法 Oracle执行CreateTableAs报ORA-600错误 List(支持按笔画排序的List类)
HahaMil数据库(数据库操作组件)
Loder · 2014-09-24 · via 博客园 - Loder

HahaMil数据库是一个基于·NET Framework的数据库操作组件,类似于微软的SqlHelper类,但更适合实际应用。
HahaMil数据库中包含数据库操作方法,HahaMil数据库用于简化程序编码中需要重复的写SqlConnection、SqlCommand、SqlDataReader等等,封装过后通常是只需要传入一些参数如数据库信息,SQL语句、绑定变量、参数等,就可以执行数据库操作。
HahaMil数据库目前支持SQL Server和Oracle,未来将支持更多数据库。

DLL下载地址:http://www.hi1988.com/hahamil/HahaMil.Data.rar

HahaMil数据库代码附在后面,希望大家一起指出其中的错误和需要优化改进的地方,不胜感激。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace HahaMil.Data
{
    /// <summary>
    /// HahaMil 数据库接口
    /// </summary>
    public interface IHahaDatabase
    {
        string getDBType();

        void BeginTransaction();

        void Commit();

        DataTable ExecSelect(string sql);

        int ExecSQL(string sql);

        int ExecSQL(string sql, params object[] values);

    }
}
namespace HahaMil.Data
{

    /// <summary>
    /// HahaMil SQLServer数据库
    /// </summary>
    public class HahaSQLServerDatabase : IHahaDatabase
    {
        private string strSQLServerConnection = "server={0};database={1};uid={2};pwd={3}";//连接字符串 weixj 2014-09-18
        private SqlConnection conn;
        private SqlCommand comm;
        private SqlTransaction tran;

        /// <summary>
        /// 构造函数(设置数据库连接信息)
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="database">数据库</param>
        /// <param name="uid">用户</param>
        /// <param name="pwd">密码</param>
        public HahaSQLServerDatabase(string server, string database, string uid, string pwd)
        {
            strSQLServerConnection = string.Format(strSQLServerConnection, server, database, uid, pwd);//根据用户设置生成连接字符串 weixj 2014-09-18
            conn = new SqlConnection(strSQLServerConnection);
            comm = new SqlCommand();
            comm.Connection = conn;
        }

        /// <summary>
        /// 获取数据库类型
        /// </summary>
        /// <returns>数据库类型</returns>
        public string getDBType()
        {
            return "SQLServer";
        }

        /// <summary>
        /// 开始事务
        /// </summary>
        public void BeginTransaction()
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            tran = conn.BeginTransaction();
        }

        /// <summary>
        /// 提交事务
        /// </summary>
        public void Commit()
        {
            try
            {
                tran.Commit();
            }
            catch (Exception ex)
            {
                tran.Rollback();
                throw new Exception("SQL执行失败,原因:" + ex.Message);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                {
                    conn.Close();
                }
            }
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="sql">查询SQL</param>
        /// <returns>查询结果DataTable</returns>
        public DataTable ExecSelect(string sql)
        {
            DataTable dt = new DataTable();
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            comm.CommandText = sql;
            comm.Transaction = tran;
            SqlDataAdapter adapter = new SqlDataAdapter(comm);
            adapter.Fill(dt);
            return dt;
        }

        /// <summary>
        /// 执行SQL
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns>执行后影响的行数</returns>
        public int ExecSQL(string sql)
        {
            if (conn.State != ConnectionState.Open)//因BeginTransction时打开连接,所以在此判断 weixj 2014-09-23
            {
                conn.Open();
            }
            comm.CommandText = sql;
            comm.Transaction = tran;
            int rows;
            rows = comm.ExecuteNonQuery();
            return rows;

        }

        /// <summary>
        /// 执行SQL
        /// </summary>
        /// <param name="sql">sql语句(绑定变量在sql语句中使用{0}、{1}、{2}、……、{n}表示)</param>
        /// <param name="values">绑定变量</param>
        /// <returns>执行后影响的行数</returns>
        public int ExecSQL(string sql, params object[] values)
        {
            for (int i = 0; i < values.Length; i++)
            {
                sql = sql.Replace("{" + i.ToString() + "}", "@para" + i.ToString());//+拼接代价较高,应考虑使用效率更高的方法 weixj 2014-09-23
            }
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            comm.CommandText = sql;
            comm.Parameters.Clear();
            comm.Transaction = tran;
            for (int i = 0; i < values.Length; i++)
            {
                comm.Parameters.Add("@para" + i.ToString(), values[i]);
            }
            int rows;
            rows = comm.ExecuteNonQuery();
            return rows;
        }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.OracleClient;
using System.Data.OleDb;

namespace HahaMil.Data
{
    /// <summary>
    /// HahaMil Oracle数据库
    /// </summary>
    public class HahaOracleDatabase : IHahaDatabase
    {
        private string strOracleServerConnection = "Provider=OraOLEDB.Oracle.1;User ID={2};Password={3};Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = {1})))";
        OleDbConnection conn;
        OleDbCommand comm;
        OleDbTransaction tran;

        /// <summary>
        /// 构造函数(设置数据库连接信息)
        /// </summary>
        /// <param name="server">服务器</param>
        /// <param name="database">数据库</param>
        /// <param name="uid">用户</param>
        /// <param name="pwd">密码</param>
        public HahaOracleDatabase(string server, string database, string uid, string pwd)
        {
            strOracleServerConnection = string.Format(strOracleServerConnection, server, database, uid, pwd);
            conn = new OleDbConnection(strOracleServerConnection);
            comm = new OleDbCommand();
            comm.Connection = conn;
        }

        /// <summary>
        /// 获取数据库类型
        /// </summary>
        /// <returns>数据库类型</returns>
        public string getDBType()
        {
            return "Oracle";
        }

        /// <summary>
        /// 开始事务
        /// </summary>
        public void BeginTransaction()
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            tran = conn.BeginTransaction();
        }

        /// <summary>
        /// 提交事务
        /// </summary>
        public void Commit()
        {
            try
            {
                tran.Commit();
            }
            catch (Exception ex)
            {
                tran.Rollback();//在提交时设置发生错误回滚数据,程序中不必再单独写回滚语句。 weixj 2014-09-23
                throw new Exception("SQL执行失败,原因:" + ex.Message);
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                {
                    conn.Close();
                }
            }
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="sql">查询SQL</param>
        /// <returns>查询结果DataTable</returns>
        public DataTable ExecSelect(string sql)
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            DataTable dt = new DataTable();
            comm.Transaction = tran;
            comm.CommandText = sql;
            OleDbDataAdapter adapter = new OleDbDataAdapter(comm);
            adapter.Fill(dt);
            return dt;
        }

        /// <summary>
        /// 执行SQL
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns>执行后影响的行数</returns>
        public int ExecSQL(string sql)
        {
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            comm.Transaction = tran;
            comm.CommandText = sql;
            int rows;
            rows = comm.ExecuteNonQuery();
            return rows;
        }

        /// <summary>
        /// 执行SQL
        /// </summary>
        /// <param name="sql">sql语句(绑定变量在sql语句中使用{0}、{1}、{2}、……、{n}表示)</param>
        /// <param name="values">绑定变量</param>
        /// <returns>执行后影响的行数</returns>
        public int ExecSQL(string sql, params object[] values)
        {
            for (int i = 0; i < values.Length; i++)
            {
                sql = sql.Replace("{" + i.ToString() + "}", ":para" + i.ToString());
            }
            if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            comm.Transaction = tran;
            comm.CommandText = sql;
            comm.Parameters.Clear();
            for (int i = 0; i < values.Length; i++)
            {
                comm.Parameters.Add("para" + i.ToString(), values[i]);
            }
            int rows;
            string s = comm.CommandText;
            rows = comm.ExecuteNonQuery();
            return rows;
        }
    }
}

以下是测试类:

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using HahaMil.Data;//使用HahaMil数据库时引入

namespace HahaTest
{
    class HahaDBTest
    {
        public static void Main(String[] args)
        {
            string server = "(local)";
            string database = "MyTest";
            string uid = "hahamil";
            string pwd = "ha_public";
            //创建数据库
            IHahaDatabase db = new HahaSQLServerDatabase(server, database, uid, pwd);
            IHahaDatabase db_oracle = new HahaOracleDatabase(server, database, uid, pwd);
            //以下以SQLServer数据库为例测试,Oracle数据库使用方法一样。
            //测试执行SQL
            db.ExecSQL("delete from Mytest1 where name like 'test%'");
            for (int i = 0; i < 100; i++)
            {
                //测试执行带有绑定变量的SQL
                db.ExecSQL("insert into Mytest1 (ID,Name,CreatedTime) values({0},{1},{2})", System.Guid.NewGuid(), "test" + i.ToString(), DateTime.Now);
            }
            //测试执行查询
            DataTable dt = db.ExecSelect("select * from Mytest1");
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    Console.Write(row["ID"].ToString());
                    Console.Write("\t");
                    Console.Write(row["Name"].ToString());
                    Console.Write("\t");
                    Console.Write(row["CreatedTime"].ToString());
                    Console.Write("\n");
                }
            }
            //测试DB事务
            db.BeginTransaction();
            db.ExecSQL("delete from Mytest1 where name like 'test%'");
            db.ExecSQL("insert into Mytest1 (ID,Name,CreatedTime) values({0},{1},{2})", System.Guid.NewGuid(), "testTransction", DateTime.Now);
            db.Commit();

            //end
            Console.ReadLine();
        }
    }
}