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

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

    ASP.NET应用开发案例教程——基于MVC模式的ASP.NET+c#+ADO.NET 课件

    全书论述了ASP.NET开发概述、C#及ADO.NET背景知识、ASP.NET Web窗体的基本控件、数据控件和数据绑定技术、用户控件和自定义控件、ASP.NET内置对象和缓存技术、ASP.NET应用程序配置及编译和部署、ASP.NET与Web服务、...

    下部分课件 ASP.NET应用开发案例教程——基于MVC模式的ASP.NET+c#+ADO.NET 课件

    全书论述了ASP.NET开发概述、C#及ADO.NET背景知识、ASP.NET Web窗体的基本控件、数据控件和数据绑定技术、用户控件和自定义控件、ASP.NET内置对象和缓存技术、ASP.NET应用程序配置及编译和部署、ASP.NET与Web服务、...

    论文研究-基于ASP/ADO.NET的研究生入学考试成绩查询系统的设计与实现 .pdf

    基于ASP/ADO.NET的研究生入学考试成绩查询系统的设计与实现,蔚伟,王建国,本文利用先进的ASP/ADO.NET技术+MSSQL2000数据库平台,开发设计了研究生入学考试成绩查询系统,采用三层结构模式,并增加了多角色、多用�...

    MS Press - Microsoft ADO.NET Step by Step

    [资料][软件开发][.Net][设计模式][.Net企业解决模式][Enterprise Solution Patterns][Microsft.Dot.NET的企业解决方案模式].chm

    使用模板设计模式重用ADO.NET代码

    在本文中,我们将演示重用ADO.NET的模板模式。

    一个拥有三层架构,asp.Net,设计模式的词条实例

    些实例是一个模仿百度百科词条系统功能的项目,包括:标准三层架构、数据层中应用ADO.Net实现了各种表的关联、广意查找、联表查询、多表一体化插入数据等操作,并对DoCommand进行了表态封装。在业物层中实现了对数据表...

    ACCP 5.0 S2 酒店管理系统(ADO.NET+三层)

    酒店管理系统使用三层系统化的,详细化的,外加设计模式,配置文件的读取....

    ASP.NET网站设计实例通

    第9章使用ASP.NET设计并实现一个电子商店。第10章是ASP.NET的进阶内容,讲解文件上传和E-mail的自动传送功能。本书可以作为ASP.NET程序设计人员的参考资料,也可以作为网站建设及维护人员的培训班教材

    ASP.NET中实现把Json数据转换为ADO.NET DataSet对象

    Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据。但是有些情况下DataSet Converter并不管用,而且也不一定能够满足项目需要。这里介绍另一种简单有效的...

    《ASP.NET网站设计实例通》

    第9章使用ASP.NET设计并实现一个电子商店。第10章是ASP.NET的进阶内容。讲解文件上传和E-mail的自动传送功能。本书可以作为ASP.NET程序设计人员的参考资料,也可以作为网站建设及维护人员的培训班教材。 目录 1,ASP...

    北京中科信软 Visual Basic.NET培训

    C#与设计模式 泛型 C#中的新特性 程序集 .NET应用程序部署和版本控制 委托和事件 线程 反射 对象序列化 数据流和文件 Internet访问与网络编程 EventLog MSMQ Remoting 与COM的交互 Windows Service ...

    ASP.NET 网站设计实例通(PDG)

    第9章使用ASP.NET设计并实现一个电子商店。第10章是ASP.NET的进阶内容,讲解文件上传和E-mail的自动传送功能。 本书可以作为ASP.NET程序设计人员的参考资料,也可以作为网站建设及维护人员的培训班教材

    基于.NET的Ajax技术研究与实现

    传统基于B/S模式的Web系统虽然解决了C/S模式中令人头疼的部署及发布问题,但是因为种种限制而不具有C/S模式下丰富的交互,而且每次与服务器的交互都要完全刷新页面,这给设计者及用户带来了极大的不便。Ajax技术的出现...

    基于ASP.NET的电商系统的设计与实现

    能学到什么:ASP.NET技术的基本理解和使用,ADO.NET技术的掌握和使用,BootStrap前端框架的基本使用方法和练习。 适合人群:具备一定编程基础,Web程序设计入门者,适合新手小白,适合于课程设计。 主要功能:包括...

    ASP.NET 网站设计实例通(PDG).rar

    第9章使用ASP.NET设计并实现一个电子商店。第10章是ASP.NET的进阶内容,讲解文件上传和E-mail的自动传送功能。 本书可以作为ASP.NET程序设计人员的参考资料,也可以作为网站建设及维护人员的培训班教材

    ASP.NET网站设计实例通 part03

    第9章使用ASP.NET设计并实现一个电子商店。第10章是ASP.NET的进阶内容。讲解文件上传和E-mail的自动传送功能。\r\n 本书可以作为ASP.NET程序设计人员的参考资料,也可以作为网站建设及维护人员的培训班教材。

Global site tag (gtag.js) - Google Analytics