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

推荐订阅源

L
LangChain Blog
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
S
SegmentFault 最新的问题
量子位
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 司徒正美
博客园 - Franky
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
B
Blog RSS Feed
C
Check Point Blog
The Cloudflare Blog
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
V
Visual Studio Blog
V
V2EX
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 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();
        }
    }
}