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

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

创新互联是一家专业提供荣昌企业网站建设,专注与成都网站设计、网站建设、成都h5网站建设、小程序制作等业务。10年已为荣昌众多企业、政府机构等服务。创新互联专业网站建设公司优惠进行中。

.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.     ....
  5. }

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

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

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

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

1.DataReader的用法:

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

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

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

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

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

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

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

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

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

标题名称:ADO.NET入门五大你需要知道的对象
分享链接:http://www.shufengxianlan.com/qtweb/news32/121882.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联