分类: 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. JAVA学习笔记16——线程生命周期

    当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(Running).阻塞(Blocking)和 ...

  2. TWaver3D特效之高光反射

    前篇我们介绍了TWaver 3D的环境映射特效,下面我们接着给大家分享高光反射特效.高光反射定义了物体上的某一区域比其他地方更反光.在高光反射的贴图中,黑色区域的反射率为0(完全不反光),白色区域的反 ...

  3. Dollar Dayz POJ - 3181

    解法 完全背包+大数...不想写大数了放个python得了 代码 dp=[0 for i in range(2000)] n,k=map(int,input().split()) num=[i for ...

  4. Python使用Flask框架,结合Highchart处理csv数据(引申-从文件获取数据--从数据库获取数据)

    参考链接:https://www.highcharts.com.cn/docs/process-text-data-file 1.javascript代码 var options = { chart: ...

  5. Sublime 添加右键快捷(其他软件同样方法)

    1.进入注册表 开始-->运行-->regedit(或直接win+r,输入regedit)-->回车 2.进入shell目录 [HKEY_CLASSES_ROOT\*\shell] ...

  6. vue中axios设置

    //设置默认全局baseURL axios.defaults.baseURL=process.env.BASE_API; //设置默认全局携带浏览器cookie axios.defaults.with ...

  7. java多线程synchronized volatile解析

    先简单说说原子性:具有原子性的操作被称为原子操作.原子操作在操作完毕之前不会线程调度器中断.即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.在Java中,对除了l ...

  8. noip模拟赛 寻宝之后

    题目背景 还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路. 然而这次他们寻宝回来之后,小明被困在了一个迷宫中. 题目描述 迷宫是一个n*m的字符矩阵. 小明在这个 ...

  9. nyoj_278_排队_201403282135

    排队 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 周末了,软件ACM的队员准备玩玩游戏,娱乐一下,CY想了一个好主意,所有队员站成一个圈,从1开始报数,凡是报出指 ...

  10. Contemplation! Algebra 矩阵快速幂

    Given the value of a+b and ab you will have to find the value of a n + b n Input The input file cont ...