C#自己封装数据库操作类BaseADO
这几天学习数据库操作,就自己封装了一个数据库操作类,下面是代码展示
下面的例子是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的更多相关文章
- php单例模式封装数据库操作类增删改查
<?php//三私一公 单例class Db{ //数据库连接对象 private static $instance; private static $table_name; private $ ...
- 自己封装的ASP.NET的MYSQL的数据库操作类
/** * 作者:牛腩 * 创建时间:2010年3月7日17时35分 * 类说明:对MYSQL数据库的操作类 */ using System; using System.Data; using MyS ...
- ecshop数据库操作类
ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现. 好处:实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小. 当网站需要做me ...
- ECShop - 数据库操作类
ECShop v2.7.2没有使用一些开源的数据库操作类,比如adodb或者PEAR,而是封装了自己的实现.这样做的好处是实现非常轻量,只有一个文件,27Kb,大大减小了分发包的文件大小.另外,当网站 ...
- 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~
最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...
- Android打造属于自己的数据库操作类。
1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...
- PHP 数据库操作类:ezSQL
EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.htmlezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.o ...
- 通用数据库操作类,前端easyui-datagrid,form
实现功能: 左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...
- php : mysql数据库操作类演示
设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...
- php MySQL数据库操作类源代码
php MySQL数据库操作类源代码: <?php class MySQL{ private $host; //服务器地址 private $name; //登录账号 private $pwd; ...
随机推荐
- P2467 [SDOI2010] 地精部落 学习笔记
DP 显然我固定第一个是峰,然后再乘以2就是答案,因为一个合法的反转之后也是合法的而且谷峰颠倒了 发现如果设\(dp[i][j]\)表示前\(i\)个山脉,第\(i\)个山脉是高度\(j\)的答案,然 ...
- Android 7 修改启动动画和开机声音
背景 在修改开机音量的时候,发现找不到对应的声音功能调用. 因此了解了一下安卓的开机声音是如何实现的. 安卓4~安卓7 都可以这么做. 参考: https://blog.csdn.net/chen82 ...
- 算法金 | 致敬深度学习三巨头:不愧是腾讯,LeNet问的巨细。。。
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 读者参加面试,竟然在 LeNet 这个基础算法上被吊打~ LeNe ...
- 韦东山freeRTOS系列教程之【第七章】互斥量(mutex)
目录 系列教程总目录 概述 7.1 互斥量的使用场合 7.2 互斥量函数 7.2.1 创建 7.2.2 其他函数 7.3 示例15: 互斥量基本使用 7.4 示例16: 谁上锁就由谁解锁? 7.5 示 ...
- python3 json.dumps(OrderDict类型) 报错:TypeError: Object of type datetime is not JSON serializable
chatgpt给出的解决方案, 在json.dumps()函数调用中传入default参数来指定如何处理datetime对象 import json from datetime import date ...
- Java 核心基础之static静态代码块和静态方法
static静态代码块和静态方法 static关键字 static修饰的方法或变量,优先于对象执行,所以内存会先有static修饰的内容,后有对象的内容 可以用来修饰类的成员方法.类的成员变量,还可以 ...
- yb课堂 新版Vue+脚手架Vue-Cli 4.3安装 《二十七》
本地搭建Vue.CLI.Cube-UI相关框架 什么是Vue 一套用于构建用户界面的渐进式框架.与其他大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,不仅易于上手,还 ...
- mybatis 逆行工程 附源码
导读 逆向工程说白了,就可以简化开发工作量,自动生成一些死板的东西,比如POJO.映射文件等等,然后在将代码拷贝至实际工程,直接拿来用! 项目结构 GeneratorSqlMap.java impor ...
- Solo 开发者周刊 (第 1 期):开源产品的探索之路
产品推荐 如何着手将一个简单的想法转变为一个成熟的开源项目,以及如何在此过程中利用和贡献于开源社区.同时使其达到商业化的同时,保持原有的开源精神.这些是我们需要探索的. Spug 开源运维平台 Spu ...
- 可能是全网最适合入门的面向对象编程教程:Python实现-嵌入式爱好者必看!
前言 对于嵌入式入门的同学来说,往往会遇到设备端处理能力不足.在面对大规模计算情况下需要借助上位机完成进一步的数据处理的情况.此时,Python 语言因其简单易用的特点和丰富多样的库成为了我们做上位机 ...