C#数据库访问(一)

ADO.NET数据库访问

ado.net -> 微软研发

访问数据源步骤:

1.创建连接
2.发出数据请求
3.执行命令
4.处理
5.关闭连接


发展阶段:

1.ODBC(Open Database Connectivity)
2.OLE DB(Object Linkig and Embedding Database)
3.ADO(ActiveX Data Objects)
4.ADO.NET


ado.net可采用无连接方式访问和处理数据,只在必要时连接数据库,不使用时关闭连接。

体系架构:数据提供程序+DataSet

数据库和.net之间的体系架构
数据提供程序(Data Provider)

1.Connection 连接类:用来和数据源进行连接
2.Command 命令类:用来从数据库中返回数据、修改数据或运行存储过程
3.DataAdapter 数据适配器类:是数据源和数据集DateSet对象交换数据的桥梁,他是负责将数据库中的数据填充到DataSet对象中
4.DataReader 数据读取器类:提供了对数据库的快速制度、前向访问功能

数据集(DataSet)
  • 数据集 DataSet 可以理解为一个本地的小型数据库。即 ADO.NET 通过数据提供程序获得数据源的数据后,在客户机的内存中缓存的数据库,即内存中的数据库。
  • 数据集 DataSet 位于应用程序和数据源之间,这使得用户可以使用相同的方式,来操作从不同数据源取得的数据。
  • 数据集的缺点是要求高速缓存大量的数据。
  • DataSet 是 ADO.NET 的非连接(断开)结构的核心组件。DataSet 的设计目的很明确:为了实现独立于任何数据源的数据访问。因此,ADO.NET结构可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及主键、外键、约束和有关 DataTable 对象中数据的关系信息组成。

1.什么是Data Provider

Data Provider用于连接数据库执行命令检索结果。这些结果将被直接处理,或放置在 DataSet 中以便根据需要向用户公开、与多个源中的数据组合,或在层之间进行远程处理。.NET 的数据提供程序是轻量的,它在数据源和代码之间创建最小的分层,并在不降低功能性的情况下提高性能。

Data Provider的四套内置的数据提供程序

SQL Server.NET 数据提供程序 (System.Data.SqlClient 命名空间)

提供一组对象来建立数据集的表和 SQL Server 数据库中的表之间的联系;
SQL Server .NET 数据提供程序具有自己的一套访问 SQL Server 数据源的协议,对访问 SQL Server 数据库提供了特殊的优化,可以直接访问 SQL SERVER 而不需添加 OLEDB 或 ODBC,因此是轻量级的,效率更高。

OLE DB.NET数据提供程序 (System.Data.OleDb 命名空间)

用来建立与 OLE DB 数据源之间的连接;
需借助 OLE DB 服务组件和数据库的 OLE DB 支持程序来访问数据库。由于需要通过一些中间层,因此在性能上有些损失;
适用于所有提供了 OLE DB 接口的数据源。

ODBC.NET数据提供程序 (System.Data.ODBC 命名空间)

通过 ODBC 与数据源进行通信,适合于所有提供了 ODBC 接口的数据源。

Oracle.NET 数据提供程序 (System.Data.OracleClient 命名空间)

通过 Oracle 客户端与数据源进行通信;
用于访问 Oracle 数据源。


2.Data Provider的四个核心基类
类名 说明
DbConnection 类 表示道数据库的连接
DbCommand 类 表示要对数据源执行的SQL语句或存储过程
DbDataReader 类 继承DataAdapter的大部分功能
DbDataAdapter 类 从数据源返回只读的、向前的数据
3.核心类的作用、属性和方法
(1)Connection类:
  • Connection 类用于建立到指定数据库的连接。
  • 任何对数据源的操作都需要建立一个连接对象。
  • Connection类的主要成员
属性/方法 说明
ConnectionString 连接字符串
Open() 打开数据库连接
Close() 关闭数据库连接
  • 不同命名空间的Connection类
