分类: C#学习笔记2011-07-05 11:26 515人阅读 评论(0) 收藏 举报
 

目录(?)[+]

 

ADO.NET是一组用于和数据源进行交互的面向对象类库。通常情况下,数据源是数据库,但它同样也能够是文本文件、Excel表格或者XML文件。

ADO.NET支持两种访问数据的模型:无连接模型和连接模型。无连接模型将数据下载到客户机,并在客户机上将数据封装到内存,然后可以像访问本地关系数据库一样访问内存中的数据,如DataSet;连接模型则依赖于逐记录的访问,这种访问要求打开并保持与数据源的链接。

Connection 类

  和数据库交互,你必须连接它。连接帮助指明数据库服务器、数据库名字、用户名、密码,和连接数据库所需要的其它参数。Connection对象会被Command对象使用,这样就能够知道是在哪个数据源上面执行命令。

 

  与数据库交互的过程意味着你必须指明想要执行的操作。这是依靠Command对象执行的。你使用Command对象来发送SQL语句给数据库。Command对象使用Connection对象来指出与哪个数据源进行连接。你能够单独使用Command对象来直接执行命令,或者将一个Command对象的引用传递给DataAdapter,它保存了一组能够操作下面描述的一组数据的命令。

Command对象

  成功于数据建立连接后,就可以用Command对象来执行查询、修改、插入、删除等命令; Command对象常用的方法有ExecuteReader方法、ExecuteScalar()方法和ExecuteNonQuery()方法;插入数据可用ExecuteNonQuery()方法来执行插入命令。

DataReader类

  许多数据操作要求你只是读取一串数据。DataReader对象允许你获得从Command对象的SELECT语句得到的结果。考虑性能的因素,从DataReader返回的数据都是快速的且只是“向前”的数据流。这意味着你只能按照一定的顺序从数据流中取出数据。这对于速度来说是有好处的,但是如果你需要操作数据,更好的办法是使用DataSet。

DataSet对象

  DataSet对象是数据在内存中的表示形式。它包括多个DataTable对象,而DataTable包含列和行,就象一个普通的数据库中的表。你甚至能够定义表之间的关系来创建主从关系(parent-child relationships)。DataSet是在特定的场景下使用――帮助管理内存中的数据并支持对数据的断开操作的。DataSet是被所有Data Providers使用的对象,因此它并不像Data Provider一样需要特别的前缀。

DataAdapter类

  某些时候你使用的数据主要是只读的,并且你很少需要将其改变至底层的数据源。同样一些情况要求在内存中缓存数据,以此来减少并不改变的数据被数据库调用的次数。DataAdapter通过断开模型来帮助你方便的完成对以上情况的处理。当在一单批次的对数据库的读写操作的持续的改变返回至数据库的时候,DataAdapter 填充(fill)DataSet对象。DataAadapter包含对连接对象以及当对数据库进行读取或者写入的时候自动的打开或者关闭连接的引用。另外,DataAdapter包含对数据的SELECT、INSERT、UPDATE和DELETE操作的Command对象引用。你将为DataSet中的每一个Table都定义DataAadapter,它将为你照顾所有与数据库的连接。所有你将做的工作是告诉DataAdapter什么时候装载或者写入到数据库。

DataTable类

  DataTable 是一个数据网格控件。它可以被应用在 VB 和 ASP 上。它无须代码就可以简单的绑定数据库。它具有微软风格的用户界面。

总结

ADO.NET是与数据源交互的.NET技术。有许多的Data Providers,它将允许与不同的数据源交流――取决于它们所使用的协议或者数据库。然而无论使用什么样的Data Provider,你将使用相似的对象与数据源进行交互。SqlConnection对象管理与数据源的连接。SqlCommand对象允许你与数据源交流并发送命令给它。为了对进行快速的只“向前”地读取数据,使用SqlDataReader。如果想使用断开数据,使用DataSet并实现能进行读取或者写入数据源的SqlDataAdapter。

*********************************************************************************************************************************************

注意:下面的语言描述中,是以SQL Server为例的。我的代码是以Access为例的。

1. Connection对象

需要引入System.Data.SqlClient命名空间下的SqlConnection类

Connection对象包括四种访问数据库的对象类(数据提供程序),根据使用数据库的不同,引入不同的命名空间

  • Sql Server数据提供程序,位于System.Data.SqlClient命名空间
  • ODBC数据提供程序,位于System.Data.Odbc
  • OLE DB 数据提供程序,位于System.Data.OleDb,Access的话可以用这个。
  • Oracle数据提供程序,位于System.Data.OracleClient

通过SqlConnection对象的State属性判断数据库的连接状态,属性值为ConnectionState的枚举值:

