使用c#在数据库中插入记录时使用事务
本文关键字:事务 记录 插入 数据库 使用 | 更新日期: 2023-09-27 17:52:17
我从来没有使用过SQL事务,在我的情况下,我知道我确实必须使用它们。我的应用程序的功能之一,是将Excel文件转换为数据库。
所以我从Excel中获取值,用参数(要发送给SP)构建字符串数组,我将直接在主表中插入一些值,而我将在次表中插入其他值,然后我将获得id,谁将在主表中取代这些值。我想说的是,我有外键,这就是我这样做的原因。
所以我认为我做得很好,但没有交易。但是,当我在表中插入值时,如果出现任何问题,我将不得不进行回滚。
所以在这个过程中,我使用了5个存储过程,每个表一个。这些SP并不是这个过程所独有的。它们将在应用程序中用于插入记录。
但是我需要帮助在哪里使用事务。我应该在c#(应用程序端)或在SQL Server(服务器端)?
现在我正在使用c#中的SqlTransaction对象,它以某种方式工作,因为如果我做回滚,他真的取消了所有的插入,但是我在事务中使用的ID不再可用了。只有当我删除所有的表并重新创建它们时,这些ID才会再次可用。
所以我认为我没有很好地使用事务,这就是为什么我需要帮助,知道如何以及在哪里更好地使用事务。
我认为你使用事务的方式是正确的,问题是IDENTITY列的种子没有回滚。
我猜你用的是MS SQL Server?要重置IDENTITY列而不重新创建表,可以使用DBCC CHECKIDENT。
DBCC CHECKIDENT (table_name, RESEED, 99);
这将重置种子,使下一个分配的标识值为100。当然,您必须在BEGIN TRANSACTION之前记录表的最高标识值。
我只会在只有一个写进程的情况下使用它。在多个写入器的情况下,除非您先执行一些严格的表锁定,否则很可能会导致事情发生BOOM。在多个写入器的情况下,我认为您最好编写其余的代码,因此身份列值中的"漏洞"是可以接受的。
如果您不将Identity列用于其他目的,并且不绝对要求它是连续的,请尝试习惯它将具有"缺失"值的想法。它们并没有真正丢失,因为它们只是为每个记录提供了一种廉价的唯一键。当记录被删除时,也会出现空白,因此也不应该依赖Identity列作为记录计数器。
当我们查看表时,看到连续的数字对我们的大脑来说是很好的,但代价是您自己和数据库引擎的额外工作。我花了好几个月才接受。
该值不被重用的原因是,当该列被用作外键时,可以帮助提供数据库完整性。