ADO.NET入门 五大你需要知道的对象

开发 后端
本文将为您介绍ADO.NET中的五大对象,包括Connection、Command、DataReader、DataAdapter和DataSet这五大对象。这是我们进入ADO.NET开发的钥匙。

1.  ADO.NET 3.0 用于访问和操作数据的两个主要组件是: .NET Framework 数据提供程序 (虚线框内) 和 DataSet

.NET Framework 数据提供程序是专门为数据操作以及快速、只进、只读访问数据而设计的组件。

ADO.NET DataSet 是专门为独立于任何数据源的数据访问而设计的。

五大对象

对象

说明

Connection

建立与特定数据源的连接。 所有 Connection 对象的基类均为 DbConnection 类。

Command

对数据源执行命令。 公开 Parameters,并可在 Transaction 范围内从 Connection 执行。 所有 Command 对象的基类均为 DbCommand 类。

DataReader

从数据源中读取只进且只读的数据流。 所有 DataReader 对象的基类均为 DbDataReader 类。

DataAdapter

使用数据源填充 DataSet 并解决更新。 所有 DataAdapter 对象的基类均为 DbDataAdapter 类。

注意:新手面试经常会遇到考这样的题:ADO.NET 的五大对象,就是 上面四种 + DataSet 要牢牢记住哦。后期开发也经常用到。

2. Connection 对象(只介绍SqlConnection和JDBC)

使用connection连接的时候记得打开、关闭(返回连接池),建议使用using,这样就不会忘记关了,将自动断开连接,即使发生无法处理的异常。

string connectionString = "数据库连接字符串";
 
  1. using (SqlConnection connection = new SqlConnection(connectionString))  
  2. {  
  3.     connection.Open();  
  4.     ....  

ODBC 比较麻烦 请参考微软技术文档:http://support.microsoft.com/kb/310988 (我很少用到)

  1. using (OdbcConnection connection =   
  2.   new OdbcConnection(connectionString))  
  3. {  
  4.     connection.Open();  
  5.     ....  

3.Command对象

命令

返回值

ExecuteReader

返回一个 DataReader 对象。

ExecuteScalar

返回数据库查询出来的第一行第一列。

ExecuteNonQuery

执行增删改命令。

ExecuteXMLReader

返回 XmlReader。 只用于 SqlCommand 对象。

下面用一个实例讲解Connection 和 Command、DataReader以及储存过程和参数的设置:

(1.)下载安装微软提供的Northwind数据库:

/Files/Simcoder/微软提供的数据库.rar 含帮助文档 简单容易操作 数据库安装后 文件默认在C盘 然后附加即可

(2.)找到提供的存储过程:(本实例 使用倒数第二个 SalesByCategory 存储过程做演示)

存储过程

(3.)简单查看一下存储过程的代码,其实通过名字都能知道大概做什么用

  1. ----------------------  *创*建*存*储*过*程* -----------------------  
  2. set ANSI_NULLS ON 
  3. set QUOTED_IDENTIFIER ON 
  4. go  
  5. ALTER PROCEDURE [dbo].[SalesByCategory]                           --修改存储过程[SalesByCategory]  
  6.     @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998'     --设置参数  (以下的实现暂不用管)  
  7. AS 
  8. IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998'   
  9. BEGIN 
  10.     SELECT @OrdYear = '1998' 
  11. END 
  12. SELECT ProductName,  
  13.     TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0)  
  14. FROM [Order Details] OD, Orders O, Products P, Categories C  
  15. WHERE OD.OrderID = O.OrderID   
  16.     AND OD.ProductID = P.ProductID   
  17.     AND P.CategoryID = C.CategoryID  
  18.     AND C.CategoryName = @CategoryName  
  19.     AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear  
  20. GROUP BY ProductName  
  21. ORDER BY ProductName  
  22. ----------------------  *执*行*存*储*过*程* -----------------------  
  23. USE [Northwind]  
  24. GO  
  25. DECLARE    @return_value int 
  26. EXEC    @return_value = [dbo].[SalesByCategory]  
  27.         @CategoryName = N'Produce',  
  28.         @OrdYear = N'1998' 
  29. SELECT    'Return Value' = @return_value  
  30. GO 


--需要设置@CategoryName,@OrdYear(可以不设置 为空上面有判断)参数值

查询结果是:

查询结果 

(4.)新建一个控制台的应用程序 代码如下:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Data.SqlClient;  
  6. using System.Data;  
  7.  
  8. namespace ConsoleApplication1  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             GetSalesByCategory("server=.;uid=sa;pwd=123456;database=Northwind""Produce");//在这里就默认设置了 参数@CategoryName参数的值为 Produce  
  15.         }  
  16.         static void GetSalesByCategory(string connectionString,string categoryName)  
  17.         {  
  18.             using (SqlConnection connection = new SqlConnection(connectionString))  
  19.             {  
  20.                 SqlCommand command = new SqlCommand();  
  21.                 command.Connection = connection;  
  22.                 command.CommandText = "SalesByCategory";  //CommandType 属性设置为 StoredProcedure 时,CommandText 属性应设置为存储过程的名称  
  23.  
  24.                 command.CommandType = CommandType.StoredProcedure; //设置执行类型为存储过程  
  25.  
  26.                 SqlParameter parameter = new SqlParameter();  
  27.                 parameter.ParameterName = "@CategoryName";//指定存储过程中的那个参数  
  28.                 parameter.SqlDbType = SqlDbType.NVarChar;//指定数据类型  
  29.                 parameter.Direction = ParameterDirection.Input;//指定参数为输入  
  30.                 parameter.Value = categoryName;  
  31.  
  32.                 command.Parameters.Add(parameter);  
  33.  
  34.                 connection.Open();  
  35.                 SqlDataReader reader = command.ExecuteReader();  
  36.  
  37.                 if (reader.HasRows)//判断是否有数据行  
  38.                 {  
  39.                     while (reader.Read())  
  40.                     {  
  41.                         Console.WriteLine("{0}: {1:C}", reader[0], reader[1]);  
  42.                     }  
  43.                 }  
  44.                 else 
  45.                 {  
  46.                     Console.WriteLine("No rows found.");  
  47.                 }  
  48.                 reader.Close();//记得关闭   
  49.                 Console.ReadLine();  
  50.             }  
  51.         }  
  52.     }  

