本系列文章导航

基于.NET平台的Windows编程实战(一)——前言

基于.NET平台的Windows编程实战(二)—— 需求分析与数据库设计

基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写

基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现

基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现

大家都知道本系统的正常运行少不了数据库操作这一块,且其在本系统中具有决定性作用,可以说没有它的操作系统将无法运行,故在本节课程中,专门把针对数据库的操作类拿出来讲讲,以便大家更加容易理解后面的课程。

好,进入正题……

首先,我们来新建一个类,方法如下:

打开上一节课我们新建的QuestionnaireSystem项目,右击项目名,在出现的对话框中选择“添加”à“类”,在弹出的“添加新项”中选择“类”,并在下面的“名称”中输入“DbOperate”,点“添加”,如下图4-1所示:

OK,这样我们的DbOperate类文件就创建好了,但里面还是空白的,所以我们下面就一起来编写相应的方法吧。

既然要对数据库进行操作,我们先要做的第一件事当然是要写个方法来打开数据库了。因为我们用的是Access2003数据库,所以我们得首先要using 进一个System.Data.OleDb 类库及一个System.Data 类库,方法:在新建的DbOperate文件的最上面,也就是写有几个using …… 地方,写入如下内容:

using System.Data;

using System.Data.OleDb;

其次,我们需要定义如下二个数据库操作对象:

protected OleDbConnection dbconn;//定义数据库连接对象

protected OleDbCommand dbcomm = new OleDbCommand();//定义数据库操作对象

接下来,我们再写一个打开数据库连接的方法:

/// <summary>/// 打开数据库/// </summary>/// <returns></returns>        protected void CreateDbConn()        {try            {//捕获连接异常                string dbpath = @"DataBase\Lj_QuestionnaireSys.mdb";//设置数据库路径,如连接有问
题请在前面加上"..\..\",但在发布时要去掉前面的"..\..\"                dbconn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=
" + dbpath);//初始化数据库连接对象                dbcomm.Connection = dbconn;//设置数据库操作对象使用此dbconn对象                dbconn.Open();//打开数据库连接            }catch (OleDbException) //如果出现数据库连接异常,则关闭数据库连接并弹出提示框            {this.CloseDbConn();//关闭数据库连接                MessageBox.Show("数据连接错误!可能是数据库被删除了11,请联系相关技术人员!", "操作提示", 
MessageBoxButtons.OK, MessageBoxIcon.Information);// Console.Write(dbex.Message);

            }catch (Exception) //如果出现其他异常,则关闭数据库连接并弹出提示框            {this.CloseDbConn(); //关闭数据库连接                MessageBox.Show("数据连接错误!可能是数据库被删除了,请联系相关技术人员!", "操作提示", 
MessageBoxButtons.OK, MessageBoxIcon.Information);            }        }

数据库打开了,总不能让其长期开着吧!故我们还得写一关闭的方法:

        /// 关闭数据库///         protected void CloseDbConn()        {if (dbconn.State == ConnectionState.Open) //如果数据库为打开状态,则关闭            {                dbconn.Close();//关闭数据库连接            }            dbconn.Dispose();//释放连接资源            dbcomm.Dispose();//释放操作资源        }

好,至此,“开门”[打开数据库]与“关门”[关闭数据库]的方法都搞定了,下面就让我们设法在“开门”后“关门”前偷偷的躲进去做点实事吧,即写一些方法来读取或更新数据:

