巩固ADO.NET

回想一年半前学数据库的时候是找的培训视频看的,大概10天视频(有一半多时间关于数据库操作的winform)的内容看完后数据库这块就没有了,还以为自己学的挺好,现在想想真是傻的可爱。虽然以ADO.NET为基础的EF挺好用的,但抽时间好好巩固下基础我觉得很重要。不废话了,ADO.NET提供对SQL、Oracle和MySql等数据库的访问操作,它有2个重要的组成部分:.NET数据提供程序和数据集DataSet。

1.什么是ADO.NET

  .NET数据提供程序就是一个类集,本质的功能就是用于连接数据库、执行命令和检索结果,它可以理解为数据库与应用程序的一个接口层。主要的核心对象有4个,所有的.NET数据提供程序都实现了这几个对象各自的版本,附加了各自的前缀。

  Connection对象:用于连接数据源。

  Command对象:对数据源执行命令。

  DataReader对象:在只读和只写的连接模式下从数据源读取数据。

  DataAdapter对象:读取数据并使用所读取的数据填充数据集对象。

  DataSet则是为独立于任何数据源的数据访问而设计,它可以用于多种不同的数据源。DataSet是一个集合,每一个子集则是DataTable对象,DataTable对象有数据行和数据列以及有关DataTable对象中的数据的主键、外键、约束和关系信息组成。我看的一本书举了一个很好的例子,我们可以想象数据库好比水源,存储了大量的数据,Connection对象好比进水管,通过它保持与水的接触并在需要时通过进水管抽水;Command对象则扮演着抽水机的角色,它为抽水提供执行方法;DataAdapter和DataReader就像输水管,负责水的传输任务;DataSet则是一个大水池,用于存放从水源里抽取的数据。

  通过上面我们知道通过Connection与数据库建立连接或断开连接,对于SQL这个对象则是SqlConnection,Oracle则是OracleConnection,此外还有MySqlConnection等。

(1)连接SQL,string conStr="data source=127.0.0.1;Database=DataBase;user id=sa;password=123456";

        SqlConnection connection=new SqlConnection(conStr);

        connection.Open();

(2)对于OracleConnection对象则与SQL基本相同。

(3)在.Net中连接数据库有2种方法:ODBC连接器和OleDbConnection连接器。ODBC连接器是一个符合ODBC标准的交互平台,是.NET访问MySql的首选。首先需要得到MySql.Data.MySqlClient这个命名空间,引入后与SqlConnection基本相同。

从上面的分类可以看出写法基本一样,除了类名需要使用各自对应的类,这种统一的编程模型使编程变得很简单。

2.Command

前面说到Command相当于抽水机,它控制“抽水”,对于数据库来说这个对象封装了我们想要操作的各种操作数据库的命令,也就是SQL语句。

//使用command对数据库进行操作
            string str="连接数据库字符串";
            SqlConnection connection = new SqlConnection(str);
            string strQuery1 = "";
            string strQuery2 = "";
            connection.Open();
            //开始数据库事务,保证数据库的ACID:原子性、一致性、隔离性和持久性
            SqlTransaction trans = connection.BeginTransaction();
            //建立SqlCommand与SqlConnection的关联,除了使用构造函数,还有下面两种写法
            //command.Connection=connection;    command=connection.CreateCommand();
            SqlCommand command = new SqlCommand(strQuery1, connection, trans);
            try
            {
                int rows = command.ExecuteNonQuery();
                command.CommandText = strQuery2;                    //设置SqlCommand的查询文本

                //SqlCommand主要有4种方法
                SqlDataReader dr = command.ExecuteReader();     //查询数据,返回一行或多行
                rows = command.ExecuteNonQuery();                   //返回受影响的行数
                var data = command.ExecuteScalar();                     //返回结果集中的第一行的第一列
                object obj = command.ExecuteXmlReader();           //返回一个XmlReader对象
                trans.Commit(); //提交数据库事务
                connection.Close();
            }
            catch
            {
                trans.Rollback();
            }

当使用SqlCommand执行存储过程时,需要将SqlCommand.CommandType属性设置为StoredProcedure,这样显示设置就不需要在执行之前分析命令。

3.DataAdapter和DataReader

  DataAdapter将数据加载到DataSet中,并使DataSet中数据的更改与数据源保持一致。