Broken:连接中断,在连接打开后才会发生这种情况,可以关闭连接后重新打开

  • Closed:关闭
  • Connecting:连接中
  • Executing:连接对象正在执行命令
  • Fetching:连接对象正在检索数据
  • Open:打开状态

关闭连接:

Close() :关闭一个连接,关闭后可直接打开 Open()

Dispose() :关闭一个连接,同时清理连接所占用的资源,关闭后不能再直接用Open方法打开连接,必须重新初始化连接后再打开。

下面是一个打开关闭Access数据库的例子:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Data.OleDb; //OleDb 提供程序
  10. // using System.Data.SqlClient;  //.SqlServer; 提供程序
  11. namespace AccessTest
  12. {
  13. public partial class Form1 : Form
  14. {
  15. OleDbConnection conn;
  16. // SqlConnection conn;
  17. private void button1_Click(object sender, EventArgs e)
  18. {
  19. try
  20. {
  21. //连接字符串
  22. //string ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\AccessTest\围岩稳定性预测知识库.mdb; User Id=admin; Password=";
  23. string ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\\AccessTest\\围岩稳定性预测知识库.mdb;";
  24. //创建SqlConnection对象,注意因引入命名空间,访问数据库类型的不同而不同
  25. //conn = new SqlConnection(ConnStr);
  26. //创建OleDbConnection对象
  27. conn = new OleDbConnection(ConnStr);
  28. conn.Open();
  29. if (conn.State == ConnectionState.Open)
  30. {
  31. MessageBox.Show("数据库连接已经打开");
  32. }
  33. }
  34. catch
  35. {
  36. MessageBox.Show("数据库连接异常");
  37. }
  38. }
  39. private void button2_Click(object sender, EventArgs e)
  40. {
  41. try
  42. {
  43. conn.Close(); //关闭
  44. if (conn.State == ConnectionState.Closed)
  45. {
  46. MessageBox.Show("数据库连接已成功关闭");
  47. }
  48. conn.Open(); //重新打开
  49. if (conn.State == ConnectionState.Open)
  50. {
  51. MessageBox.Show("数据库连接已经重新打开");
  52. }
  53. }
  54. catch(Exception ex)
  55. {
  56. MessageBox.Show(ex.Message);
  57. }
  58. }
  59. public Form1()
  60. {
  61. InitializeComponent();
  62. }
  63. }
  64. }

2. Command对象

数据命令对象,用于向数据库发送SQL命令,主要有以下几种形式:

  • SqlCommand:SqlServer数据库
  • OleDbCommand:OLE DB打开的数据库,Access、MySQL都是OLE DB 公开的数据库
  • OdbcCommand:用于向ODBC公开的数据库发送SQL语句
  • OracleCommand:Oracle数据库

Command对象有三个重要属性,Connection属性、CommandText属性、CommandType属性。

  • Connection属性用于设置SqlCommand对象使用的SqlConnection连接对象。
  • CommandText用于设置要对数据源执行的SQL 语句或存储过程。
  • CommandType用于指定CommandText的类型,是CommandType的枚举值:StoredProcedure 存储过程名称;TableDirect表名称;Text - SQL文本命令

(1)ExecuteNonQuery()方法

执行SQL语句,并返回受影响的条数。通常用于添加、删除、修改命令

(2)ExecuteReader()方法

执行SQL语句,返回一个包含数据的SqlDataReader对象的实例,select命令

(3)ExecuteScalar()

执行SQL语句,返回结果集中第一行第一列,如果为空就返回空引用。常用聚合函数一起使用

  • AVG 平均值
  • COUNT 统计
  • MAX 最大值
  • MIN 最小值
  • SUM 和
  1. private void button3_Click(object sender, EventArgs e) //Command
  2. {
  3. try
  4. {
  5. if (conn.State == ConnectionState.Open)
  6. {
  7. OleDbCommand cmd = new OleDbCommand();
  8. cmd.Connection = conn;
  9. cmd.CommandText = "select count(*) from 李雅庄矿围岩物理力学性质";
  10. cmd.CommandType = CommandType.Text;
  11. int i = Convert.ToInt32(cmd.ExecuteScalar()); // ExecuteScalar 第一行、第一列
  12. MessageBox.Show("共有" + i.ToString() + "条数据");
  13. // ExecuteNonQuery() 方法
  14. cmd.CommandText = "update 李雅庄矿围岩物理力学性质 set KY = 12";
  15. int k = Convert.ToInt32(cmd.ExecuteNonQuery());
  16. MessageBox.Show(i.ToString() + "条数据受影响");
  17. //ExecuteReader 方法
  18. cmd.CommandText = "select * from 李雅庄矿围岩物理力学性质";
  19. OleDbDataReader oddr = cmd.ExecuteReader();
  20. string str = "";
  21. while (oddr.Read())
  22. {
  23. str += oddr[2].ToString(); //2为第几列, 0 开始
  24. }
  25. MessageBox.Show(str);
  26. //ExecuteScalar 方法,见上面
  27. }
  28. }
  29. catch (Exception ex)
  30. {
  31. MessageBox.Show(ex.Message);
  32. }
  33. }

