`
backspace
  • 浏览: 137087 次
文章分类
社区版块
存档分类
最新评论

Ado.net设计模式

 
阅读更多

连接类

连接类有固定的使用模式,这是常用的乐观模式:

using (var conn = new SqlConnection(connstr))
{
    conn.Open();

    //执行各种数据库操作

}

悲观的、防御性的编程方式,这里在using语句结尾显示关闭了连接,并捕捉整个using语句的数据库异常:

try
{
    using (var conn = new SqlConnection(connstr))
    {
        conn.Open();

        //执行各种数据库操作

        conn.Close();
    }
}
catch (SqlException e)
{
    throw;
}

事务

当使用多条语句修改数据库是,应将所有这些语句看作一个单元,要么完全成功修改数据库(提交),要么完全失败任何一条修改语句都不会被执行(回滚)。要想使用事务,先要引用System.Transactions装配体。事务的代码如下所示:

using (var scope = new TransactionScope())
{
    using (var conn = new SqlConnection(connstr))
    {
        conn.Open();
        // 执行各种数据库操作
    }

    scope.Complete();
}

在这里,事务范围使用了默认构造函数,它意味着TransactionScopeOption.Required、IsolationLevel.Serializable、TimeOut=1分钟。

事务通过使用scope.Complete显式标记为完成。缺少这个调用,事务将被回滚。

事务范围内可以有多个连接,都被看作一个整体。

事务的隔离级别:

ReadCommitted 读取已经提交的数据
ReadUncommitted 读取还没有提交的数据
RepeatableRead  
Serializable  

命令

打开数据库连接之后,需要定义要执行的命令。对Sql Server可用的命令类型有两种:文本、和存储过程。

定义文本类型命令的方法如下。因为文本类型的命令是默认值,所以不需要显式指定命令类型:

var sql = "SELECT ContactName FROM Customers";
var cmd = new SqlCommand(sql, conn);

定义存储过程类型的命令:

var cmd = new SqlCommand("CustOrderHist", conn) { CommandType = CommandType.StoredProcedure };
cmd.Parameters.AddWithValue("@CustomerID", "QUICK");

执行命令

定义了命令之后,需要执行它。根据返回结果不同分成三种执行方法。

ExecuteNonQuery方法一般用于UPDATE,INSERT,或DELETE语句。它执行命令,并返回受影响的行数。

打开连接后,添加如下代码:

var cmd = new SqlCommand("CustOrderHist", conn)
{
    CommandType = CommandType.StoredProcedure
};
cmd.Parameters.AddWithValue("@CustomerID", "QUICK");
var rows = cmd.ExecuteNonQuery();

ExecuteReader方法执行命令,并返回一个数据阅读器对象。在打开连接语句之后,添加如下代码:

var sql = "SELECT ContactName,CompanyName FROM Customers";
var cmd = new SqlCommand(sql, conn);
var reader = cmd.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine("Contact: {0,-20} Company: {1}",
                        reader[0], reader[1]);
}

ExecuteScalar执行返回一个标量值的命令。在打开连接语句之后,添加如下代码:

var sql = "SELECT COUNT(*) FROM Customers";
var cmd = new SqlCommand(sql, conn);
var custs = (int)cmd.ExecuteScalar();
Console.WriteLine(custs);

ExecuteScalar方法返回一个object对象,需要将其转化为实际的类型。

调用存储过程

调用不返回值的存储过程

这里列出两个例子,使用了Northwind数据库的Region表。

更新记录

存储过程定义如下:

CREATE PROCEDURE RegionUpdate (@RegionID INTEGER,
                               @RegionDescription NCHAR(50)) AS
   SET NOCOUNT OFF
   UPDATE Region
      SET RegionDescription = @RegionDescription
      WHERE RegionID = @RegionID
GO

如前所述,定义一个命令,并添加他的参数和参数值:

var cmd = new SqlCommand("RegionUpdate", conn) { CommandType = CommandType.StoredProcedure };

cmd.Parameters.AddWithValue("@RegionID", 23);
cmd.Parameters.AddWithValue("@RegionDescription", "Something");

cmd.ExecuteNonQuery();

删除记录

存储过程定义如下:

CREATE PROCEDURE RegionDelete (@RegionID INTEGER) AS
   SET NOCOUNT OFF
   DELETE FROM Region
   WHERE       RegionID = @RegionID
GO

在命令定义部分,使用SqlParameter构造函数来构造命令参数:

var cmd = new SqlCommand("RegionDelete", conn) { CommandType = CommandType.StoredProcedure };

cmd.Parameters.Add(new SqlParameter("@RegionID", SqlDbType.Int, 0, "RegionID"));
cmd.UpdatedRowSource = UpdateRowSource.None;

构造完命令并添加参数定义之后,通过参数名字检索出参数并设置它的值,然后执行命令:

cmd.Parameters["@RegionID"].Value = 999;
cmd.ExecuteNonQuery();

也可以通过参数位置检索参数。

调用返回输出参数的存储过程

下面的例子演示插入一个记录到数据库并且返回该记录的主键给调用者。

CREATE PROCEDURE RegionInsert(@RegionDescription NCHAR(50),
                              @RegionID INTEGER OUTPUT)AS
   SET NOCOUNT OFF
   SELECT @RegionID = MAX(RegionID)+ 1
   FROM Region
   INSERT INTO Region(RegionID, RegionDescription)
   VALUES(@RegionID, @RegionDescription)
GO

插入过程创造一个新的Region记录。因为主键由数据库自己生成,这值被作为一个输出参数从过程(@RegionID)返回。下面代码显示我们将如何调用RegionInsert存储过程:

var cmd = new SqlCommand("RegionInsert", conn) { CommandType = CommandType.StoredProcedure };
cmd.Parameters.Add(new SqlParameter("@RegionDescription",
                                    SqlDbType.NChar,
                                    50,
                                    "RegionDescription"));

cmd.Parameters.Add(new SqlParameter("@RegionID",
                                    SqlDbType.Int,
                                    0,
                                    ParameterDirection.Output,
                                    false,
                                    0,
                                    0,
                                    "RegionID",
                                    DataRowVersion.Default,
                                    null));

cmd.UpdatedRowSource = UpdateRowSource.OutputParameters;

第二参数,@RegionID,包括它的参数方向,在这个例子中是Output。代码的最后一行UpdateRowSource枚举被用来指明数据将从这个存储过程通过输出参数返回。

调用这个存储过程类似于前面的例子,除了输出参数是在执行过程之后被读取:

cmd.Parameters["@RegionDescription"].Value = "South West";
cmd.ExecuteNonQuery();
var newRegionID = (int)cmd.Parameters["@RegionID"].Value;

数据读取器

不能直接实例化一个数据读取器,只能由相应的命令对象通过ExecuteReader方法返回。

using (var conn = new SqlConnection(connstr))
{
    conn.Open();

    var sql = "SELECT ContactName,CompanyName FROM Customers";
    var cmd = new SqlCommand(sql, conn);

    var reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        var contact = reader.GetString(0);
        var company = reader.GetString(1);

        Console.WriteLine("'{0}' from {1}", contact, company);
    }

    reader.Close();

    conn.Close();
}

可以通过位置或者名称读取字段值,然后将返回的object值强制转换为合适的数据类型:

var contact = (string)reader[0];
var company = (string)reader["CompanyName"];
1
1
分享到:
评论

相关推荐

    ADO.NET本质论.pdf

    讲解了数据结构,演示了如何用ado.net来解决具体的数据访问问题。重点讨论了ado.net如何有效地平衡"功能的泛化"和"执行效率",以及它如何解决对扩展性、并发性和可靠性的要求。针对其他数据访问api(包括ole db,ado...

    【传智播客.Net培训—ADO.Net】5练习登录

    这个练习可能是针对初学者或者已经有一定基础的.Net开发者设计的,旨在通过实际操作加深对ADO.NET的理解,特别是数据库连接、查询以及数据交互方面的技能。 【描述】:描述部分没有提供具体的信息,但可以推测,这...

    ADO.NET 2.0试题 答案

    8. ** disconnected模式**:ADO.NET 2.0设计为在连接断开的情况下工作,这意味着数据可以从数据库加载到内存中的DataSet,然后在连接断开后进行处理,提高了性能和灵活性。 9. **XML集成**:ADO.NET 2.0强化了XML...

    数据库访问技术-ADO.NET程序设计.ppt

    在以数据为中心的应用程序设计中,ADO.NET提供了两种主要的工作模式:连接环境和非连接环境。连接环境,用户始终保持与数据源的连接,适合实时性强且安全性要求较高的应用,但可能导致网络资源占用大、扩展性差。...

    asp.net ADO.NET5

    MVC(Model-View-Controller)是一种设计模式,它将业务逻辑、数据和用户界面分离,提高了代码的可测试性和可维护性。在ASP.NET ADO.NET5中,可能涉及如何使用MVC架构来创建和管理数据驱动的Web应用。 2. **Entity ...

    Ado.NET.rar_ado.net

    最后,"3NET_03_POO.ppt"可能涉及面向对象编程(Object-Oriented Programming, OOP)的概念,这是ADO.NET设计的基础。ADO.NET的对象模型包括DataSet、DataTable、DataRow、DataColumn等,这些对象允许我们以声明式的...

    ADO.net ODP.net 实例 教程

    三层架构是一种常见的软件设计模式,它将应用程序分为三个主要部分:表示层(用户界面)、业务逻辑层(处理业务规则)和数据访问层(处理与数据库的交互)。在三层架构中,每一层都专注于自己的任务,使得代码更加...

    asp.net mvc 增删改查通过ado.net实现

    在.NET平台上,它提供了灵活的架构,使得开发者可以使用模型-视图-控制器(MVC)设计模式进行开发。ADO.NET则是.NET Framework中用于数据库交互的核心组件,它可以方便地与各种数据库管理系统(如SQL Server、Oracle...

    09数据访问技术--ADO.NET程序设计课后习题答案

    根据提供的文件信息,我们可以推断出这是一份关于“数据访问技术—ADO.NET程序设计”的课后习题答案。这份资料包含了多个选择题的答案,但没有具体的题目内容。因此,我们将基于这些信息来生成与ADO.NET相关的知识点...

    ADO.NET-高级编程(中)

    ADO.NET是微软.NET框架的一部分,它提供了一组用于与数据源交互的组件和服务,使得开发者可以高效地访问和操作各种数据库。...在实际项目中,结合设计模式和最佳实践,可以进一步提高代码质量和可维护性。

    ADO.NET程序设计模拟题

    ADO.NET是微软.NET框架的...以上是ADO.NET程序设计中涉及的关键概念和知识点,涵盖了连接管理、数据访问、XML集成、身份验证、错误处理以及性能优化等方面。了解和掌握这些知识对于开发高效的数据库应用程序至关重要。

    ado[1].net中文手册 学习 ado.net的重要资料

    首先,ADO.NET的设计目标是为了提高数据访问的效率、可维护性和互操作性。它采用了不连接的数据访问模式,允许应用程序在不需要持续连接数据库的情况下处理数据,从而降低了资源消耗并提高了性能。此外,通过使用XML...

    面向对象分析制作ASP.NET+ADO.NET项目开发实例

    这个实例开发过程中,你将学习到如何有效地运用面向对象设计原则,如单一职责原则、开闭原则等,以及如何将这些原则转化为具体的ASP.NET和ADO.NET代码。同时,你还将掌握如何使用ASP.NET的事件驱动模型处理用户请求...

    从零基础入门进行讲解:C#,WINFORM,ADO.NET,ASP.NET的教学视频v2

    通过学习,你可以了解如何使用C#编写代码,如何用WinForms构建桌面应用,如何利用ADO.NET连接和操作数据库,以及如何使用ASP.NET构建Web应用。这些技能对于进入IT行业,尤其是.NET开发领域,是非常重要的。

    数据库访问技术--ADO.NET程序设计 课后问答题答案

    本资源摘要信息涵盖了数据库访问技术--ADO.NET程序设计的课后问答题答案,包括连接体系结构、断开连接体系结构、XML Web 服务、ADO.NET 的互用性和可缩放性、DataSet、.NET 数据提供程序、安全模式、连接对象的方法...

    ADO.NET访问Oracle数据库类,及DBHelper

    这种设计模式允许在不改变业务逻辑的情况下切换不同的数据库提供商,提高了代码的可移植性和灵活性。 5. **使用示例**:使用OraDBHelper.cs时,首先需要确保引用了`System.Data.OracleClient`库,然后实例化...

Global site tag (gtag.js) - Google Analytics