//使用command对数据库进行操作
            string str = "连接数据库字符串";
            SqlConnection connection = new SqlConnection(str);
            string strQuery1 = "";
            connection.Open();
            SqlCommand command = new SqlCommand(strQuery1, connection);
            DataSet ds=new DataSet();
            //创建SqlDataAdapter的四种方式
            SqlDataAdapter dataAdapter = new SqlDataAdapter();
            SqlDataAdapter dataAdapter2 = new SqlDataAdapter(command);
            SqlDataAdapter dataAdapter3 = new SqlDataAdapter(strQuery1, connection);
            SqlDataAdapter dataAdapter4 = new SqlDataAdapter(strQuery1, str);
            dataAdapter.SelectCommand = command;
            dataAdapter.Fill(ds);
            connection.Close();

执行ExecuteReader方法时可以返回一个DataReader对象,DataReader以只进、只读方式返回数据,这样不会通过DataSet,这也是DataReader与DataAdapter的主要区别。但我们得到DataReader对象后,可以使用Read方法去读取每一行的数据。如果我们采用Read方法去得到数据,有一个很麻烦的事情那就是经常需要转换,其实DataReader为我们提供了一个非常便利的类型访问器,比如DataReader对象为dr,我们可以使用dr.GetString(“索引”),这样是直接返回string类型的。还有一点要注意,使用dr后要调用Close方法,说到关闭还有一个显示关闭Connection的方法,那就是将CommandBehavior.CloseConnection传递给ExecuteReader方法,这样的话调用dr.Close()时相应的连接就关闭了。最好的方式是我们写这方面的程序习惯性的加上using语句块,这样就不会出错了。

4.DataSet

  这个类是ADO.NET中最核心的成员之一,是各种基于.NET平台的应用程序存储数据的数据池。DataSet最大的优点是离线或连接都可以操作数据,这样就可以大大减小服务器数据库的连接线程,当然离线时,如果进行的数据量操作比较大的话,真真更新到数据库时应该是很消耗性能的。DataSet的基本工作过程为:应用程序一般并不直接对数据库进行操作(使用存储过程除外),而是将数据全部填入DataSet对象后,客户端则是对DataSet进行操作,然后通过DataSet来和数据适配器将更新的数据同步到数据库中。一个DataSet由多个DataTable组成,一个DataTable就相当于一张数据表。具体用法如下。

DataSet ds=new DataSet();
            DataTableCollection dtc = ds.Tables;
            DataTable dt = dtc[1];
            //获取所有行、满足条件的行、满足条件且排序、满足特定条件
            DataRow[] rows = dt.Select();
            DataRow[] rows1 = dt.Select("ID>20");
            DataRow[] rows2 = dt.Select("ID>20","ID DESC");
            DataRow[] rows3 = dt.Select("ID>20", "ID DESC",DataViewRowState.ModifiedCurrent);
            //我们在使用SQL时,还可以轻松地对数据进行Sum、Aver、Count等操作来获得统计结果,这需要使用到Compute函数
            object c = dt.Compute("sum(ID)", "age<60");//得到年龄小于60的ID的总和,当然它的功能终究是没有SQL强大的

 5.封装SqlHelper

下面是我写的一个封装数据库操作的类

class SqlHelper
    {
        #region connstr
        //2.WinForm项目,请添加对“System.Configuration”的引用
        //2.1.对配置文件connectionStrings节进行读取
        static string connstr = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
        #endregion

        #region 查询数据库返回一张表 + static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
        /// <summary>
        /// 查询数据库返回一张表
        /// </summary>
        public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
        {
            //创建一个零时的数据集,在内存里
            DataSet ds = new DataSet();
            //创建一个适配器对象,
            SqlDataAdapter adapter = new SqlDataAdapter(sql, connstr);
            //给适配器对象的查询命令对象添加参数
            adapter.SelectCommand.Parameters.AddRange(parameters);
            try
            {
                //填充数据集
                adapter.Fill(ds);
                return ds.Tables[0];
            }
            catch//如果捕捉错误,那么就返回null
            {
                return null;
            }
        }
        #endregion

        #region 返回受影响的行数   ExecuteNonQuery(string sql, params SqlParameter[] parameters)
        /// <summary>
        /// 返回受影响的行数
        /// </summary>
        public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddRange(parameters);
                    conn.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
        }
        #endregion

        #region 返回查询结果 object ExecuteScalar(string sql, params SqlParameter[] parameters)
        /// <summary>
        /// 返回查询结果
        /// </summary>
        public static object ExecuteScalar(string sql, params SqlParameter[] parameters)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    cmd.Parameters.AddRange(parameters);
                    conn.Open();
                    return cmd.ExecuteScalar();
                }
            }
        }
        #endregion
    }