前面简单提到了 Connection 、DataReader、Comand以及参数和存储过程的用法,现在更加深入的学习。

1.DataReader的用法:

DataReader 从数据库中检索只读、只进的数据流。查询结果在查询执行时返回,在并存储在客户端的网络缓冲区中,直到您使用 DataReader 的 Read 方法对它们发出请求。 使用 DataReader 可以提高应用程序的性能,原因是它只要数据可用就立即检索数据,并且(默认情况下)一次只在内存中存储一行,减少了系统开销。

例子见上一篇即可,说说使用DataReader的心得,在做项目中,有时候一个实体类中的字段又是另外一个实体雷,存在外键的关系。如下实体类源码 中就有2个这样的关系(高亮代码):

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace BookShop.Model  
  6. {  
  7.     [Serializable]  
  8.     public class Book  
  9.     {  
  10.         /// <summary>  
  11.         /// 图书编号  
  12.         /// </summary>  
  13.         private int id;  
  14.  
  15.         public int Id  
  16.         {  
  17.             get { return id; }  
  18.             set { id = value; }  
  19.         }  
  20.  
  21.         /// <summary>  
  22.         /// 图书标题  
  23.         /// </summary>  
  24.         private string title;  
  25.  
  26.         public string Title  
  27.         {  
  28.             get { return title; }  
  29.             set { title = value; }  
  30.         }  
  31.  
  32.         /// <summary>  
  33.         /// 图书作者  
  34.         /// </summary>  
  35.         private string author;  
  36.  
  37.         public string Author  
  38.         {  
  39.             get { return author; }  
  40.             set { author = value; }  
  41.         }  
  42.  
  43.         /// <summary>  
  44.         /// 图书出版社  
  45.         /// </summary>  
  46.         private Publisher publisher;  
  47.  
  48.         public Publisher Publisher  
  49.         {  
  50.             get { return publisher; }  
  51.             set { publisher = value; }  
  52.         }  
  53.  
  54.         /// <summary>  
  55.         /// 图书出版日期  
  56.         /// </summary>  
  57.         private DateTime publishDate;  
  58.  
  59.         public DateTime PublishDate  
  60.         {  
  61.             get { return publishDate; }  
  62.             set { publishDate = value; }  
  63.         }  
  64.  
  65.         /// <summary>  
  66.         /// 图书ISBN编号  
  67.         /// </summary>  
  68.         private string isbn;  
  69.  
  70.         public string Isbn  
  71.         {  
  72.             get { return isbn; }  
  73.             set { isbn = value; }  
  74.         }  
  75.  
  76.         /// <summary>  
  77.         /// 图书总字数  
  78.         /// </summary>  
  79.         private int wordsCount;  
  80.  
  81.         public int WordsCount  
  82.         {  
  83.             get { return wordsCount; }  
  84.             set { wordsCount = value; }  
  85.         }  
  86.  
  87.         /// <summary>  
  88.         /// 图书价格  
  89.         /// </summary>  
  90.         private decimal unitPrice;  
  91.  
  92.         public decimal UnitPrice  
  93.         {  
  94.             get { return unitPrice; }  
  95.             set { unitPrice = value; }  
  96.         }  
  97.  
  98.         /// <summary>  
  99.         /// 图书描述  
  100.         /// </summary>  
  101.         private string contentDescription;  
  102.  
  103.         public string ContentDescription  
  104.         {  
  105.             get { return contentDescription; }  
  106.             set { contentDescription = value; }  
  107.         }  
  108.  
  109.         /// <summary>  
  110.         /// 图书作者描述  
  111.         /// </summary>  
  112.         private string authorDescription;  
  113.  
  114.         public string AuthorDescription  
  115.         {  
  116.             get { return authorDescription; }  
  117.             set { authorDescription = value; }  
  118.         }  
  119.  
  120.         /// <summary>  
  121.         /// 图书作者评语  
  122.         /// </summary>  
  123.         private string editorComment;  
  124.  
  125.         public string EditorComment  
  126.         {  
  127.             get { return editorComment; }  
  128.             set { editorComment = value; }  
  129.         }  
  130.  
  131.         /// <summary>  
  132.         /// 图书目录  
  133.         /// </summary>  
  134.         private string toc;  
  135.  
  136.         public string Toc  
  137.         {  
  138.             get { return toc; }  
  139.             set { toc = value; }  
  140.         }  
  141.  
  142.         /// <summary>  
  143.         /// 图书的分类  
  144.         /// </summary>  
  145.         private Category category;  
  146.  
  147.         public Category Category  
  148.         {  
  149.             get { return category; }  
  150.             set { category = value; }  
  151.         }  
  152.  
  153.         /// <summary>  
  154.         /// 图书点击  
  155.         /// </summary>  
  156.         private int clicks;  
  157.  
  158.         public int Clicks  
  159.         {  
  160.             get { return clicks; }  
  161.             set { clicks = value; }  
  162.         }  
  163.  
  164.     }  

如果是这种关系,使用Datareader 就可能会出现异常,因为当代码读到 外键的时候,外键也要使用connection连接 这时就会抛出异常,所以

与数据进行动态交互,例如绑定到 Windows 窗体控件或组合并关联来自多个源的数据。

对数据执行大量的处理,而不需要与数据源保持打开的连接,从而将该连接释放给其他客户端使用。就使用DataSet或DataTable比较合适。

也许你不太明白,但是你可以这样简单的记住,当实体类或数据库设计存在主外键关系的时候,使用Datareader就要谨慎了! 不过也没关系,很多经验都是从Debug学到的。

就好像微软的视频一样,为爱Debug。

原文标题:ADO.NET快速上手(一)

链接:http://www.cnblogs.com/Simcoder/archive/2010/05/03/1726295.html

责任编辑:彭凡 来源: 博客园
相关推荐

2009-11-13 15:12:54

ADO.NET入门

2022-04-22 08:00:00

TEE安卓手机

2009-11-04 09:43:45

ADO.NET Dat

2009-11-12 15:55:31

ADO.NET对象服务

2009-11-11 13:46:41

ADO.NET异步查询

2009-10-29 13:34:01

ADO.NET对象

2018-12-28 14:16:11

安全

2009-06-30 13:00:30

JSP入门

2009-11-04 12:45:33

ADO.NET Dat

2009-04-28 10:08:28

ADO.NET对象微软

2009-11-11 14:27:32

ADO.NET函数

2018-12-27 14:21:31

https安全http

2019-11-15 14:00:39

HTTPSHTTP前端

2009-11-13 15:25:51

ADO.NET的对象

2009-11-04 11:30:35

ADO.NET Dat

2009-12-18 14:27:24

ADO.NET对象

2009-12-28 13:47:31

ADO.NET对象

2009-11-12 16:04:42

ADO.NET对象查询

2009-11-11 10:27:22

ADO.NET入门

2009-12-21 17:35:24

ADO.NET对象
点赞
收藏

51CTO技术栈公众号