命名空间 对应的Connection类
System.Data.Odbc OdbcConnection
System.Data.OleDb OleDbConnection
System.Data.SqlClient SqlConnection
System.Data.OracleClient OracleConnection
  • 除了Connection类外,其他类的命名也相似
(2)Command类
  • 在利用 Connection 类建立了到数据源的连接后,就可以利用 Command 对象对数据源执行 SQL 语句或存储过程。
  • 可以把 Command 对象看成是向 DataReader 对象返回数据结果流的工具。
(3)DataReader类
  • DataReader 对象提供一种从数据库读取只进的行流的一种方式。它是读取单向只读数据的最快方法;
  • DataReader 对象一次只在内存中存储一个记录,所以内存资源负荷最小;什么记录?
  • 使用 DataReader 时,关联的 Connection 忙于服务 DataReader,除了关闭以外不能执行其他任何操作。所以,使用完DataReader 后,要注意尽快关闭它;
(4)DataAdapter类
  • DataAdapter 对象用于从数据源中检索数据并填充 DataSet 中的表,完成无连接访问;
  • DataAdapter 还会把对 DataSet 作出的更改反馈回数据源;
  • 在 DataAdapter 的方法中,Fill() 和 update() 方法是用得最多的;

3.Date Provider中其他重要的类
  • DbParameter类
    定义了命令和存储过程的输入、输出和返回值参数
  • ConnectionStringBuilder类
    提供一种用于创建和管理由 Connection 对象使用的连接字符串的内容的简单方法
  • CommandBuilder类
    自动生成 DataAdapter 的命令属性或从存储过程中派生参数信息

ADO.NET两种访问方式

有连接模式
  • 取得数据库连接之后,保持数据库连接,通过向数据库服务器发送SQL命令方式更新数据库
  • 特点:数据实时性好,同步问题易于控制,但是必须保持网络连接。
  • 主要使用的基本类包括:
    • Connection
    • Command
    • DataReader
有链接模式下数据库访问步骤:
  • 通过Connection连接到数据库服务器;
    • 设置连接字符串等参数,打开连接;
  • 通过Command在数据库上执行SQL命令,如update,insert,delete,select
  • 如果只是查询操作,可以通过DataReader 读取数据
  • 关闭连接
//使用命名空间
using namespace System.data.OleDb;

    // (1)创建连接字符串
    string str = "server=" + textBox1.Text.Trim() + ";uid=" + textBox2.Text.Trim() + ";pwd=" + textBox3.Text.Trim() + ";database=study; Provider=SQLNCLI11;";
                   
    // (2)定义并初始化一个连接对象conn
    OleDbConnection conn = new OleDbConnection(str);

    // (3)定义并初始化一个命令对象cmd
    OleDbCommand cmd = new OleDbCommand("select * from student", conn);

    //(4)打开连接
    conn.Open();

    //(5)执行命令对象,并接收返回的值

    OleDbDataReader dataReader = cmd.ExecuteReader();
                                 
    // (6)绑定并显示数据
    BindingSource Bs = new BindingSource();
    Bs.DataSource = dataReader;
    dataGridView1.DataSource = Bs;

    //(7)关闭连接
    dataReader.Close();
    conn.Close();
无连接模式(断开式访问模式)
  • 当需要对数据进行长时间处理时采用该模式,数据库服务器中数据在本地有一个副本,保存在中。
  • 特点:基于无连接的数据库访问,具有执行效率高、数据库连接占用时间短、修改记录易更改和回滚等优点,但是也在一定程度上导致了数据更新的不及时。
  • 主要使用的基本类:
    • Connection
    • Command
    • DataAdapter
      DataSet //有链接中没有用到
  • 方法:
    • DataAdapter取得数据,把数据放入本地内存DataSet中,断开与服务器的连接,所有修改都针对DataSet 进行,最后再通过DataAdapter更新回数据库。