时间: 2024-08-01 22:39:31

巩固ADO.NET的相关文章

ODBC、ADO

一.VC访问数据库的技术 1.ODBC --Open Database Connectivity微软开放式数据互联,一组用于访问和操作数据库的API,可以访问不同的数据库产品,但只能访问关系型数据库.MFC将这组API函数封装成ODBC类,使用前需要将不同的数据库设置为ODBC数据源. 2.DAO --基于ODBC的,目前已经被淘汰 3.OLE DB  --基于COM技术的,提供了一组用于访问和操作数据库的接口.既可以访问关系型又可以访问非关系型数据,性能也有了很大提高.缺点是学习难度大,对程序

一种利用ADO连接池操作MySQL的解决方案(VC++)

VC++连接MySQL数据库 常用的方式有三种:ADO.mysql++,mysql API ; 本文只讲述ADO的连接方式. 为什么要使用连接池? 对于简单的数据库应用,完全可以先创建一个常连接(此连接永远不关闭,直接数进程退出),但是这样做至少会引起两个问题:(1)资源竞争,多个数据库请求操作不能同时进行,后一请求必须要等到前一请求完成后才能进行:(2)多线程情况下容易出现混乱,甚至出现资源异常释放.还有一种方法,就是使用数据库时创建连接,使用完后关闭连接回收资源.这种方式在数据库操作频繁的情

CRUD Operations In ASP.NET MVC 5 Using ADO.NET

Background After awesome response of an published by me in the year 2013: Insert, Update, Delete In GridView Using ASP.Net C#. It now has more than 140 K views, therefore to help beginners I decided to rewrite the article i with stepbystep approach u

异常:error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name &#39;System.Data.SqlClient&#39;

error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient' error 0152: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'. Make sure the pro

ADO.NET

1.vb.net: vb.net自身并不具备对数据库进行操作的功能,它对数据库的处理通过.NET Framwork SDK中面向数据库编程的类库和微软的MDAC 来实现的,其中ADO.NET 是.NET Framwork SDK重要组成部分.它是.NET Framwork SDK中用以操作数控的类库的总称. 2.ado.net     1.命名空间:在使用前先引用 imports system.data imports system.sqlclient 2.ado.net的核心内容 Connec

数据库的连接使用——使用ADO.NET连接数据库

一.ADO.NET简介 ADO.NET是由很多类组成的一个类库,这些类库提供了很多对象,用来完成数据的连接.查询.插入.更新和删除等操作.其中主要包括以下对象: 1.Connection对象:用来连接到数据库(OLE DB使用OleDbConnection,SQL SERVER使用SqlConnection) 2.Command对象:用来对数据库执行SQL命令,如插入.删除.修改.查询 3.DataReader对象:用来从数据库返回只读数据 4.DataAdapter对象:与DataSet对象结

.NET Core中ADO.NET SqlClient的使用与常见问题

一.简介 在很多要求性能的项目中,我们都要使用传统的ADO.NET的方式来完成我们日常的工作:目前有一些网友问有关于.NET Core操作SQL Server的问题在本文中解答一下. 本文旨在指出,在.NET Core中使用ADO.NET SqlClient操作SQL SERVER数据库时的一些常见的问题,在本文的第三部分,如果只关心解决问题,请跳过第两部分进行阅读. 二.使用ADO.NET 首先建立好一个ASP.NET MVC Core Project 或 .NET Core Class Li

ADO.NET数据访问技术概览

1. 以数据为中心的应用程序设计 1.1. ADO.NET 支持下列的存储类型? 无结构? 有结构, 无层次的数据 – 以逗号分离的数据(CSV) 文件.Microsoft Excel 电子表格.Microsoft Exchange 文件.Active Directory 文件等? 有层次的数据 – XML 文档等? 关系型数据库 – SQL Server.Oracle.Access 等. 1.2. 连接环境? 连接环境是指用户在这种环境下始终保持与数据源的连接? 优点 – 环境易于实施安全控制

使用ADO实现BLOB数据的存取 -- ADO开发实践之二

使用ADO实现BLOB数据的存取 -- ADO开发实践之二 http://www.360doc.com/content/11/0113/16/4780948_86256633.shtml 一.前言 在上一篇文章<>中我们详细介绍了ADO基本的操作方法,在实际的开发过程中我们常常需要存储较大的二进制数据对象,比如:图像.音频文件.或其它二进制数据,这些数据我们称之为二进制大对象BLOB(Binary Large Object),其存取的方式与普通数据有所区别.本文将介绍利用ADO在数据库中存取B