数据库中未更新的数据 - SqlTransaction

时间:2018-01-03 15:53:23

标签: c# sql-server

我正在使用Sqltransation将数据从sourcedt更新为datatable表。 下面两行,首先我将数据从clonedt合并到sourcedt。然后尝试将其更新到数据库表。

SqlConnection con = new SqlConnection(connectionString);
con.Open();
SqlTransaction trans = con.BeginTransaction();
SqlCommand cmd = new SqlCommand(strCommand, con, trans)
SqlDataAdapter da = new SqlDataAdapter(cmd)

SqlCommandBuilder cmb = new SqlCommandBuilder(da);
da.InsertCommand = cmb.GetInsertCommand();
da.UpdateCommand = cmb.GetUpdateCommand();

da.InsertCommand.Transaction = trans;
da.UpdateCommand.Transaction = trans;

da.MissingSchemaAction = MissingSchemaAction.AddWithKey;

da.Fill(sourceDt);

sourceDt.Merge(clonedDt, false, MissingSchemaAction.AddWithKey);
int count = da.Update(sourceDt);
trans.Commit();   //Commit the changes to database

其余的代码很好,问题似乎只在这个提交语句中。我怎么能找到错误的?

1 个答案:

答案 0 :(得分:2)

您需要将sourceDt传递给dataadapter Update方法

da.Update(sourceDt);

我认为你根本不需要交易。但你需要尝试一下。

最好将一次性对象封装在using语句中。这将正确关闭连接并将其资源处理回操作系统。如果未提交,事务也将自动回滚

using(SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();
    using(SqlTransaction trans = con.BeginTransaction())
    using(SqlCommand cmd = new SqlCommand(strCommand, con, trans))
    using(SqlDataAdapter da = new SqlDataAdapter(cmd))
    {
        SqlCommandBuilder cmb = new SqlCommandBuilder(da);
        cmb.GetInsertCommand().Transaction = trans;
        cmb.GetUpdateCommand().Transaction = trans;
        da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
        da.Fill(sourceDt);
        sourceDt.Merge(clonedDt, false, MissingSchemaAction.AddWithKey);
        int count = da.Update(sourceDt);
        trans.Commit();
    }
}