无连接模式下数据库访问步骤
  • 设置Connection连接字符串等参数;
  • 设置Command在数据库上要执行的SQL命令,如update,insert,delete,select;
  • 将以上两个类的参数传递给DataAdapter,由DataAdapter完成数据库连接和对数据库的操作;
  • DataAdapter把数据库fill到DataSet中;
  • 更改DataSet中的数据;
  • DataAdapter将更改提交到数据库,并自动关闭连接
    // (1)创建连接字符串
     string str = "server=" + textBox1.Text.Trim() + ";uid=" + textBox2.Text.Trim() + ";pwd=" + textBox3.Text.Trim() + ";database=study; Provider=SQLNCLI11;";

    // (2)定义并初始化一个连接对象conn
    OleDbConnection conn = new OleDbConnection(str);

    // (3)定义并初始化一个命令对象cmd
    OleDbCommand cmd = new OleDbCommand("select * from student", conn);

    // (4)定义并初始化一个数据适配器对象oda,DataAdapter对象会自动打开连接,自动关闭连接
    OleDbDataAdapter oda = new OleDbDataAdapter();
    // (5)为数据配器oda的SelectCommand属性赋值
    oda.SelectCommand = cmd;
    // (6)定义并初始化一个数据集对象ds
    DataSet ds = new DataSet();
    ds.Clear();
    // (7)数据适配器将取回的数据灌入数据集
    oda.Fill(ds, "student");
    // (8)显示数据
    dataGridView1.DataSource = ds.Tables["student"];

Connection对象

  • ADO.NET强大的优势在于对不同的数据源提供一致的访问。.NET对不同数据源,使用不同的数据提供程序,这使得我们可以更高效的访问相应的数据源;
  • 其中,Connection对象肩负起连接数据源的重任。
1.理解Connection对象
  • 对于ADO.NET而言,不同的数据源,都对应着不同的Connection对象。具体Connection对象如下表:
名称 命名空间 描述
SqlConnection System.Data.SqlClient 表示与SQL Server的连接对象
OleDbConnection System.Data.OleDb 表示与OleDb数据源的连接对象
OdbcConnection System.Data.Odbc 表示与ODBC数据源的连接对象
OracleConnection System.Data.OracleClient 表示与Orale数据库的连接对象
2.重要的属性
  • ConnectionString
    • 连接字符串,获取或设置用于打开连接的字符串
  • Database
    • 在连接打开之后获取当前数据库的名称,或者在连接打开之前获取连接字符中指定的数据库名
  • DataSource
    • 获取要连接的数据库服务器的名称
  • ConnectionTimeOut
    • 获取在建立连接时终止尝试并生成错误之前所等待的时间
  • State
    • 获取描述连接状态的字符串
3.重要的方法
  • Open()
    • 使用 ConnectionString 所指定的设置打开数据库连接。
  • Dispose()
    • 释放连接使用的所有资源
  • Close()
    • 关闭与数据库的连接。 此方法是关闭任何已打开连接的首选方法。Close 方法回滚任何挂起的事务。 然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接。
4.ConnectionString属性
  • ConnectionString
    • 连接字符串,是一组被格式化的键值对:它告诉ADO.NET数据源在哪里,需要什么样的数据格式,提供什么样的访问信任级别以及其他任何包括连接的相关信息。
(1) 语法格式
  • 连接字符串由一组元素组成,一个元素包含一个键值对,元素之间由“;”分开。
  • 语法如下:key1=value1;key2=value2;key3=value3...
  • 典型的元素(键值对)应当包含这些信息:
    • 数据源是基于文件的还是基于网络的数据库服务器,
    • 是否需要账号密码来访问数据源,
    • 超时的限制是多少,
    • 以及其他相关的配置信息。
  • 需要根据需要连接的数据源来确定键(key)是什么
(2) 访问SQL Server连接字符串
  • ConnectionString构造时常用参数:
    • 服务器的名称或ip地址
    • 要使用的数据库名称
    • 如何通过数据库验证
    • 登录用户名和密码
    • 连接超时时间


      常用参数及说明
(3)Connection的构建

1.连接到本机数据库的连接字符串通常为
  string ConStr=“Server=(local);database=<数据名>;Integrated Security=sspi”

