C#更新整个sql表的最佳方法

时间:2018-03-13 22:30:25

标签: c# sql sql-update

我正在努力改进程序。它的作用是使用C#datatable并将其作为批量复制插入到sql表中。我想要实现的是用新值重写整个表,但是如果由于某种原因我在副本上出错,那么表格最后会为空。

如何在批量复制失败时避免删除表?

这是我目前的代码。

using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    SqlBulkCopy bc = new SqlBulkCopy(conn.ConnectionString, SqlBulkCopyOptions.TableLock);
    bc.DestinationTableName = "vehicle";
    bc.BatchSize = vehicleData.Rows.Count;
    SqlCommand cmd = new SqlCommand("DELETE FROM dbo.vehicle");
    cmd.CommandType = CommandType.Text;
    cmd.Connection = conn;
    cmd.ExecuteNonQuery();
    bc.WriteToServer(vehicleData);
    bc.Close();
    conn.Close();
}

1 个答案:

答案 0 :(得分:0)

您可以执行交易中的所有内容:

using (var ts = new TransactionScope())
using (var conn = new SqlConnection(connectionString))
{
    try {
        conn.Open();
        using (var cmd = new SqlCommand("DELETE FROM dbo.vehicle"))
        {
            cmd.CommandType = CommandType.Text;
            cmd.Connection = conn;
            cmd.ExecuteNonQuery();
        }
        using (var bc = new SqlBulkCopy(conn))
        {
            bc.DestinationTableName = "vehicle";
            bc.BatchSize = vehicleData.Rows.Count;
            bc.WriteToServer(vehicleData);
        }
        ts.Complete(); // Commit
    } catch (Exception ex) {
        //TODO: handle exception
    }
}

如果事务中的某些内容失败,则所有内容都将回滚。

请参阅:TransactionScope Class