ADO.net能对存储过程,进行事务处理么? 回滚 提交

liberte 2010-05-23 11:25:04
用Sqltansaction对存储过程有用么?
...全文
173 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
加油馒头 2010-05-25
  • 打赏
  • 举报
回复
程序里 与 SQL存储过程 都可以加事物
myweb_love 2010-05-23
  • 打赏
  • 举报
回复
当然可以
周公 2010-05-23
  • 打赏
  • 举报
回复
为什么不在Procedure中直接使用Transation呢?
不是舍近求远吗?
liberte 2010-05-23
  • 打赏
  • 举报
回复
怎么有人说SQltansaction只对SQL语句有用呢
wuyq11 2010-05-23
  • 打赏
  • 举报
回复
using(SqlConnection con = new SqlConnection(""))
{
con.Open();
SqlTransaction myTran = con.BeginTransaction();
SqlCommand myCom = new SqlCommand("",con);
try
{
myCom .CommandType=CommandType.StoredProcedure
myComExecuteNonQuery();
myTran.Commit();
}
catch (Exception Ex)
{
myTran.Rollback();
}
finally
{
con.Close();
}
}
理不完的逻辑 2010-05-23
  • 打赏
  • 举报
回复
学习~!
  • 打赏
  • 举报
回复
有用...

参考:
http://www.cnblogs.com/zhenyulu/articles/330494.html
将执行 sql语句的地方 换成Proc就可以了
threenewbee 2010-05-23
  • 打赏
  • 举报
回复
当然可以。
heke_asp 2010-05-23
  • 打赏
  • 举报
回复
当然可以
空心兜兜 2010-05-23
  • 打赏
  • 举报
回复
当然是可以的
缪军 2010-05-23
  • 打赏
  • 举报
回复
由于事务在逻辑上的特殊性,
要求代码错误处理机制必须"天衣无缝",
否则,一旦出现异常情况,后果有可能很严重,呵呵
QQ865926998 2010-05-23
  • 打赏
  • 举报
回复
我就用了
缪军 2010-05-23
  • 打赏
  • 举报
回复
呵呵,你有没有想过,如果sp执行异常(包括执行结果不正确)的话,事务回滚吗?

事务无论在代码里还是在sqlserver上都存在这样的问题,
也包括像sql触发器这样的系统级事务也是不可靠的(不可靠的原因是由于写入了代码,代码的执行可能会出问题,而不是触发器本身不可靠)


一些多步操作可以通过设计阶段的合理设计转换成单步操作,
还有一些多步操作客户不需要回滚,只是程序设计者一厢情愿从单纯的技术角度臆断的