3. DataReader对象

数据读取器对象,提供只读向前的游标。如果应用程序只是需要向前读取数据,并不需要修改数据,可以使用该对象进行读取。

根据数据库的不同,有四种类型:SqlDataReader、OleDbDataReader、OdbcDataReader、OracleDataReader

(1)是否有值 HasRows属性

(2)读取数据,Read方法,游标下移。对于每个Connection只能打开一个DataReader。

  1. private void button4_Click(object sender, EventArgs e) //DataReader
  2. {
  3. try
  4. {
  5. OleDbCommand cmd = new OleDbCommand();
  6. cmd.Connection = conn;
  7. cmd.CommandText = "select count(*) from 李雅庄矿围岩物理力学性质";
  8. cmd.CommandType = CommandType.Text;
  9. OleDbDataReader oddr = cmd.ExecuteReader();
  10. if (oddr.HasRows)
  11. {
  12. MessageBox.Show("数据表中有值");
  13. }
  14. string str = "";
  15. while (oddr.Read())
  16. {
  17. str += oddr[2].ToString(); //2为第几列, 0 开始
  18. }
  19. MessageBox.Show(str);
  20. }
  21. catch (Exception ex)
  22. {
  23. MessageBox.Show(ex.Message);
  24. }
  25. }

4.DataAdapter 数据适配器

在DataSet与数据源之间起到桥梁的作用,4个属性实现与数据源的互通

  • SelectCommand:向数据库发送查询语句
  • DeleteCommand:删除
  • InsertCommand:插入
  • UpdateCommand:更新

(1)Fill 方法用于填充DataSet数据集,使用Select语句从数据源中检索数据。注意:connection对象必须有效,但不需将其打开,因为DataAdapter对象会自动打开关闭数据库。

public int Fill(DataSet dataSet, string srcTable);

dataSet:要填充的数据集

srcTable:用于表映射的源表的名称

(2)Update方法 更新数据库,将DataSet中修改的数据更新到数据库中。

在调用update方法前,要实例化一个CommandBuilder类,该类能自动根据DataAdapter的SelectCommand属性指定的SQL语句判断其它的InsertCommand、UpdateCommand和DeleteCommand,这样就不需要设置这三个属性了,而是直接使用DataAdapter的Update方法更新DataSet、DataTable、DataRow数组。

  1. DataSet ds ; //建立数据集
  2. OleDbDataAdapter odda; //适配器
  3. private void button5_Click(object sender, EventArgs e) //DataAdapter
  4. {
  5. try
  6. {
  7. OleDbCommand cmd = new OleDbCommand();
  8. cmd.Connection = conn;
  9. cmd.CommandText = "select * from 李雅庄矿围岩物理力学性质";
  10. cmd.CommandType = CommandType.Text;
  11. //另一种建立 command 对象的构造函数
  12. // OleDbCommand cmd = new OleDbCommand("select * from 李雅庄矿围岩物理力学性质",conn);
  13. ds = new DataSet(); //建立数据集
  14. odda = new OleDbDataAdapter(); //建立数据适配器
  15. odda.SelectCommand = cmd;
  16. odda.Fill(ds, "李雅庄矿围岩物理力学性质");
  17. dataGridView1.DataSource = ds.Tables[0];
  18. }
  19. catch (Exception ex)
  20. {
  21. MessageBox.Show(ex.Message);
  22. }
  23. }
  24. private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
  25. {
  26. //单击某条数据,显示其详细信息。
  27. //注意,学习 下面的写法
  28. try
  29. {
  30. textBox5.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1].Value.ToString(); //主键
  31. textBox1.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[4].Value.ToString(); //第几列,索引从 0 开始
  32. textBox2.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[5].Value.ToString();
  33. textBox3.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[6].Value.ToString();
  34. textBox4.Text = dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[7].Value.ToString();
  35. }
  36. catch (Exception ex)
  37. {
  38. MessageBox.Show(ex.Message);
  39. }
  40. }
  41. private void button6_Click(object sender, EventArgs e) //更新
  42. {
  43. try
  44. {
  45. DataTable dt = ds.Tables["李雅庄矿围岩物理力学性质"];
  46. odda.FillSchema(dt, SchemaType.Mapped); //把表结构加载到“李雅庄矿围岩物理力学性质”表中
  47. DataRow dr = dt.Rows.Find(textBox5.Text); //创建DataRow,使用dt.Rows.Find方法时必须设置主键
  48. //设置DataRow的值
  49. dr["KY"] = textBox1.Text.Trim();
  50. dr["KL"] = textBox2.Text.Trim();
  51. dr["E"] = textBox3.Text.Trim();
  52. dr["U"] = textBox4.Text.Trim();
  53. //实例化一个CommandBuilder
  54. OleDbCommandBuilder odcb = new OleDbCommandBuilder(odda);
  55. odda.Update(dt);
  56. }
  57. catch (Exception ex)
  58. {
  59. MessageBox.Show(ex.Message);
  60. }
  61. }

