ADO.NET大部分由System.Data.dll核心程序集来表示。

ADO.NET类库有三种完全不听的方式来实现数据访问:连接式、断开式和通过Entity框架。连接式就是会一直占用网络资源,断开式获取数据就可以断开连接,Entity其实是一种数据访问的API,到时候我们在详细介绍。

本篇主要介绍连接式访问数据库。

一些核心对象

对象                      基类                          实现接口            作用

Connection             DbConnection                        IDbConnection                               连接和断开数据源,提供了相关事务对象的访问

Command         DbCommand          IDbCommand         代表SQL查询语句或者存储过程名,同意提供了相关数据读取器对象的访问

DataReader      DbDataReader          IDataReader和IDataRecord           提供只读只向前形式的数据访问

DataAdapter     DbDataAdapter                       IDataAdapter和IDbDataAdapter     在数据库和调用者之前传递DataSet,内置4个命名对象来实现数据的查询、插入、修改和删除

Parameter                   DbParameter                            IDataParameter和IDbDataParameter   在参数化查询中表示参数

Transaction                 DbTransaction                          IDbTransaction                                     实现数据库事务

基类都定义在 System.Data.Common 命名空间中,接口定义在 System.Data命名空间。

尽管这些类的命名对于不用的数据提供程序不尽相同(比如SqlConnection,OracleConnection,OdbcConnection,MySqlConnection),但是它们都是从相同的基类(DbConnection)继承并且实现相同的接口(IDbConnection),你掌握其中一种,其他的也差不多。

System.Data命名空间的类型

System.Data命名空间的核心成员

这个命名空间绝大数类都在进行ADO.NET断开连接层编程时使用,下一章细说。

关于接口里面的属性,方法等详细,先写出接口然后转定义去查看,因为太多了这里就不说了。

使用接口的抽象数据提供程序

       enum DataProvider   //声明的枚举,代表使用什么数据库{SqlServer,OleDb,Odbc,None}      static void Main(string[] args){Console.WriteLine("请开始你的表演:");IDbConnection myCn = GetConnection(DataProvider.SqlServer);Console.WriteLine("你链接的是:{0}",myCn.GetType().Name);//打开、使用,关闭
            Console.ReadLine();}static IDbConnection GetConnection(DataProvider dp) {IDbConnection conn = null;switch (dp){case DataProvider.SqlServer:conn = new SqlConnection();break;case DataProvider.OleDb:conn = new System.Data.OleDb.OleDbConnection();break;case DataProvider.Odbc:conn = new System.Data.Odbc.OdbcConnection();break;case DataProvider.None:break;default:break;}return conn;}

使用应用程序配置文件添加灵活性

我们可以把值存储在*.config里面,如果需要改动只要该配置里面的内容就可以了。

Console.WriteLine("请开始你的表演:");string dataProvString = ConfigurationManager.AppSettings["provider"];//把字符串转成枚举DataProvider dp = DataProvider.None;if (Enum.IsDefined(typeof(DataProvider), dataProvString)){dp = (DataProvider)Enum.Parse(typeof(DataProvider), dataProvString);}else{Console.WriteLine("该值不存在");}IDbConnection myCn = GetConnection(dp);if (myCn!=null)           Console.WriteLine("你链接的是:{0}", myCn.GetType().Name);//打开、使用,关闭Console.ReadLine();

工厂模型

System.Data.Common命名空间下有一个叫做DbProviderFactories的类帮助我们从 DbProviderFactory继承的类获取数据提供程序。使用静态方法GetFactory(),并指定包含提供程序功能的.NET命名控件的名称,能够获得代表该数据提供城西DbProviderFactory对象。

例如:

来看一个工厂获取数据的完整列子

  Console.WriteLine("请开始你的表演:");string dp = ConfigurationManager.AppSettings["provider"];string cnStr = ConfigurationManager.AppSettings["cnStr"];//得到工程提供程序DbProviderFactory df = DbProviderFactories.GetFactory(dp);//得到连接对象using (DbConnection cn=df.CreateConnection()){//通过反射服务得到全名Console.WriteLine("链接实例为:{0}",cn.GetType().Name);cn.ConnectionString = cnStr; //设置连接字符串cn.Open(); //打开数据库//得到命名对象DbCommand cmd = df.CreateCommand();Console.WriteLine("命名的实例名称为:{0}",cmd.GetType().Name);cmd.Connection = cn;//操作数据cmd.CommandText = "select * from News";//得到数据读取器对象using (DbDataReader dr=cmd.ExecuteReader()){Console.WriteLine("数据读取器实例为:{0}",dr.GetType().Name);while (dr.Read()){Console.WriteLine("新闻的标题为:{0}",dr["Title"].ToString());}}}         Console.ReadLine();

工厂的潜在缺陷

优点:最灵活的方式构建数据访问库。

缺点:正是因为使用都是抽象类,也就是基类,当我们想访问某个具体类的特殊成员就需要转型。会使代码不易维护。

<connectionStrings>元素

上面写的<appSettings>元素是用来保存一些稳定的并且不想给用户看到的数据。类似于键/值。而<connectionStrings>元素才是用来连接数据库的。

配置:

使用:

进入主题:

ADO.NET连接层

一般的步骤:

①创建、配置、打开连接对象

②创建、配置一个命名对象,通过构造参数或Connection属性指定连接对象

③执行配置后的命令对象的ExecuteReader()方法

④使用数据读取器的Read()方法一条一条处理记录

