我在这里不包含任何代码,因为在过去的几天里我已经重写了很多次它真的不值得再打扰了,所以我将用通用术语解释我的问题。
我有一个用 C# 编写并连接到 sql server 数据库的 winforms 应用程序。在我的应用程序的某些部分,我可以在数据库中的许多表上运行多达 10 个 SQL 命令,并且我需要将它们包含在单个事务中,因为这是一个“全有或全无”的情况。如果 10 个命令中的任何一个失败,我不希望提交任何命令。
复杂的因素包括:
- 10条sql命令中的每一条都有多个参数
- 一些 sqlcommands 使用 INSERT,我需要在后续的一些 sqlcommands 中使用服务器生成的身份。
- 一些命令对相同的数据进行操作,即早期的命令可能会在数据库中插入一个新项目,而后面的 sql 命令之一将尝试更新该相同的条目。
任何帮助都将不胜感激,因为我已经在这个问题上花费了一周的大部分时间,并且感觉进展相对较小。
编辑:
sqlcommands 最初是在不同的类等中,但是我认为这可能是问题,所以我做了一个很大的重写,现在所有的 sqlcommands 都在同一个方法中,尽管一些 sqlcommands 写在别处并传递回主要方法。
目前的问题是,第一个命令 (INSERT) 已执行,但事务在第二个命令处失败,因为该命令试图引用在第一个命令中创建的数据库条目。
此外,我不能使用 TransactionScope,因为网络上的 MSDTC 会导致其他问题,因此我需要使用我的应用程序和 ADO.NET 来处理这个问题。
编辑(一些代码)
这里只是事务中的前两个 sql 命令:
string connectionString = aSystem.ConnectionString;
using (SqlConnection linkToDB = new SqlConnection(connectionString))
{
linkToDB.Open();
using (SqlTransaction transaction = linkToDB.BeginTransaction())
{
try
{
//...Case...//
cCase c = new cCase();
c.CaseType = cboCaseType.Text;
c.Occupation = txtOccupation.Text;
c.DateInstructed = txtDateInst.Text;
c.Status = "Live";
SqlCommand sqlSaveCase = c.SaveSqlCom();
sqlSaveCase.Connection = linkToDB;
sqlSaveCase.Transaction = transaction;
c.SetCaseNo = sqlSaveCase.ExecuteNonQuery().ToString();
//...IP Link...//
string strIPID = cboIPAddress.SelectedValue.ToString();
SqlCommand sqlNewIPLink = cIPID.NewIPLinkSqlCom(strIPID,c.CaseNo,txtIPRef.Text);
sqlNewIPLink.Connection = linkToDB;
sqlNewIPLink.Transaction = transaction;
sqlNewIPLink.ExecuteNonQuery(); //...fails here...//
//...an additional 8 sql commands follow...//
问题
sqlSaveCase 命令在 tblCases 上插入一个新案例,但是当第二个命令 sqlNewIPLink 尝试使用第一个命令创建的标识时,它会生成一个外键错误,就好像它没有从第一个命令中看到新创建的案例一样。