总之,尽量避免使用事务
原文地址:https://github.com/andolove/Data 感谢作者!很实用 简单的Ado.net数据访问客户端。 数据库访问入口 获取IDbClient 在开始之前,先添加一个数据库访问入口。当然,也可以使用任何你喜欢的方式来创建IDbClient(的实现类)实例。 public static class Db { private static readonly Dictionary KnownClients = new Dictionary(); public static IDbClient Northwind { get { return GetClient("Northwind", "server=.;database=Northwind;trusted_connection=true;"); } } private static IDbClient GetClient(string name, string connectionString) { IDbClient client; if (KnownClients.TryGetValue(name, out client)) return client; lock (KnownClients) { if (KnownClients.TryGetValue(name, out client)) return client; // 创建IDbClient的实例 client = new SqlDbClient(connectionString); KnownClients.Add(name, client); } return client; } } 现在,可以使用Db.Northwind来访问SQLServer的Northwind示例数据库了。 访问其他数据库 如果要访问MySql,可以用几行代码实现一个面向MySql的IDbClient实现。下面以使用 MySql.Data.dll 作为MySql .net客户端提供器为例。 /// /// Mysql数据库访问客户端。 /// public class MysqlDbClient : AbstractDbClient { private readonly string _connectionString; /// /// 使用指定的数据库类型和连接字符串初始化的新实例。 /// /// 连接字符串。 public MysqlDbClient(string connectionString) { ArgAssert.NotNullOrEmptyOrWhitespace(connectionString, "connectionString"); _connectionString = connectionString; } /// /// 获取当前实例所使用的数据库连接字符串。 /// public override string ConnectionString { get { return _connectionString; } } /// /// 获取当前实例所使用的实例。 /// protected override DbProviderFactory Factory { get { return MySql.Data.MySqlClient.MySqlClientFactory.Instance; } } } 现在可以创建MySql的访问客户端了: IDbClient client = new MysqlDbClient("server=.;database=MySqlDb;uid=user;pwd=password"); 类似的,可以创建访问Oracle,Sqlite或是其他数据库的客户端,只需要找到对应的DbProviderFactory实例即可。 基本数据库操作 基础CRUD // 查询 string productName = (string)Db.Northwind.Scalar( "SELECT ProductName FROM Products WHERE ProductID=115"); DataTable productTable = Db.Northwind.DataTable("SELECT * FROM Products"); // 更新 int affectedRows = Db.Northwind.Execute( "UPDATE Products SET ProductName='The Name' WHERE ProductID=115"); // 在没有命中一行的时候抛出异常 int expectedSize = 1; Db.Northwind.SizedExecute( expectedSize, "UPDATE Products SET ProductName='The Name' WHERE ProductID=115"); // 获取一行 IDataRecord record = Db.Northwind.GetRow( "SELECT ProductName, SupplierID FROM Products WHERE ProductID=115"); int supplierId = Convert.ToInt32(record["SupplierID"]); // 在不用在意资源释放的情况下使用DataReader,利用了foreach的机制,在循环结束后DataReader会自动关闭 IEnumerable rows = Db.Northwind.Rows( "SELECT ProductName, SupplierID FROM Products WHERE ProductID=115"); foreach (IDataRecord row in rows) { Console.WriteLine(row["ProductName"]); } 使用参数和调用存储过程 // 使用参数 DbParameter parameter = Db.Northwind.CreateParameter(); parameter.DbType = DbType.String; parameter.ParameterName = "CustomerID"; parameter.Value = "ALFKI"; parameter.Direction = ParameterDirection.Input; // 调用存储过程 CustOrderHist @CustomerID DataSet ds = Db.Northwind.DataSet( "CustOrderHist", new[] { parameter }, CommandType.StoredProcedure); // 使用DbClientParamEx中的扩展方法快速创建参数(需要using Data命名空间) DbParameter[] parameters = new[] { Db.Northwind.CreateParameter("id", DbType.Int32, 115, direction: ParameterDirection.Input), Db.Northwind.CreateParameter("name", DbType.String, "Ikura", 5) }; Db.Northwind.DataSet("SELECT * FROM Products WHERE ProductName=@name OR ProductID=@id", parameters); 使用Mapper IMapper接口定义了从IDataRecord到T类型的映射,可以用过实现该接口,以便从数据库读取并创建特定类型实例及实例的集合。 public class Product { public int ProductID; public string ProductName; } public class ProductMapper : IMapper { public Product MapRow(IDataRecord record, int rowNum) { var product = new Product(); product.ProductID = Convert.ToInt32(record["ProductID"]); product.ProductName = record["ProductName"].ToString(); return product; } } 利用上面的ProductMapper,我们可以直接从查询中创建Product实例了。 // 获取一个实例 Product product = Db.Northwind.Get( new ProductMapper(), "SELECT * FROM Products WHERE ProductID=115"); // 获取实例的集合 IList products = Db.Northwind.List(new ProductMapper(), "SELECT * FROM Products"); Mappers类中已经定义了部分简单类型的Mapper实现,以便实现便捷的查询。 // 使用已定义好的简单Mapper IList productNames = Db.Northwind.List( Mappers.String(), "SELECT ProductName FROM Products"); IList productIds = Db.Northwind.List( Mappers.Int32(), "SELECT ProductID FROM Products"); // 使用实现IConvertible的类型创建Mapper IList orderDates = Db.Northwind.List( Mappers.Convertible(), "SELECT OrderDate FROM Orders"); 使用事务 使用CreateTransaction方法来获取一个ITransactionKeeper事务容器。获取到的事务容器自身也实现了IDbClient,可以在其上进行各种CRUD操作。 事务的最后,别忘了Commit。 ITransactionKeeper同时也实现了IDisposable接口,其Dispose方法能够在事务没有提交进行事务回滚(如果已经提交,则什么也不做),利用这个机制和C#的using语法,可以很方便的编写一个在出现异常时回滚的事务操作。 using (ITransactionKeeper tran = Db.Northwind.CreateTransaction()) { tran.Execute("UPDATE Products SET ProductName='The Name' WHERE ProductID=115"); tran.Execute("UPDATE Products SET ProductName='The Name2' WHERE ProductID=118"); tran.Commit(); } Dynamic扩展 在Data.Dynamic命名空间的ObjectiveExtension类中,定义了一套IDbClient的扩展方法,能够使用更快捷的方式进行数据库操作。 .net对象传参 这些扩展方法具有与IDbClient中的方法很类似的签名,但能够接收一个用于存放参数信息的.net对象,以节省许多编码量(是的,和Dapper、ServiceStack.OrmLite很相似)。 通过这些扩展方法,上面使用参数的示例可以这样写了: DataSet ds = Db.Northwind.DataSet( "CustOrderHist", new { CustomerID = "ALFKI" }, CommandType.StoredProcedure); DataTable dt = Db.Northwind.DataTable( "SELECT * FROM Products WHERE ProductName=@name OR ProductID=@id", new { name = "Ikura", id = 115 }); 获取类型实例 现在不指定Mapper就可以直接进行对象查询了。 Product product = Db.Northwind.Get("SELECT * FROM Products WHERE ProductID=115"); IList products = Db.Northwind.List("SELECT * FROM Products"); IList orderDates = Db.Northwind.List("SELECT OrderDate FROM Orders"); 在这些方法内部,会在运行时动态生成对应的Mapper,并且生成一次以后,信息会被缓存下来,不需要每次都重新创建。当然,因为做了更多的是事情,它还是会比非扩展的原生版本慢那么一点点。 也可以使用匿名对象作为实体模板,在许多场景尤其是处理包含少量字段(但又多于1个)时尤其方便。 var template = new { ProductID = 0, ProductName = string.Empty }; var productsByTemplate = Db.Northwind.TemplateList(template, "SELECT * FROM Products"); 关于字段名称的匹配 .net对象的属性和公共字段使用Pascal命名法,但数据库规范中的字段命名法可能不一样,比如MySql的snake_case命名法;而且也有太多的数据库设计使用“意识流”了。为了解决这个命名差异问题,查询结果映射到非匿名对象字段时支持字段名称的模糊匹配,具体规则如下,越靠前的规则优先级越高: 查询结果的字段名称和对象字段名称完全一致; 大小写不敏感的匹配;例:查询结果字段goodName可映射到对象字段GoodName。 查询结果的字段名称移除下划线(头尾的下划线将保留)之后,再进行大小写不敏感的匹配;例:查询结果字段good_name可映射到对象字段GoodName;_goodName不会映射到GoodName,因为头尾的下划线不会被忽略。 字体匹配时,考前的规则将优先进行匹配,没有匹配到的字段再使用下一优先级的规则进行匹配。若所有规则都为命中,则对象字段将在映射中被忽略从而保持字段类型的默认值。 注意:使用匿名对象作为模板查询时,匿名对象的字段名称需和查询结果的字段名称完全匹配,不支持模糊匹配。 Indexing扩展 在Data.Indexing命名空间的IndexingExtension类中,定义了另外一套IDbClient的扩展方法,能够基于索引访问传入的参数。 记得string.Format方法吗: string.Format("My name is {0}, I'm {1} years old.", "John Doe", 8); 类似的,这些扩展方法用起来是这个样子的: DataTable dt = Db.Northwind.DataTable( "SELECT * FROM Products WHERE ProductName=@0 OR ProductID=@1", "Ikura", 115); IList products = Db.Northwind.List( "SELECT * FROM Products WHERE ProductID IN (@0, @1)", 15, 16); 通常在一个地方并不混用两套扩展。Dynamic扩展会更泛用一些,但在一些特定的场景下,使用Indexing扩展也是个好主意。还有,这套扩展方法速度会更快一些。
以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中的具体应用。 第1章 SQL语言的概述 1.1 认识SQL语言 1.1.1 什么是SQL语言 1.1.2 SQL的历史与发展 1.1.3 SQL的功能和优点 1.2 认识数据库 1.2.1 什么是数据库 1.2.2 数据库系统的结构 1.2.3 数据库系统的工作流程 1.2.4 常见的SQL数据库管理系统 1.3 数据模型 1.3.1 关系数据库模型 1.3.2 数据模型的构成 1.3.3 常见的数据模型 1.4 关系型数据库 1.4.1 关系型数据库的定义 1.4.2 关系型数据库与表 1.4.3 主键与外键 1.4.4 字段约束 1.4.5 数据的完整性 1.4.6 关系数据库设计原则 1.5 SQL开发环境 1.5.1 SQL环境介绍 1.5.2 SQL的层次结构 1.5.3 SQL环境中的对象 1.5.4 SQL环境中的程序系统 1.6 SQL语句基础 1.6.1 SQL常量 1.6.2 SQL表达式 1.6.3 SQL数据类型 1.6.4 注释符 1.6.5 批处理 1.6.6 SQL语句的执行 1.7 SQL语法知识 1.7.1 SQL语法结构 1.7.2 常用的SQL语句 1.8 小结第2章 设计数据库 2.1 设计数据库基础 2.1.1 数据库设计定义 2.1.2 设计数据库的意义 2.1.3 进行数据库设计的方法 2.2 数据实体和联系 2.2.1 实体、属性与联系 2.2.2 一对一联系 2.2.3 一对多联系 2.2.4 多对多联系 2.3 规范化准则 2.3.1 范式 2.3.2 第一范式 2.3.3 第二范式 2.3.4 第三范式 2.3.5 第四范式 2.4.小结第2篇 数据库管理篇第3章 数据库的相关操作 3.1 创建数据库 3.1.1 SQL标准中创建数据库的语法 3.1.2 使用SQL语句创建数据库 3.2 删除数据库 3.2.1 SQL标准中删除数据库的语法 3.2.2 使用SQL语句删除数据库 3.3 修改数据库 3.3.1 修改数据库语法 3.3.2 使用SQL语句修改数据库 3.4 管理数据库 3.4.1 扩充与压缩数据库 3.4.2 导入与导出数据 3.4.3 数据库的备份与恢复 3.4.4 使用sp_helpdb查看数据库信息 3.5 小结第4章 数据表的相关操作 4.1 SQL中的数据表 4.1.1 数据表的结构 4.1.2 数据表的种类 4.2 创建数据表 4.2.1 创建数据表的语句结构 4.2.2 创建基本表 4.2.3 非空约束 4.2.4 DEFAULT指定缺省值 4.3 修改数据表 4.3.1 修改数据表的语句结构 4.3.2 给数据表增添新列 4.3.3 修改数据表中的列 4.3.4 删除数据表中的列 4.4 数据表的删除 4.4.1 删除数据表的语句结构 4.4.2 使用SQL语句删除数据表 4.5 数据表的重命名 4.5.1 重命名数据表的语句 4.5.2 使用SQL语句重命名数据表 4.6 小结第5章 索引与视图 5.1 索引的基础知识 5.1.1 索引的概念 5.1.2 索引的类型 5.1.3 索引的结构 5.2 创建索引 5.2.1 创建索引的语句结构 20.3.3 子查询的实现 20.3.4 复合查询的实现 20.4 运算符与表达式的应用 20.4.1 连接数据表的实现 20.4.2 算术运算符的应用 20.4.3 表达式的应用 20.5 数据维护与触发器的应用 20.5.1 添加数据的实现 20.5.2 更新数据的实现 20.5.3 删除数据的实现 20.5.4 在VB.NET中应用触发器20.6 小结第21章 VB 6.0与SQL Server的开发与应用 21.1 VB 6.0开发环境 21.1.1 VB 6.0介绍 21.1.2 VB 6.0的版本 21.1.3 VB 6.0开发环境 21.2 VB 6.0连接数据库 21.2.1 VB 6.0中的数据库控件介绍 21.2.2 数据库连接举例 21.3 数据查询应用 21.3.1 普通数据查询的实现 21.3.2 连接查询的实现 21.3.3 子查询的实现 21.3.4 复合查询的实现 21.4 运算符与表达式的应用 21.4.1 连接数据表的实现 21.4.2 算术运算符的应用 21.4.3 表达式的应用 21.5 数据维护操作的应用 21.5.1 添加数据的实现 21.5.2 更新数据的实现 21.5.3 删除数据的实现 21.6 触发器与存储过程的应用 21.6.1在VB 6.0中应用触发器 21.6.2在VB 6.0中应用存储过程 21.7 小结第22章 VC++6.0与SQL Server的开发与应用 22.1 VC++6.0开发环境 22.1.1 VC++6.0介绍 22.1.2 MFC编程 22.1.3 VC++6.0开发环境 22.2 VC++6.0连接数据库 22.2.1 ADO数据控件介绍 22.2.2 数据库连接举例 22.3 数据查询应用 22.3.1 普通数据查询的实现 22.3.2 连接查询的实现 22.3.3 子查询的实现 22.3.4 复合查询的实现 22.4 运算符与表达式的应用 22.4.1 连接数据表的实现 22.4.2 算术运算符的应用 22.4.3 表达式的应用 22.5 数据维护操作的应用 22.5.1 添加数据的实现 22.5.2 更新数据的实现 22.5.3 删除数据的实现 22.6 小结第23章 PHP访问 SQL Server 2005 23.1 PHP开发环境 23.1.1 PHP简介及其特点 23.1.2 PHP开发环境的安装 23.2 PHP连接SQL Server服务器 23.2.1 使用PHP的MSSQL扩展 23.2.2 PHP连接SQL Setver的必要条件 23.3 使用PHP存取SQL Server数据库 23.3.1 选择操作的数据库 23.3.2 在数据库中创建表 23.3.3 删除存在的数据表 23.4 对数据库中表的操作 23.4.1 向表中添加记录 23.4.2 浏览表中记录 23.4.3 修改已有记录 23.4.4 删除指定记录 23.5 可回复留言板的开发(PHP+SQL Server) 23.5.1 数据表的设计 23.5.2 配置文件的创建 23.5.3 创建系统运行的表 23.5.4 创建留言显示模块 23.5.5 创建留言添加模块 23.5.6 进入留言管理模块 23.5.7 创建留言修改模块 23.5.8 创建留言删除模块 23.6 小结 5.2.2 创建非簇索引 5.2.3 创建簇索引 5.2.4 创建惟一索引 5.2.5 创建复合索引 5.3 删除索引 5.3.1 删除索引的语句结构 5.3.2 使用SQL语句删除索引 5.4 视图的基础知识 5.4.1 视图概述 5.4.2 视图的优点与缺点 5.5 视图的基本操作 5.5.1 创建视图的基本语句结构 5.5.2 使用SQL语句创建视图 5.5.3 修改视图的语句结构 5.5.4 重命名视图的名称 5.5.5 使用SQL语句修改视图 5.5.6 删除视图的语句结构 5.5.7 使用SQL语句删除视图 5.6 视图的应用 5.6.1 利用视图简化表的复杂连接 5.6.2 利用视图简化复杂查询 5.7 小结第3篇 SQL查询篇第6章 简单的SELECT语句查询 6.1 查询的基本结构 6.1.1 了解SELECT语句 6.1.2 SELECT语句的语法格式 6.1.3 SELECT语句的执行步骤 6.2 简单的查询语句 6.2.1 查询表中指定的字段 6.2.2 查询所有的字段 6.2.3 使用DISTINCT去除重复信息 6.2.4 使用别名 6.3 排序与分组 6.3.1 升序排序与降序排序 6.3.2 多列字段排序 6.3.3 使用GROUPBY子句对查询结果进行分组 6.3.4 HAVING子句的应用 6.4 条件查询 6.4.1 WHERE单条件语句查询 6.4.2 运算符查询 6.4.3 BETWEEN运算符范围筛选 6.4.4 使用TOP子句 6.4.5 NULL的判断 6.5 模糊查询 6.5.1 使用LIKE运算符进行查询 6.5.2 使用“_”通配符进行查询 6.5.3 使用“%”通配符进行查询 6.5.4 使用“[]”通配符进行查询 6.5.5 使用“[^]”通配符进行查询 6.6 小结第7章 运算符与表达式相关查询 7.1 逻辑运算符 7.1.1 逻辑与运算符 7.1.2 逻辑或运算符 7.1.3 逻辑运算符的组合使用 7.2 IN运算符 7.2.1 IN运算符的使用 7.2.2 NOT IN运算符的使用 7.3 NOT运算符与BETWEEN运算符 7.3.1 N0T运算符的使用 7.3.2 NOT运算符与BETWEEN运算符的组合应用 7.4 数学运算符 7.4.1 数学运算符的种类 7.4.2 数学运算符的应用 7.5 集合查询运算符 7.5.1 UNION运算符 7.5.2 INTERSECT运算符 7.6运算符的组合应用 7.6.1 逻辑运算符与IN运算符的组合应用 7.6.2 逻辑运算符与NOT运算符的组合应用 7.6.3 逻辑运算符与数学运算符的组合应用 7.6.4 逻辑运算符与集合运算符的组合应用 7.6.5 数学运算符与NOT运算符的组合应用 7.6.6 数学运算符与IN运算符的组合应用 7.6.7 数学运算符与集合运算符的组合应用 7.7 SQL中的表达式 7.7.1 CAST表达式的应用 7.7.2 CASE表达式的应用 7.8 小结第8章 SQL函数 8.1 SQL函数基础 8.1.1 SQL语句函数 8.1.2 常用的SQL语句函数 8.2 日期函数和数学运算函数 8.2.1 日期时间函数 8.2.2 CONVERT函数转换日期、时间 8.2.3 数据运算函数 8.3 字符串函数 8.3.1 字符串处理函数介绍 8.3.2 字符转换函数 8.3.3 去字符串空格函数 8.3.4 取字符串长度的函数 8.3.5 查询包含部分字符串内容的数据 8.3.6 颠倒字符串的顺序 8.3.7 字符串替换 8.4 聚合函数 8.4.1 聚合函数概述 8.4.2 SUM函数运算 8.4.3 MAX函数运算 8.4.4 MIN函数运算 8.4.5 AVG函数运算 8.4.6 COUNT函数运算 8.4.7 聚合函数的组合使用 8.5 小结第9章 连接查询 9.1 多表连接 9.1.1 多表连接的优点 9.1.2 简单的两表连接 9.1.3 多表连接举例 9.1.4 UNION JOIN连接表 9.2 自连接与自然连接 9.2.1 自连接 9.2.2 自然连接 9.3 内连接 9.3.1 等值连接 9.3.2 不等值连接 9.3.3 使用内连接实现多表连接 9.3.4 在内连接中使用聚合函数 9.4 外连接 9.4.1 左外连接 9.4.2 右外连接 9.4.3 全外连接 9.4.4 在外连接中使用聚合函数 9.5 交叉连接 9.5.l 交叉连接的定义 9.5.2 交叉连接举例 9.6 多表连接的综合应用 9.6.1 内连接与左外连接的综合应用 9.6.2 内连接与右外连接的综合应用 9.6.3 UNION集合运算与多表连接应用 9.7 小结第10章 子查询 10.1 子查询的简单应用 10.1.1 子查询概述 10.1.2 在多表查询中使用子查询 10.1.3 在子查询中使用聚合函数 10.1.4 使用ANY或ALL运算符 10.1.5 使用子查询创建视图 10.2 使用IN语句的子查询 10.2.1 简单的IN语句子查询 10.2.2 使用IN子查询实现集合交运算 lO.2.3 使用IN子查询实现集合差运算 10.3 使用EXISTS语句的子查询 10.3.1 简单的EXISTS语句子查询 10.3.2 使用EXISTS子查询实现两表交集 10.3.3 使用EXISTS子查询实现两表并集 10.3.4 使用NOT EXISTS的子查询 10.4 相关子查询 10.4.1 使用IN引入相关子查询 10.4.2 使用比较运算符引入相关子查询 10.4.3 在HAVING子句中使用相关子查询 10.5 UNIQUE子查询与嵌套子查询 10.5.1 UNIQUE子查询 10.5.2 嵌套子查询 10.6 小结第4篇 T-SQL开发常用操作篇第11章 数据的维护操作 11.1 数据的插入操作 11.1.1 INSERT语句的基本语法 11.1.2 插入单条记录 11.1.3 NULL的插入 11.1.4 由VALUES关键字插入多行数据 11.1.5 使用SELECT语句插入数据 11.1.6 通过视图插入数据 11.1.7 使用子查询插入数据 11.2 数据的更新操作 11.2.1 UPDATE语句的基本语法 11.2.2 使用UPDATE语句更新指定的列值 11.2.3 数据字段中NULL的更改 11.2.4 更新全部数据 11.2.5 利用子查询更新数据 11.2.6 通过视图更新表数据 11.3 数据的删除操作 11.3.1 DELETE语句的语法结构 11.3.2 删除指定行的数据 11.3.3 删除所有数据 11.3.4 通过视图删除表数据 11.3.5 使用子查询删除数据 11.3.6 使用TRUNCATE TABLE语句 11.4 小结第12章 完整性控制 12.1 完整性约束概述 12.1.1 数据的完整性简介 12.1.2 完整性约束的类型 12.1.3 数据完整性的意义 12.2 约束 12.2.1 DEFAULT约束 12.2.2 CHECK约束 12.2.3 PRIMARY KEY约束 12.2.4 UNIQUE约束 12.2.5 FOREIGN KEY约束 12.2.6 NOT NULL约束 12.2.7 列约束和表约束 12.3 规则 12.3.1 创建规则 12.3.2 规则的绑定与松绑 12.4 域约束与断言 12.4.1 域与域约束 12.4.2 利用断言创建多表约束 12.5 默认值 12.5.1 创建默认值 12.5.2 默认值的绑定与松绑 12.6 小结第5篇 T-SQL高级编程篇第13章 存储过程 13.1 存储过程概述 13.1.1 存储过程的基本概念 13.1.2 存储过程的优缺点 13.2 存储过程中常用的流控制语句 13.2.1 IF...LSE语句 13.2.2 BEGIN...END语句 13.2.3 DECLARE语句 13.2.4 GOTO语句 13.2.5 WAITFOR语句 13.2.6 WHILE、BREAK和CONTINUE语句 13.2.7 PRINT语句 13.2.8 RETURN语句 13.2.9 注释 13.3 创建与执行存储过程 13.3.1 创建存储过程 13.3.2 创建带参数的存储过程 13.3.3 创建带0UTPUT返回,参数的存储过程 13.3.4 执行存储过程 13.4 存储过程的查看、修改和删除 13.4.1 系统存储过程 13.4.2 存储过程的查看 13.4.3 存储过程的重命名 13.4.4 修改存储过程 13.4.5 存储过程的删除 13.5 Oracle数据库中的控制流语句 13.5.1 IF条件语句 13.5.2 LOOP循环语句 13.5.3 FOR循环语句 13.5.4 WHILE循环语句 13.5.5 GOTO语句 13.6 Oracle数据库中的存储过程 13.6.1 0racle数据库中创建存储过程 13.6.2 Oracle数据库中存储过程的执行 13.7 小结第14章 触发器 14.1 触发器的基础知识 14.1.1 触发器的概念 14.1.2 触发器的种类 14.1.3 触发器的组成 14.1.4 触发器的优点 14.1.5 触发器执行环境 14.2 触发器的创建 14.2.1 创建触发器的语法结构 14.2.2 Inserted表和Deleted表 14.2.3 INSERT触发器 14.2.4 UPDATE触发器 14.2.5 DELETE触发器 14.2.6 INSTEAD OF触发器 14.2.7 嵌套触发器 14.2.8 递归触发器 14.3 查看触发器 14.3.1 使用系统存储过程sp_help查看触发器 14.3.2 使用系统存储过程sp_helptext查看触发器 14.3.3 使用系统存储过程sp_depengs查看触发器 14.4 触发器的修改及删除 14.4.1触发器的修改 14.4.2触发器的删除 14.5 Oracle数据库中的触发器 14.5.1 Oracle触发器类型 14.5.2 触发器的创建 14.5.3 Oracle触发器的启用与禁用 14.5.4 0racle触发器的删除 14.6 小结第15章 游标 15.1 游标的定义 15.1.1 游标的基本概念 15.1.2 游标的分类 15.1.3 游标的作用及其应用 15.2 游标的使用 15.2.1 游标的创建 15.2.2 打开游标 15.2.3 关闭游标 15.2.4 释放游标 15.2.5 使用游标 15.2.6 检索游标 15.2.7 游标变量 15.3 游标的展使用 15.3.1 用于UJPDATE操作的可更新游标 15.3.2 用于DELETlE操作的可更新游标 15.3.3 可更新游标的综合操作 15.3.4 使用@@CURSOR_ROWS全局变量确定游标的行数 15.3.5 使用@@FETCh_STATJS全局变量检测FETCH操作的状态 15.3.6 使用系统过程管理游标 15.4 Oracle中游标的使用 15.4.1 显式游标与隐式游标 15.4.2 游标属性 15.4.3 参数化游标 15.4.4 游标中的循环 15.5 小结第16章 事务控制和锁定 16.1 事务 16.1.1 事务概述 16.1.2 事务的特性 16.1.3事务的分类 16.2 事务控制 16.2.1 事务控制操作 16.2.2 开始事务 16.2.3 提交事务 16.2.4 回滚事务 16.2.5 设置事务保存点 16.2.6 终止事务 16.3 并发控制 16.3.1 并发操作的问题 16.3.2 事务隔离级别 16.4 锁定 16.4.1 锁的作用及含义 16.4.2 锁的类型 16.4.3 SQL Server中表级锁的使用 16.4.4 设置隔离级别实现并发控制 16.4.5 死锁及其处理 16.5 小结第17章 SQL安全 17.1 SQL安全概述 17.1.1 SQL安全的重要性 17.1.2 SQL安全的对象和权限 17.2 用户管理 17.2.1 创建SQL用户 17.2.2 删除SQL用户 17.3 角色管理 17.3.1 角色的优点 17.3.2 创建角色 17.3.3 删除角色 17.3.4 授予角色 17.3.5 取消角色 17.4 权限管理 17.4.1 授予权限 17.4.2 撤销权限 17.4.3 查询权限控制 17.4.4 插入操作权限控制 17.4.5 删除操作权限控制 17.4.6 更新操作权限控制 17.5 SQL Server中的安全管理 17.5.1 SQL Server中的用户管理 l7.5.2 SQL Server中的角色管理 l7.5.3 SQL Server中的权限管理 17.6 Oracle中的安全管理 17.6.1 Oracle中的用户管理 17.6.2 Oracle中的权限管理 17.7小结第18章 嵌入式SQL 18.1 SQL的调用 18.1.1 直接调用SQL 18.1.2 SQL调用层接口(CLI) 18.2 嵌入式SQL的使用 18.2.1 嵌入式SQL 18.2.2 SQL通信区 18.2.3 主变量 18.2.4 在嵌入式SQL中使用SQL语句 18.2.5 在嵌入式SQL中使用游标 18.3 嵌入式SQL在SQL Server中应用 18.3.1 嵌入式SQL代码 18.3.2 预编译文件 18.3.3 设置连接VC++6.O 18.3.4 编译运行程序 18.4 小结第6篇 T-SQL结合流行语言进行开发篇第19章 C#与SQL Server的开发与应用 19.1 C#开发环境 19.1.1 C#介绍 19.1.2 C#开发环境 19.2 C#连接数据库 19.2.1 C#中的数据库控件介绍 19.2.2 数据库连接举例 19.3 数据查询应用 19.3.1 普通数据查询的实现 19.3.2 连接查询的实现 19.3.3 子查询的实现 19.3.4 复合查询的实现 19.4 运算符与表达式的应用 19.4.1 连接数据表的实现 19.4.2 算术运算符的应用 19.4.3 表达式的应用 19.5 数据维护操作的应用 19.5.1 添加数据的实现 19.5.2 更新数据的实现 19.5.3 删除数据的实现 19.6 触发器与存储过程的应用 19.6.1 在C#中应用触发器 19.6.2 在C#中应用存储过程的示例 19.7 小结第20章 VB.NET与SQL Server的开发与应用 20.1 VB.NET介绍 20.1.1 了解VB.NET 20.1.2 VB.NET的新特点 20.2 VB.NET连接数据库 20.2.1 通过数据控件绑定连接数据库 20.2.2 通过数据对象直接连接数据库 20.3 数据查询应用 20.3.1 普通数据查询的实现 20.3.2 连接查询的实现隐藏全部目录>>

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