这几天学习数据库操作,就自己封装了一个数据库操作类,下面是代码展示

下面的例子是Access数据库

也可能用在Sql数据库中,只在在第一行代码上修改标识符即可

#define OLEDB_

using System;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace MYDATACLASS
{
#if OLEDB_
    using MyCommand = OleDbCommand;
    using MyConnection = OleDbConnection;
    using MyDataAdapter = OleDbDataAdapter;
    using MyDataRead = OleDbDataReader;
    using MyParameter = OleDbParameter;

#elif SQL_
    using MyCommand = SqlCommand;
    using MyConnection = SqlConnection;
    using MyDataAdapter = SqlDataAdapter;
    using MyCommandBuilder = SqlCommandBuilder;
    using MyParameter = SqlParameter;
    using MyDataRead = SqlDataReader;

//....
#endif

/// <summary>
    /// 封装对数库操作的静态方法类
    /// <para>GetTable 获得要查询的DataTable表</para>
    /// <para>GetDataSet 获得查询的DataSet表的集合</para>
    /// <para>GetDataRead 获得查询的DataRead对象</para>
    /// <para>ExecuteNonQuery 执行数据的增,删,改等操作</para>
    /// <para>ImageToByte,BetyToImage,字节byte[]和Image相互转换</para>
    /// <para>版权:greenleaf1976</para>
    /// <para>创建时间:2021-07-16</para>
    /// </summary>
    public class BaseADO
    {
        public static MyConnection conn = null;
 
        public static string Conn_String= @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\MyAccessFile\newToxinlu.accdb";
 
        public BaseADO() { }
 
        ~BaseADO()
        {
            conn.Dispose();
            //CloseConn();
        }
 
        /// <summary>
        /// 初始化Conn对象,并打开连接
        /// </summary>
        private static void InitConnection()
        {
            if (conn == null)
                conn = new MyConnection(Conn_String);
            if (conn.State == ConnectionState.Closed)
                conn.Open();
            if(conn.State==ConnectionState.Broken)
            {
                conn.Close();
                conn.Open();
            }
        }
 
        /// <summary>
        /// 获得查询结果的表,如果只想用Sql语句,后面参数可省略
        /// <para>如果用Sql+参数列表查询,格式为:</para>
        /// <para>(sql,mPars:pars)格式跳过中间的参数,也就是给指定的参数赋值</para>
        /// </summary>
        /// <param name="sqlStr">Sql语句或是储存过程名</param>
        /// <param name="cmdType">选择用Sql语句还是储存过程查询</param>
        /// <param name="mPars">参数列表</param>
        /// <returns></returns>
        public static DataTable GetDataTable(string sqlStr, CommandType cmdType = CommandType.Text, params MyParameter[] mPars)
        {
            InitConnection();
            DataTable dt = new DataTable();
            MyCommand cmd = null;
            MyDataAdapter da = null;
            try
            {
                cmd = new MyCommand(sqlStr, conn);
                cmd.CommandType = cmdType;
                if(mPars.Length!=0)
                {
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(mPars);
                }
                da = new MyDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                da.Dispose();
                cmd.Dispose();
                conn.Close();
            }
 
            return dt;
        }
 
        /// <summary>
        /// 获得Sql语句或是储存过程查询的表的集合
        /// </summary>
        /// <param name="sqlStr">Sql语句或是储存过程名</param>
        /// <param name="cmdType">是用Sql语句还是储存过程查询</param>
        /// <param name="mPars">参数列表</param>
        /// <returns>查询表的集合DataSet</returns>
        public static DataSet GetDataSet(string sqlStr, CommandType cmdType = CommandType.Text, params MyParameter[] mPars)
        {
            InitConnection();
            DataSet ds = new DataSet();
            MyDataAdapter da = null;
            MyCommand cmd = null;
            try
            {
                cmd = new MyCommand();
                cmd.CommandText = sqlStr;
                cmd.Connection = conn;
                cmd.CommandType = cmdType;
                if(mPars.Length!=0)
                {
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(mPars);
                }
                da = new MyDataAdapter(cmd);
                da.Fill(ds);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                cmd.Dispose();
                da.Dispose();
                conn.Close();
            }
            return ds;
        }
        /// <summary>
        /// 通过Sql语句查询,返回DataRead对象
        /// <para>不能断开连接,查询后手动关闭连接</para>
        /// <para>多用于递归加载数据用</para>
        /// </summary>
        /// <param name="sqlStr"></param>
        /// <returns></returns>
        public static MyDataRead GetDataRead(string sqlStr,CommandType cmdType=CommandType.Text,params MyParameter[] pras)
        {
            InitConnection();
            MyDataRead dr = null;
            MyCommand cmd = null;
            try
            {
                cmd = new MyCommand(sqlStr, conn);
                cmd.CommandType = cmdType;
                dr = cmd.ExecuteReader();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }      
            return dr;
        }   
 
        /// <summary>
        /// 用Sql语句,参数列表对数据库的
        /// Insert,Update,Delete执行操作
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="mPars"></param>
        /// <returns></returns>
        public static int ExecuteNonQuery(string sql,CommandType cmdType=CommandType.Text, params  MyParameter[] mPars)
        {
            InitConnection();
            int nRet = 0;
            MyCommand cmd = null;
            try
            {
                cmd = new MyCommand(sql, conn);
                cmd.CommandType = cmdType;
                if(mPars.Length!=0)
                {
                    cmd.Parameters.Clear();
                    cmd.Parameters.AddRange(mPars);
                }
                nRet =cmd.ExecuteNonQuery();
            }
            catch (System.Exception ex)
            {
 
                MessageBox.Show(ex.Message);
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
            }
            return nRet;
        }
 
        /// <summary>
        /// 图片(Image)格式转为字节(byte[])格式
        /// </summary>
        /// <param name="_image"></param>
        /// <returns></returns>
        public static byte[] ImageToByte(Image _image)
        {
            MemoryStream ms = new MemoryStream();
            _image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            return ms.ToArray();
        }
 
        /// <summary>
        /// 字节(byte[])转为图片(Image)格式
        /// </summary>
        /// <param name="buff"></param>
        /// <returns></returns>
        public static Image BetyToImage(byte[] buff)
        {
            MemoryStream memoryStream = new MemoryStream(buff, 0, buff.Length);
            memoryStream.Write(buff, 0, buff.Length);
            Image image = null;
            try
            {
                //字节数组转成Image对象
                image = Image.FromStream(memoryStream);
            }
            catch (Exception)
            {
                throw;
            }
            return image;
        }
    }
基本上有这几个方法就能操作数据库了.

特别要说的是GetDataRead()这个方法是要连接数据库操作的,一般我用在数据递归中

最后递归完了手动关闭连接,其他的方法都是断开连接操作的,函数返回前就关闭了连接,

所以在外面调用的时候就不用关闭数据库连接了.

在写个类继承BaseADO类,在子类写实际的数据库操作方法

下面以修改数据库数据为例;

/// <summary>
        /// 更新指定id的数据库数据
        /// </summary>
        /// <param name="stu">要更新的数据结构</param>
        /// <param name="id">要更新的查询id</param>
        /// <returns></returns>
        public static int UpdateAllData(STUDENT_INFO stu,string id)
        {
            string sql = "update {0} set mName=@name,mSex=@sex,mAge=@age,mTel=@tel,";
            sql += "mFenZu =@fenzu,mBirthday=@birthday,mQQ=@qq,mAddess=@addess,";
            sql += "mBeiZu =@beizu,mPicBytes=@picbytes where mID=@mid";
            sql = string.Format(sql, MYTABLE_NAME);
            //STUDENT_INFO stu = GetDataToStudentInfo();
 
            MyParameter[] pars =
            {
                new MyParameter("@name",stu.name),
                new MyParameter("@sex",stu.sex),
                new MyParameter("@age",stu.age),
                new MyParameter("@tel",stu.tel),
                new MyParameter("@fenzu",stu.fenzu),
                new MyParameter("@birthday",stu.birthday),
                new MyParameter("@qq",stu.qq),
                new MyParameter("@addess",stu.addess),
                new MyParameter("@beizu",stu.beizu),
                new MyParameter("@picbytes",stu.picBytes),
                new MyParameter("@mid",id)
            };
 
            return ExecuteNonQuery(sql, mPars:pars);
        }
是后调用的这个ExecuteNonQuery()方法的参数要注意,因中间还有一个参数有默认值,

所以要用指定参数名值的格式(形参名:实参名),不然是通不过的.

C#自己封装数据库操作类BaseADO的更多相关文章

  1. php单例模式封装数据库操作类增删改查

    <?php//三私一公 单例class Db{ //数据库连接对象 private static $instance; private static $table_name; private $ ...

  2. 自己封装的ASP.NET的MYSQL的数据库操作类

    /** * 作者:牛腩 * 创建时间:2010年3月7日17时35分 * 类说明:对MYSQL数据库的操作类 */ using System; using System.Data; using MyS ...

  3. ecshop数据库操作类

    ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现. 好处:实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小. 当网站需要做me ...

  4. ECShop - 数据库操作类

    ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小.另外,当网站 ...

  5. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  6. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...

  7. PHP 数据库操作类:ezSQL

    EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.htmlezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.o ...

  8. 通用数据库操作类,前端easyui-datagrid,form

    实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...

  9. php : mysql数据库操作类演示

    设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...

  10. php MySQL数据库操作类源代码

    php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...

随机推荐

  1. springboot使用mail提示没有该类型的bean

    @Autowired private JavaMailSenderImpl javaMailSender; 自动注入时提示没有该类型的Bean. 原因 没有配置邮件发送相关的配置信息. spring: ...

  2. 『vulnhub系列』HMS-1

    『vulnhub系列』HMS?-1 下载地址: https://www.vulnhub.com/entry/hms-1,728/ 信息搜集: 使用nmap进行存活主机探测,发现开启了21端口(ftp) ...

  3. ARM+DSP!全志T113-i+玄铁HiFi4开发板硬件说明书(1)

    前 言 本文档主要介绍开发板硬件接口资源以及设计注意事项等内容,测试板卡为全志T113-i+玄铁HiFi4开发板.由于篇幅问题,本篇文章共分为上下两集,点击账户可查看更多内容详情,开发问题欢迎留言,感 ...

  4. multipass中docker的使用及固定ip的配置

    之前一直用WSL2,但是可能我高估了我笔记本的性能,每次开启后我的win11都闪得厉害. 公司给配发的联想昭阳 前两天实在受不了,把它重装了.才发现之前一直很抵触重装,结果重装完工作几乎没怎么受影响. ...

  5. Java 、C# Excel模板,数据一对多,主从表关系,导入到数据库

    思路 单表导入的比较容易,但是有的时候,可能会出现,一对多数据导入的,这个情况怎么办呢?先理解上面的图,后台获取数据的时候,除了"风险防控措施"外,其他字段先分组,"黄色 ...

  6. Spring5.X的bean的scope作用域

    scope属性 singleton:单例,默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高,当一个bean被标识为singleton时候,spring的IOC容器中只会存在 ...

  7. Flask API 如何接入 i18n 实现国际化多语言

    ​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言. 用户请求 API 的多语言化其实有两种 ...

  8. 一位有着近 10 年 iOS 开发经验的全职爸爸如何高效管理时间?

    名字: Mindr 开发者 / 团队: Florian Vates 平台: iOS, iPadOS, Android 正在开发中 请简要介绍下这款产品 有没有发现自己总是不断推迟待办事项的通知? Mi ...

  9. centos下安装Docker容器

    安装前的准备工作 1.列出docker安装过的相关包 sudo yum list installed | grep docker 2.删除相关安装包 #根据查找出来的进行删除,不同版本可能有不一样的情 ...

  10. webpack性能优化方式之dll--- webpack.dll.config.js

    通常来说,我们的代码都可以至少简单区分成业务代码和第三方库.如果不做处理,每次构建时都需要把所有的代码重新构建一次,耗费大量的时间.然后大部分情况下,很多第三方库的代码并不会发生变更(除非是版本升级) ...