例如:

  string ConStr=“Server=(local);database=study; Integrated Security=sspi”   //使用Windows身份验证

  string ConStr=“Server=(local);database=study; Integrated Security=false; uid=<登录名>;pwd=<密码>”                             //使用Sql server身份验证
2.连接到远程数据库连接字符串通常为
  string ConStr=“Server=<IP>;database=<数据库名>; Integrated Security=false;uid=<登录名>;pwd=<密码>”

在远程情况不能使用Integrated Security=sspi,因为本地当前的Windows帐户很可能在远程机上没有被其SQL Server授权。

3.访问Access连接字符串
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\mydatabase.mdb;User Id=admin;Password=;
4.访问MySQL连接字符串
Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;
5.如何构建连接字符串
  • 连接字符串本质上就是一个字符串,因此可以用
string connStr = "Data Source=myServerAddress;\
Initial Catalog=myDataBase;\
User ID=myUsername;\
Password=myPassword";

  • DbConnectionStringBuilder类
    • DbConnectionStringBuilder类为强类型连接字符串生成基类。之所以要有这样一个类,是因为它更加安全与友好。
  • 以SQL Server为例,可以这样构建一个连接字符串:
SqlClient.SqlConnectionStringBuilder builder =� new SqlClient.SqlConnectionStringBuilder();�builder.DataSource = @"(local)\SQLEXPRESS";�builder.InitialCatalog = "myDataBase";�builder.IntegratedSecurity = true;


(4) ConnectionState属性
  • State属性描述了与数据源的连接的当前状态。ConnectionState是一个枚举类型。它包括以下成员:
    • Closed: 连接处于关闭状态。
    • Open: 连接处于打开状态。
    • Connecting: 连接对象正在数据源连接。
    • Executing: 连接对象正在执行命令。
    • Fetching: 连接对象正在检索数据。
    • Broken: 与数据源的连接中断。
(5)连接对象的关闭

Close 方法:用于关闭一个连接,可以再调用 Open 方法打开连接,不会产生错误;
Dispose 方法:不仅关闭一个连接,还清理连接所占用的资源。不可以再次直接用 Open 方法打开连接,必须再次重新初始化连接后才能再打开。

(6)Connection对象的使用步骤

以SQL数据提供程序为例:

  • 构造SqlConnection的对象;
  • 指定连接字符串,设置其他参数;
  • 调用Open();
  • 操作完毕,调用Close();
String connString=“…..”
SqlConnection conn=new SqlConnection(connString);
Conn.Open();
...
Conn.Close();
(7)编写优雅而又安全的代码
  • 添加Ttry...catch块
    连接数据库时,可能出现异常,因此需要添加异常处理。对于C#来说,典型的异常处理是添加try...catch代码块。
    finally是可选的。finally是指无论代码是否出现异常都会执行的代码块。而对数据库连接资源来说,是非常宝贵的。因此,应当确保打开连接后,无论是否出现异常,都应该关闭连接和释放资源。所以,必须在finally语句块中调用Close方法关闭数据库连接。
SqlConnection conn = new SqlConnection(connStr);
try 
{
    conn.Open();
}
catch(Exception ex)
{
    ;//todo
}
finally
{
    conn.Close();
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • -----------MySQL 连接方式----------- MySQL Connector/ODBC 2.5...
    BugMyGod阅读 2,573评论 2 8
  • 很多应用程序都需要与数据库交互。数据库是一个数据仓库,与文本文件和 XML 文件极其相似。可以想见,使用文件来存储...
    CarlDonitz阅读 279评论 0 1
  • alert(a); function name(parameters) { alert(parameters); ...
    name阿喆azhe阅读 1,013评论 0 3
  • 中秋节到了,可我却丝毫感受不到它所给予的那份快乐与欣喜,反而是内心满满的愁绪
    1942aa1f70dd阅读 130评论 0 0
  • 李康德是学校里面公认的无聊透顶的人。 理所应当地留着普通的平头,信仰学生手册和班级守则,出勤率全满,有着淡薄而合理...
    一两坚果阅读 483评论 0 0