c#

位置:IT落伍者 >> c# >> 浏览文章

C#高级编程:事务处理和命令


发布日期:2021年10月26日
 
C#高级编程:事务处理和命令
——此文章摘自《C#高级编程(第版)》定价元 特价元 购买

事务处理

通常对数据库要进行多次更新这些更新必须在事务处理的范围内进行ADONET中的事务处理首先要在数据库连接对象上调用BeginTransaction()方法这些方法返回实现IDbTransaction接口的对象而该对象是在SystemData中定义的

下面的代码序列是在Sql Server连接上开始事务处理的

string source = server=(local)\\NetSDK; + integrated security=SSPI; +database=Northwind;

SqlConnection conn = new SqlConnection(source);

connOpen();

SqlTransaction tx = connBeginTransaction();

// Execute some commands then commit the transaction

txCommit();

connClose();

在开始一个事务处理时可以选择在该事务处理中执行的命令独立级别该级别确定了如何在一个数据库会话中查看在另一个数据库会话中所进行的修改并不是所有的数据库引擎都支持表所示的个级别

独 立 级 别说 明ReadCommittedSQL Server默认级别这个级别可以确保只有第一个事务处理结束后在第二个事务处理中才能访问第一个事务处理写入的数据ReadUncommitted

即使一个事务处理还没有处理完数据也允许另一个事务处理从数据库中读取数据例如如果两个用户在访问同一个数据库第一个用户插入一些数据但没有完成事务处理(通过Commit或Rollback方法)第二个用户把它们的独立级别设置为ReadUncommitted因此可以访问数据RepeatableRead

这个级别扩展了ReadCommitted级别如果在事务处理中使用了相同的语句无论是否有其他潜在的数据库更新总是可以返回相同的数据这个级别要求对数据进行额外的锁定这会降低性能这个级别可以保证对于初始查询的每一行都不会修改数据但允许显示假想(phantom)行—— 这些行是在进行事务处理时由另一个事务处理插入的全新数据行Serializable

这是最高级的事务处理级别对数据库中的数据进行序列化的访问利用这种独立级别不会显示假想行所以在序列化的事务处理中使用的SQL语句总是检索相同的数据序列化事务处理对性能的负面影响不应低估如果肯定不需要这个独立级别最好不要加上它

SQL Server的默认独立级别ReadCommitted是数据一致性和数据可用性的一种很好的折衷因为它比RepeatableRead 或 Serializable模式中需要的数据锁定都少但是有时应提高独立级别这样在NET中才能用一种非默认的级别开始事务处理使用哪个级别没有硬性规则全凭经验

注意如果当前使用的是不支持事务处理的数据库应转而使用支持它的数据库一旦我们成为可以完全信任的雇员且拥有错误数据库的全部访问权限就可能试键入id=以删除对应的错误但实际上输入的是<而不是=此时会删除整个错误数据库这可不是我们希望的幸好IS小组每天晚上都会备份该数据库可以恢复它但使用回滚命令会更简单

命令

节中简要介绍了针对数据库执行的命令简言之命令就是一个要在数据库上执行的SQL文本字符串命令也可以是一个存储过程或者返回表中所有列和所有行的表名(例如SELECT *样式的子句)

把SQL子句作为一个参数传递给Command类的构造函数就可以构造一个命令如下 所示

string source = server=(local)\\NetSDK; + integrated security=SSPI; +database=Northwind;

string select = SELECT ContactNameCompanyName FROM Customers;

SqlConnection conn = new SqlConnection(source);

connOpen();

SqlCommand cmd = new SqlCommand(select conn);

<provider>Command类的属性CommandType可以定义某个命令是一个SQL子句一个存储过程的调用或者是一个完整的表语句(仅从给定的表中选择所有的列和行)总结了CommandType枚举

命 令 类 型样 例Text(默认)String select = SELECT ContactName FROM Customers;

SqlCommand cmd = new SqlCommand(selectconn);StoredProcedure

SqlCommandcmd=new SqlCommand(CustOrderHistconn);

cmdCommandType = CommandTypeStoredProcedure;

cmdParametersAdd(@CustomerIDQUICK);TableDirectOleDbCommand cmd = new OleDbCommand(Categoriesconn);

cmdCommandType = CommandTypeTableDirect;

在执行一个存储过程时需要把参数传送给过程上面的示例直接设置了参数@CustomerID但设置参数的值还可以使用其他方式详见本章的后面

提示TableDirect命令类型只对OleDb提供程序有效—— 如果试图把这个命令类型用于其他提供程序就会产生异常

上一篇:C#中TreeView组件使用方法初步

下一篇:复杂表达式的执行步骤 - .Net编程