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

C# 数据库中的数据未更新-SqlTransaction,c#,sql-server,C#,Sql Server,我正在使用SQLTransaction将数据从sourcedt更新到datatable。 下面两行,首先我将数据从clonedt合并到sourcedt。然后尝试将其更新到数据库表 SqlConnection con = new SqlConnection(connectionString); con.Open(); SqlTransaction trans = con.BeginTransaction(); SqlCommand cmd = new SqlCommand(strCommand,

我正在使用SQLTransaction将数据从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

代码的其余部分还可以,问题似乎只出现在这个commit语句中。我该如何发现哪里出了问题

您需要将sourceDt传递给dataadapter更新方法

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();
    }
}

您需要将sourceDt传递给dataadapter更新方法

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();
    }
}

更改DataTable不会更新数据库中的任何内容。您正在更新内存中的对象。您需要一个DbDataAdapter或逐行执行DbCommand。您好steve,我已经更新了帖子,因此您将了解更多关于我如何尝试更新数据库表的信息。使用语句将有助于完成此代码。否则,更改DataTable不会更新数据库中的任何内容,这是一个有很好文档记录的问题。您正在更新内存中的对象。您需要一个DbDataAdapter或逐行执行DbCommand。您好steve,我已经更新了帖子,因此您将了解更多关于我如何尝试更新数据库表的信息。使用语句将有助于完成此代码。否则,这是一个记录良好的问题,兄弟,我已经尝试过,没有工作。你能帮我更正代码吗。。意味着摆脱反式。我认为它基本上是用于回滚的。什么不起作用?现在让我们跳过事务问题。如果Update方法无法更新数据库表,则可能是由于DataTable对象中的行的所有RowState都未更改所致。你在cloneDt表上调用了AcceptChanges吗?不,我没有在cloneDt上调用AcceptChanges。我认为即使是update()也可以正常工作,因为int count=da.update(sourceDt);。。。我的计数是9。表示更新/影响了9行。嗯,这会更改点。如何检查是否没有更新任何内容?你在连接字符串中使用了| DataDirectory |吗?兄弟,我已经试过了,没用。你能帮我更正代码吗。。意味着摆脱反式。我认为它基本上是用于回滚的。什么不起作用?现在让我们跳过事务问题。如果Update方法无法更新数据库表,则可能是由于DataTable对象中的行的所有RowState都未更改所致。你在cloneDt表上调用了AcceptChanges吗?不,我没有在cloneDt上调用AcceptChanges。我认为即使是update()也可以正常工作,因为int count=da.update(sourceDt);。。。我的计数是9。表示更新/影响了9行。嗯,这会更改点。如何检查是否没有更新任何内容?您是否在连接字符串中使用了| DataDirectory |?