例如:

  string strConn = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;using (SqlConnection cn=new SqlConnection())//建立并打开一个连接
            {cn.ConnectionString = strConn;cn.Open();string strSQL = "select * from News";//建立一个SQL命令对象SqlCommand myCommand = new SqlCommand(strSQL,cn);using (SqlDataReader myDataReader=myCommand.ExecuteReader()){while (myDataReader.Read()){Console.WriteLine("Title:{0}\r\nContent:{1}", myDataReader["Title"], myDataReader["Contents"]);}}}Console.ReadLine();

先来看看基类DbConnection,一下就是一些属性和方法,属性基本都是只读的,不好修改。

使用ConnectionStringBuilder对象

这是使用以编程方式使用连接字符串,通过它能使用强类型化的属性来指定名称/值对。

下面就避免了手写连接字符串了,还可以适当的修改一些属性。

  SqlConnectionStringBuilder cnStrBuilder = new SqlConnectionStringBuilder();cnStrBuilder.InitialCatalog = "NewsDB";cnStrBuilder.DataSource = @"SEALEE\SEALEE";cnStrBuilder.ConnectTimeout = 30;cnStrBuilder.IntegratedSecurity = false;cnStrBuilder.Password = "123";cnStrBuilder.UserID = "sa";using (SqlConnection cn=new SqlConnection()){cn.ConnectionString = cnStrBuilder.ConnectionString;cn.Open();ShowStatus(cn);}

使用命令对象

SqlCommand类型时SQL查询、表名和存储过程的一种面向对象的表示方法。可以使用CommandType属性来指定命令类型。

DbCommand类型的成员

  如:增、删、改

使用数据读取器

数据读取器是只向前的数据流,并且一次返回一条记录,只有使用Select语句才会有用,会一直保持打开连接状态。

可以快速获取大批数据并且不会保存在内存中。

几种用法:

或则

获取多个结果集

我们执行语句就查询多张表。用DataSet.Table[1]就是第二张表。

连接,添加,删除,更新数据

连接逻辑

  private SqlConnection sqlcn = null;public void OpenConnection(string connectionString){sqlcn = new SqlConnection();sqlcn.ConnectionString = connectionString;sqlcn.Open();}public void CloseConnection(){sqlcn.Close();}

增加插入逻辑

      //还可以写个强类型作为参数传进去public void InsertAuto(int id,string title,string contents,DateTime dt) {string sql = string.Format("insert into News(CateID,Title,Contents,CreateDate) values({0},{1},{2},{3})",id,title,contents,dt);using (SqlCommand cmd =new SqlCommand(sql,this.sqlcn)){cmd.ExecuteNonQuery();}}

删除逻辑

 public void DeleteNews(int id) {string sql = string.Format("Delete from News where id={0}",id);using (SqlCommand cmd=new SqlCommand(sql,sqlcn)){cmd.ExecuteNonQuery();}}

更新

        public void Update(int id,int id1) {string sql = string.Format("update  News set CateID={0} where id={1}",id,id1);using (SqlCommand cmd=new SqlCommand(sql,sqlcn)){cmd.ExecuteNonQuery();}}

返回集合

   public List<News> GetList(){List<News> inv = new List<News>();string sql = "select * from News";using (SqlCommand cmd=new SqlCommand(sql,this.sqlcn)){SqlDataReader dr = cmd.ExecuteReader();while (dr.Read()){inv.Add(new News(){CateID = int.Parse(dr["CateID"].ToString())});}dr.Close();}return inv;}

返回DataTable

  public DataTable GetTable(){DataTable inv = new DataTable();string sql = "select * from News";using (SqlCommand cmd=new SqlCommand(sql,this.sqlcn)){SqlDataReader dr = cmd.ExecuteReader();inv.Load(dr);dr.Close();}return inv;}

使用参数化命令

ADO.NET命令对象使用一个集合来保存参数对象。这个集合默认是空的,可以添加任意多的参数对象并映射到SQL语句中的占位符参数。如何需要把SQL查询中的参数和命令对象参数集合中国某一个成员关联的话,只需要在SQL文本参数前面加@符号

  //还可以写个强类型作为参数传进去public void InsertAuto(int id, string title, string contents, DateTime dt){//使用@符号string sql = string.Format("insert into News(CateID,Title,Contents,CreateDate) values(@CateID,@Title,@Contents,@CreateDate)");using (SqlCommand cmd = new SqlCommand(sql, this.sqlcn)){//填充参数集合SqlParameter param = new SqlParameter();param.ParameterName = "@CateID";param.Value = id;param.SqlDbType = SqlDbType.Int; //这里的类型最好跟数据库里面的类型对应
                cmd.Parameters.Add(param);param = new SqlParameter();param.ParameterName = "@Title";param.Value = title;param.SqlDbType = SqlDbType.VarChar;cmd.Parameters.Add(param);//.....  更多参数继续cmd.ExecuteNonQuery();}}

运行存储过程

存储过程是存储在数据库内的一段已命名的SQL语句代码,你可以构造存储过程,返回一组行或标量数据类型,或进行其他头意义的处理(如插入,更新,删除),也可以接受一些可选参数。

使用方法:

   using (SqlCommand cmd = new SqlCommand("GetNews", this.sqlcn)){cmd.CommandType = CommandType.StoredProcedure;//这句话一定得有//填充参数集合SqlParameter param = new SqlParameter();param.ParameterName = "@id";param.Value = id;param.SqlDbType = SqlDbType.Int; //这里的类型最好跟数据库里面的类型对应param.Direction = ParameterDirection.Input;cmd.Parameters.Add(param);param = new SqlParameter();param.ParameterName = "@Title";param.SqlDbType = SqlDbType.VarChar;param.Direction = ParameterDirection.Output;//输出参数cmd.Parameters.Add(param);//.....
cmd.ExecuteNonQuery();string a = (string)cmd.Parameters["@Title"].Value; //返回输出参数}

数据库事务

事务是一组数据库操作,作为一个整体,要么全部完成要么全部失败。

SqlTransaction类型定义了一个Save()的成员,它允许我们定义保存点,这个概念允许我们把失败的事务回滚到一个保存点,而不是回滚整个事务。使用Rollback()可以把保存点的名字作为参数传递进去,这样就不是整个回滚了。

 using (SqlConnection con=new SqlConnection(strConn)){con.Open();string sql = string.Format("delete from News where NewsID={0}", 4);using (SqlCommand cmd = new SqlCommand(sql, con)){SqlTransaction tx = null;try{tx = con.BeginTransaction();cmd.Transaction = tx;cmd.ExecuteNonQuery();if (false)  //模拟错误
                        {throw new Exception("错了哦");}tx.Commit();//提交
                    }catch (Exception ex){Console.WriteLine(ex.Message);tx.Rollback();//执行回滚}}           }

转载于:https://www.cnblogs.com/Sea1ee/p/7475992.html

ADO.NET之一:连接层相关推荐

  1. 机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理

    卷积神经网络(Convolutional Neural Network,CNN)CNN 被用于图像识别.语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以 CNN 为基础. 1. 全连 ...

  2. 【深度学习】(3) 全连接层、激活函数

    各位同学好,今天和大家分享一下tensorflow2.0深度学习中的相关操作.内容有: (1) 全连接层创建: tf.keras.Sequential(),tf.keras.layers.Dense( ...

  3. embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层

    embedding层和全连接层的区别是什么 一般说embedding层,实现方式就是一个没有bias的fc层

  4. pytorch神经网络之卷积层与全连接层参数的设置

    当使用pytorch写网络结构的时候,本人发现在卷积层与第一个全连接层的全连接层的input_features不知道该写多少?一开始本人的做法是对着pytorch官网的公式推,但是总是算错. 后来发现 ...

  5. 清华旷视让全连接层“内卷”,卷出MLP性能新高度

    此前,清华大学与旷视科技曾通过结构重参数化将7年老架构VGG"升级"为性能直达SOTA的RepVGG模型. 如今,这个结构重参数化系列研究又添"新成员": 他们 ...

  6. 为什么LeNet5网络倒数第二个全连接层维度为84?

    https://www.toutiao.com/a6703703460887396871/ 相信大家也都知道LeNet5这个经典的卷积神经网络,它有3个全连接层,输出维度分别是120,84,10,不知 ...

  7. 如何只训练网络中的全连接层

    https://blog.csdn.net/weixin_32759777/article/details/105661316 https://dongfangyou.blog.csdn.net/ar ...

  8. Global Average Pooling对全连接层的可替代性分析

    Global Average Pooling对全连接层的可替代性分析 原创  2017年08月24日 15:54:22

  9. 基于pytorch开发CNN提取全连接层作为特征

    场景:利用CNN网络的全连接层作为图像的特征. 代码: import sys import os import math import random import heapq import time ...

最新文章

  1. 【深度学习理论】一文看懂卷积神经网络
  2. caffe python接口_ubuntu配置caffe的python接口pycaffe
  3. 【Python】条件及循环语句
  4. 提高收益 酒店大数据之客户数据收集
  5. 【转】C++中如何区分构造函数与重载operator()得到的仿函数?
  6. mongodb索引使用
  7. mysql查询php输出表格_MySql数据库查询结果用表格输出PHP代码示例_PHP教程
  8. win10系统字体颜色变淡
  9. 李兴华java开发百度网盘_魔乐科技MLDN-李兴华老师零基础学Java系列教程 百度网盘...
  10. 了解数据库(包括数据库发展史、分类、著名人物、主流数据库、关系与非关系型数据库)
  11. android p 小米6,小米6还能再战几年!将升级Android P
  12. LaTeX技巧001:ctex下使用其他中文字体
  13. 加班不能正常主张加班费的原因解析
  14. 短时间提高英语口语方法
  15. 云流化是什么?对软件企业有什么好处?
  16. logstash 时间获取失败(yyyy-mm-dd失效)
  17. elementUI表格合并单元格详解
  18. 服务器系统需要装显卡驱动吗,显卡驱动需要更新吗,详细教您显卡驱动需要更新吗...
  19. win10系统双屏如何设置不同的桌面
  20. 全国计算机考试选择题有什么技巧,2020年3月全国计算机等级考试各题型应试技巧...

热门文章

  1. python中类方法与实例方法的区别-python中类方法、类实例方法、静态方法的使用与区别...
  2. 查看电脑python虚拟环境-手把手教你在Linux系统下使用Python虚拟环境
  3. python详细安装步骤-最新Python安装图文教程[很详细]
  4. python编程100例头条-python 简单爬取今日头条热点新闻(一)
  5. python中的散点图代码-python – 带有图例的matplotlib散点图
  6. python解释器是什么-python编译器和解释器的区别是什么
  7. python软件有多大-Python程序有多大?
  8. python编程需要什么软件-《》 学习python编程需要安装哪些软件?
  9. python语言必背代码-Python入门必须知道的11个知识点
  10. 有道精品课python-网易词典在线翻译