5. DataSet对象

DataSet对象就像存放在内存中的一个小型数据库,可以包含数据表、数据列、数据行、视图、约束以及关系等。

(1)合并 MERGE

public void Merge(DataSet dataSet, bool preserveChanges, MissingSchemaAction missingScheAction);

  • dataSet: 将要被合并的DataSet对象
  • preserveChanges:是否保留当前DataSet的更改,true,false
  • missingSchemaAction:枚举值
    • Add:添加必要的列以完成架构
    • AddWithKey:添加必要的列和主键信息以完成绞股,可以在DataTable上显示设置主键信息
    • Error:如果缺少指定的列映射,则生成InvalidOperationException
    • Ignore:忽略额外列

(2)复制 Copy

DataSet ds2 = ds1.Copy();

C# 数据库访问的更多相关文章

  1. [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一)

    [入门级] visual studio 2010 mvc4开发,用ibatis作为数据库访问媒介(一) Date  周二 06 一月 2015 By 钟谢伟 Tags mvc4 / asp.net 示 ...

  2. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  3. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  4. [开源].NET数据库访问框架Chloe.ORM

    扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...

  5. 我的基于asp.net mvc5 +mysql+dapper+easyui 的Web开发框架(1)数据库访问(0)

    一.数据库访问 概述 1. 数据库使用mysql,orm采用dapper框架.dapper框架应用简单,只是需要自己手写sql语句,但是对于像我这样写了多年sql语句的人来说,这应该不算问题,个人还是 ...

  6. 数据库访问性能优化 Oracle

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

  7. 我也来写:数据库访问类DBHelper

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

  8. step by step 之餐饮管理系统六(数据库访问模块)

    距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...

  9. C#-数据库访问技术 ado.net——创建 数据库连接类 与 数据库操作方法 以及简单的数据的添加、删除、修改、查看

    数据库访问技术 ado.net 将数据库中的数据,提取到内存中,展示给用户看还可以将内存中的数据写入数据库中去 并不是唯一的数据库访问技术,但是它是最底层的数据库访问技术 1.创建数据库,并设置主外键 ...

  10. 我也来写:数据库访问类DBHelper(转)

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

随机推荐

  1. HWND CWND 转换

    一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识,即窗口句柄.这是一个SDK概念.   CWnd是M ...

  2. offset 后 指针数组转换

    AcDbObjectId pidoffset; AcDbPolyline *plineOffset; AcDbVoidPtrArray ptarr=NULL; pline->getOffsetC ...

  3. 有哪些可以节省chrome内存的扩展插件?

    不知道从什么时候开始,chrome浏览器就这样不知不觉的超过IE浏览器成为全球第一大浏览器.我们在赞赏chrome浏览器流畅的速度时,更多的是对其chrome插件功能的赞赏.但是我们也发现了一个致命的 ...

  4. airfoil polar data during post stall stages (high AOA)

    airfoil polar data during post stall stages (high AOA) Table of Contents 1. airfoil polar during pos ...

  5. redis—持久化

    Redis持久化 概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内 ...

  6. const int * 和 int * const 傻傻分不清楚

    const int * a和int const *a一样,定义时不是必须初始化,指针可以指向其他变量,但是指向的变量的值不能修改. int * const定义时必须初始化,即必须指明指向哪个变量,定义 ...

  7. 2017北京ICPC C题 Graph

    #1629 : Graph 时间限制:4000ms 单点时限:4000ms 内存限制:256MB 描述 The country contains N cities numbered from 1 to ...

  8. Neo4j 的一些使用心得

    由对图数据的处理需求,看到了图数据库(GraphDataBase)这种比较新的数据库模式,并且通过比较发现用的相对多的要属Neo4j了,现在来看网上对Neo4j的介绍还比较少,内容主要来源于三个地方: ...

  9. 疫情控制(codevs 1218)

    题目描述 Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为 ...

  10. java多线程编程核心技术(四)--Lock的使用

    1.jdk1.5中新增了ReentrantLock类,该类也可以实现synchronized线程之间同步互斥的效果. 2.jdk1.5中新增了Condition类.在Lock对象中可以创建多个Cond ...