SQLDataAdapter.Update如何检查数据库密钥是否被违反?

时间:2015-04-09 14:39:36

标签: c# ado.net .net-3.5 dataset sqldataadapter

尝试向数据库添加一个实体,需要更新几个表(主实体表,关系表,状态表等),如果这4个表更新中的一个失败,我需要回滚其他表。我使用的遗留代码决定使用SQLDataAdapters,所以我决定使用这些的事务功能并大致遵循this answer(但有4个数据集而不是1个)

事务中的第一个数据集更新没有例外,但是当它达到第二个时它表示它违反了第一个不存在的密钥。当第一次更新似乎已经通过时,为什么会违反密钥?以下是我正在做的事情的粗略近似。谢谢!

public bool CreateEntity(Dataset ds1, Dataset ds2, Dataset ds3, Dataset ds4)
{
    conn.Open();
    var trans = conn.BeginTransaction();
    dataAdapter1.UpdateCommand.Transaction = trans;
    dataAdapter1.InsertCommand.Transaction = trans;
    dataAdapter1.DeleteCommand.Transaction = trans;

    dataAdapter2.UpdateCommand.Transaction = trans;
    dataAdapter2.InsertCommand.Transaction = trans;
    dataAdapter2.DeleteCommand.Transaction = trans;

    dataAdapter3.UpdateCommand.Transaction = trans;
    dataAdapter3.InsertCommand.Transaction = trans;
    dataAdapter3.DeleteCommand.Transaction = trans;

    dataAdapter4.UpdateCommand.Transaction = trans;
    dataAdapter4.InsertCommand.Transaction = trans;
    dataAdapter4.DeleteCommand.Transaction = trans;

    try
    {
        dataAdapter1.Update(ds1); // Succeeds
        dataAdapter2.Update(ds2); // Exception occurs here
        dataAdapter3.Update(ds3);
        dataAdapter4.Update(ds4);
        trans.Commit();
    }
    catch (Exception ex)
    {
        trans.Rollback();
        conn.Close();
        return false;
    }

    conn.Close();
    return true;
}

1 个答案:

答案 0 :(得分:0)

确实如此。 ds1中的插入分配ID,并将其传递回ds1成员。但是,ds2元素仍然为零,并且FK更新失败,因为ds1表中没有匹配的0 pk。

您需要在更新后检查ds1是否有任何插入,并获取新分配的ID' s;然后将它们放入适当的ds2元素并更新ds2。所有有点长的啰嗦。

如果您有时间使用不使用DataAdaptors的实体框架(而不是直接使用),并且EF模型会为您处理所有这些内容,那么您可以更好。