ado.net mysql 事务_ADO.NET系列之事务和调用存储过程

前几篇我们介绍了Connection、Command和DataAdapter等对象,本节我们将学习ADO.NET中不可缺少的事务,以及调用数据库的存储过程。

ADO.NET事务

在许多大型、关键的应用程序中,计算机每秒钟都在执行大量的任务。更为经常的不是这些任务本身,而是将这些任务结合在一起完成一个业务要求,称为事务。如果能成功地执行一个任务,而在第二个或第三个相关的任务中出现错误,将会发生什么?这个错误很可能使系统处于不一致状态。这时事务变得非常重要,它能使系统摆脱这种不一致的状态。

一个Command对象的CommandText属性指定多条以;分割的语句。这种情况下若没有事务,所有的语句都会被执行,若其中有语句出错,就导致了数据的不一致性。当然我们也可以写存储过程,在SQLServer的数据库系统内建存储过程的语句若没有事务,多条语句中的部分语句失效,一样导致数据的不一致性:你可以在存储过程内部Try/Catch/BeginTransaction等。

下面我们做个示例展示事务在ADO.NET中的使用方法。

string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";

using (SqlConnection con = new SqlConnection(connectionString))

{

con.Open();

using (SqlTransaction tran = con.BeginTransaction())

{

using (SqlCommand com = con.CreateCommand())

{

try

{

com.Transaction = tran;

com.CommandText = "insert into table values('1','111')";

com.ExecuteNonQuery();

com.CommandText = "insert into table values('2','222')";

com.ExecuteNonQuery();

tran.Commit();

Console.WriteLine("事务提交成功");

}

catch (SqlException ex)

{

tran.Rollback();

con.Close();

Console.WriteLine("事务提交失败:" + ex.Message);

}

}

}

}

Connection对象BeginTransaction启动事务,然后将事务赋值给Command对象的Transaction属性即挂接了事务。即使没有Commit 和Rollback,若执行中 错误,事务一样自动回滚,或者成功提交。

BeginTransaction可以指定隔离级别。ReadXXX不会对数据库加锁,尽管在事务中,外部程序仍然可以读取数据;但若事务中有Update语句,将导致数据库锁,外部程序不能继续读取数据。

尽量考虑在存储过程中使用事务,避免使用ADO的事务,因为ADO的事务可能导致数据库长时间处于锁定状态;而数据库内的存储过程中的事务往往不会长时间挂起事务。

ADO.NET调用存储过程

存储过程(Stored Procedure)是一组为了完成特定功能的T-SQL语句集合,经编译后存储在SQL Server服务器中,利用存储过程可以加速SQL语句的执行。

在应用程序中,使用存储过程读取数据,能够提高应用程序的工作效率,简化数据库的管理和显示信息

创建一个带有输入参数的存储过程:

CREATE PROCEDURE GetUserPro

@id INT

AS

BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from

-- interfering with SELECT statements.

SET NOCOUNT ON;

SELECT * FROM dbo.eftest WHERE id=@id

END

GO

ADO.NET中调用存储过程示例:

string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";

using (SqlConnection con = new SqlConnection(connectionString))

{

string sql = "GetUserPro";

SqlParameter para = new SqlParameter("@id", );

using (SqlCommand com = new SqlCommand(sql, con))

{

DataSet ds = new DataSet();

try

{

com.Parameters.Add(para);

con.Open();

com.CommandType = CommandType.StoredProcedure;

SqlDataAdapter adapter = new SqlDataAdapter(com);

adapter.Fill(ds);

foreach (DataRow s in ds.Tables[].Rows)

{

Console.WriteLine("ID:" + s["id"].ToString());

Console.WriteLine("Name:" + s["name"].ToString());

}

}

catch (Exception ex)

{ }

}

}

看过Command对象介绍的时候,代码跟那个差不多 ,是的  比Command章节的代码就多了一行:com.CommandType = CommandType.StoredProcedure; CommandType 默认情况是:com.CommandType = CommandType.Text;CommandType.StoredProcedure表示执行存储过程。

ADO.NET系列之Connection对象

ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 ADO.NET概念 ADO ...

ADO.NET系列之Command对象

ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 上一篇

ADO.NET系列之DataAdapter对象

ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 我们前两篇文章介绍了ADO ...

c++ ado 调用存储过程并得到输出参数和返回值

// AccessSqlserverByAdo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

一.JDBC常用的API深入详解及存储过程的调用 相关链接:Jdbc调用存储过程 1.存储过程(Stored Procedure)的介绍 我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后 ...

SSIS使用OleDB和Ado.Net两种方式调用 存储过程

在使用”执行 SQL 任务“组件调用存储过程时,连接方式使用OleDB和Ado.Net稍有不同,结合图例说明一下 当我们使用OleDB时,设置的截图如下: 参数使用?来代替,Parameter Nam ...

ADO.NET笔记——调用存储过程

相关知识: 在ADO.NET访问SQL Server时,鼓励使用存储过程取代常规的SQL语句. 存储过程有下列优点: 存储过程中的SQL语句将会经过预先的解析和编译,然后存放在数据库服务器上行.调用的 ...

ADO.NET访问SQL Server调用存储过程带回参

1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

delphi用TAdoStoredProc调用存储过程,兼容sql2005、2008、2014的远程事务问题

delphi7写的程序,在sql2000里没问题,调用sql2008.2014里的存储过程时,如果存储过程里操作了大量数据,很容易会莫名其妙的自己撤销掉,但是程序还识别不到,认为还在正常执行.今天尝试 ...

随机推荐

Windows自动关机命令

winxp中自带了自动关机功能,在开始→运行中使用SHUTDOWN命令 1. 延迟关机关机 shutdown -s -t 120 -s为关机:-t为时间,以秒为单位,120表示2分钟 表示两分钟后关机 ...

会员管理系统全部源代码(C#+EF+SQLite+Winforms实现)

会员管理系统全部源代码,VS2010开发,使用Ado.net实体框架EF,简化数据库访问层,并能方便的移植到其他数据库.利用数据绑定减少编码量,提高程序的可维护性和可读性.使用Winfoms方便快速界 ...

mysql 索引篇

一.索引优化   索引优化主要还是依赖explain命令,关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分r ...

弹出输入内容prompt

redis 在 php 中的应用(Sorted-set篇)

本文为我阅读了 redis参考手册 之后编写,注意 php_redis 和 redis-cli 的区别(主要是返回值类型和参数用法) Redis 有序集合和集合一样也是string类型元素的集合,且不 ...

POJ 1741.Tree 树分治 树形dp 树上点对

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24258   Accepted: 8062 Description ...

Java的反射机制与泛型擦除

实现方式 反编译:.class–>.java 通过反射机制访问java对象的属性,方法,构造方法等涉及类 java.lang.Class; java.lang.reflect.Construct ...

Java网络编程和NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector

Java网络编程与NIO详解4:浅析NIO包中的Buffer.Channel 和 Selector 转自https://www.javadoop.com/post/nio-and-aio 本系列文章首 ...

Python基础知识-06-集合内存布尔False

python其他知识目录 1.判断一个字符串中是否有敏感字符? #str: m_str="我叫魔降风云变" if "魔" in m_str: #判断指定字符是否 ...

【白书训练指南】(UVa10755)Garbage Heap

先po代码,之后把我那几个不太明了的知识点讲讲,巩固以下.三维的扫描线算法想要掌握还真是有一定的难度的. 代码 #include #include

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值