Code
        /**//// 
        /// 执行SQL语句
        /// 
        /// 传入的SQL语句
        public void ExcuteSql(string sqlText)
        {
            try
            {//捕获异常
                CreateDbConn();//建立连接
                dbcomm.CommandType = CommandType.Text;//设置操作类型为文本类型
                dbcomm.CommandText = sqlText;//设置操作的SQL语句
                dbcomm.ExecuteNonQuery();//执行操作
            }
            catch (Exception) //如果出现异常,则提示错误
            {
                MessageBox.Show("数据库操作错误!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {
                CloseDbConn();//关闭连接
            }
        }
        /**//// 
        /// 判断是否执行成功,返回所影响的行数
        /// 
        /// 传入的SQL语句
        /// 影响的行数
        public int ExcuteIntSql(string sqlText)
        {
            try
            {//捕获异常
                CreateDbConn();//建立连接
                dbcomm.CommandType = CommandType.Text;//设置操作类型
                dbcomm.CommandText = sqlText;//设置操作的SQL语句
                return dbcomm.ExecuteNonQuery();//执行操作,并返回影响的行数
            }
            catch (Exception) 
            {
                //MessageBox.Show("数据库操作错误!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return 0;//如果出现异常,则返回0
              
            }
            finally
            {
                CloseDbConn();//关闭连接
            } 
        }
        /**//// 
        /// 返回查询出的单条数字记录结果
        /// 
        /// 传入的SQL语句
        /// 查询出的数字结果
        public int ExcuteScrSql(string sqlText)
        {
            try
            {//捕获异常
                CreateDbConn();//建立连接
                dbcomm.CommandType = CommandType.Text;//设置操作类型
                dbcomm.CommandText = sqlText;//设置操作的SQL语句
                return Convert.ToInt32(dbcomm.ExecuteScalar());//执行操作,并返回查询出的结果
            }
            catch (Exception) 
            {
                return 0;//如果出现异常,则返回0
            }
            finally
            {
                CloseDbConn();//关闭连接
            }
        }
        /**//// 
        /// 返回查询出的单条文字记录结果
        /// 
        /// 传入的SQL语句
        /// 查询出的文字结果
        public string ExcuteStrScrSql(string sqlText)
        {
            try
            {//捕获异常
                CreateDbConn();//建立连接
                dbcomm.CommandType = CommandType.Text;//设置操作类型
                dbcomm.CommandText = sqlText;//设置操作的SQL语句
                return dbcomm.ExecuteScalar().ToString();//执行操作,并返回查询出的结果
            }
            catch (Exception)
            {
                return "";//如果出现异常,则返回空字符串
            }
            finally
            {
                CloseDbConn();//关闭连接
            }
        }
        /**//// 
        /// 返回查询出的数据表
        /// 
        /// 传入的SQL语句
        /// 查询出的数据表
        public DataTable GetDataTable(string sqlText)
        {
            OleDbDataAdapter dbdapt = new OleDbDataAdapter();//实例化一个数据缓存适配器
            DataTable dt = new DataTable();//实例化一个数据表

            try
            {//捕获异常
                CreateDbConn();//建立连接
                dbcomm.CommandType = CommandType.Text;//设置操作类型
                dbcomm.CommandText = sqlText;//设置操作的SQL语句
                dbdapt.SelectCommand = dbcomm;//执行SQL语句,选择出数据
                dbdapt.Fill(dt);//填充数据表
            }
            catch (Exception)
            {

            }
            finally
            {
                CloseDbConn();//关闭连接
            }
            return dt;//返回查询出的数据表
        }
        /**//// 
        /// 按指定条数读出的Table数据表
        /// 
        /// 传入的SQL
        /// 开始读数据的记录号
        /// 所要读出的最大条数
        /// 返回一数据表
        public DataTable GetPageDataTable(string sqlText,int pre,int maxcunt)
        {
            OleDbDataAdapter dbdapt = new OleDbDataAdapter();//实例化一个数据缓存适配器
            DataSet ds = new DataSet();//实例化一个数据缓存器

            try
            {//捕获异常
                CreateDbConn();//建立连接
                dbcomm.CommandType = CommandType.Text;//设置操作类型
                dbcomm.CommandText = sqlText;//设置操作的SQL语句
                dbdapt.SelectCommand = dbcomm;//执行操作,选择出数据
                dbdapt.Fill(ds,pre,maxcunt,"db_Table");//按指定的条数填充数据表
            }
            catch (Exception)
            {

            }
            finally
            {
                CloseDbConn();//关闭连接
            }
            return ds.Tables["db_Table"];//返回数据表
        }
//以下为合并统计的数据库操作 以下注释同上面的差不多,就不再写了
        OleDbConnection conn;
        OleDbCommand comm = new OleDbCommand();
        /**//// 
        /// 连接数据库--合并统计用
        /// 
        public void DbConn()
        {
            try
            
                string _dbpath = @"DataBase\1.mdb";
                conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + _dbpath);
                comm.Connection = conn;
                conn.Open();
                //MessageBox.Show(_dbpath);
            }
            catch (OleDbException)
            {
                CloseConn();
                MessageBox.Show("数据库连接错误!请检查数据库!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception)
            {
                CloseConn();
                MessageBox.Show("数据库连接错误!请检查数据库!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }
        /**//// 
        /// 关闭数据库--合并统计用
        /// 
        public void CloseConn()
        {
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
            conn.Dispose();

            comm.Dispose();
        }
        /**//// 
        /// 返回数据表--合并统计用
        /// 
        /// 
        /// 
        public DataTable GetTable(string sqlText)
        {
            OleDbDataAdapter odbad = new OleDbDataAdapter();
            DataTable dt = new DataTable();
            try
            {
                DbConn();
                comm.CommandType = CommandType.Text;
                comm.CommandText = sqlText;
                odbad.SelectCommand = comm;
                odbad.Fill(dt);
            }
            catch (OleDbException)
            {
                MessageBox.Show("数据库连接错误!请选择正确的数据库!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception)
            {
                MessageBox.Show("数据库连接错误!请选择正确的数据库!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            finally
            {
                CloseConn();
            }
            return dt;
        }
        /**//// 
        /// 返回查询的结果(Int)--合并统计用
        /// 
        /// 传入的SQL
        /// Int
        public int ExcueteIntSql(string sqlText)
        {
            try
            {
                DbConn();
                comm.CommandText = sqlText;
                return Convert.ToInt32(comm.ExecuteScalar());
            }
            catch (Exception)
            {
                return 0;
            }
            finally
            {
                CloseConn();
            }

        }

OK!到此,整个类算是完工了,虽然不好[没进行性能方面的优化,也没引入存储过程的操作等等],但对于基本的操作已经够用的了,故在此不作这方面的讨论;
    在后期的其它系列课程中,我打算专门写一系列针对数据库操作优化类的课程,到那时我们再拿出来一起讨论^_^

本课就先到此吧,谢谢……

附,本课程源码下载

艾伟:基于.NET平台的Windows编程实战(四)—— 数据库操作类的编写相关推荐

  1. 基于.NET平台的分层架构实战(二)——需求分析与数据库设计

    基于.NET平台的分层架构实战(五)--接口的设计与实现 · 基于.NET平台的分层架构实战(四)--实体类的设计与实现 · 基于.NET平台的分层架构实战(三)--架构概要设计 · 基于.NET平台 ...

  2. php pdo 事物类,一个基于PDO的数据库操作类(新) 一个PDO事务实例

    /* * 作者:胡睿 * 日期:2011/03/19 * 电邮:hooray0905@foxmail.com * * 20110319 * 常用数据库操作,如:增删改查,获取单条记录.多条记录,返回最 ...

  3. 基于lucene的案例开发:纵横小说数据库操作

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/46785223 http://www.llwjy.com/blogdetail/e ...

  4. 基于.NET平台的分层架构实战(一)——综述

    通过浏览博客园的文章发现,很多朋友对分层架构特别感兴趣,刚好我刚做完的毕业设计就是专门研究.NET平台上分层架构的(题目叫"基于.NET平台的分层架构与设计模式应用研究").通过做 ...

  5. Windows编程 第四回 Windows程序的生与死(下)

    致歉 很抱歉,读者看到的这篇文章将是我写的最没什么条理的一篇了,由于这一块儿内容是所有Windows程序的核心与基础,所以我分了三回来写.我想讲 得既易懂有又丰富,无奈本人才疏学浅,每每一提笔就要查很 ...

  6. Django从理论到实战(part25)--数据库操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

  7. windows程序设计 c语言,【教程】基于C语言的Windows编程入门

    (三) 窗口的创建与消息处理 原来那个程序是不是感觉有点简单?这里我们要制作一个复杂一点的Windows程序 - 显示一个空白窗口. 出于稳定性考量,Visual C++编译器中int.long等基本 ...

  8. 网络编程与分层协议设计:基于linux平台实现,网络编程与分层协议设计:基于Linux平台实现...

    图书简介 本书以Linux网络套接字编程和网络分层协议的设计与程序实现为主题,详细介绍如何在Linux平台下进行套接字程序设计,并给出了一个基于分层协议的应用实例,用于模拟Linux网络协议栈中IP层 ...

  9. 基于Qiskit——《量子计算编程实战》读书笔记(五)

    目录 前言 第7章 OpenQASM 关于 OpenQASM 将OpenQASM程序转换为量子电路 例1:取反量子比特 例2:用门操作两个量子比特并测量第一个量子比特 例3:创建一个有两个参数和两个参 ...

最新文章

  1. centos7 安装jdk7
  2. 复杂的数据类型5 - C++快速入门11
  3. PendingIntent详解
  4. java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现
  5. 【机器学习基础】GBDT 与 LR 的区别总结
  6. XidianOJ 1176 ship
  7. c++-虚函数与多态
  8. 模拟 Coder-Strike 2014 - Round 1 A. Poster
  9. c++标准程序库:STL容器之map
  10. 大厂程序员手把手教你如何写简历(附简历模板)
  11. CentOS6.9 minimal版本安装图形化界面
  12. angular之factory、service、provider
  13. javascript函数防抖Debounce
  14. loadrunner批量添加压力
  15. 微信“看一看”,“搜一搜”算法大揭秘
  16. ARM:你从未听说过的英国最成功的科技公司
  17. 天数最少的年份_农历辛丑年仅有354天是怎么回事 平年比闰年少几天
  18. UI自动化框架如何设计及搭建?
  19. ROG 冰刃 3 枪神 2 Plus 第二时间上手体验
  20. postgresql 授权某个数据库的权限给test 账号 使该账号 只能操作指定DB 不能操作其他DB

热门文章

  1. F2812 DSP程序运行在片内RAM和FLASH的区别
  2. 在Centos 6.5 X64下切割m3u8
  3. Windows API ——WritePrivateProfileString——配置文件
  4. JCG新年献礼,JHR-N825R给力上市
  5. 在 Google Earth 上看新闻
  6. KP-ABE基于属性的加密加解密算法及Access Tree构建
  7. 什么是机器学习?有哪些分类?怎样上手开发?终于有人讲明白了
  8. DeepNude已迅速下线,来看看它涉及的图像修复技术
  9. 《人类简史》作者:巨变将至!数据决定你未来是什么物种
  10. css 解析 开源库_干货 | python库大全,全面高效