SQL批量复制 - 插入默认值

时间:2014-02-09 17:06:17

标签: c# .net sql-server sqlbulkcopy

我有一个c#.net应用程序,我需要使用sql bulkcopy将应用程序的默认值插入sql server。

示例:

SqlColumnMapping("src_col1","dest_col1");
SqlColumnMapping("src_col2","dest_col2");

在“dest_col3”中,我想插入默认值。

我如何在app中映射它以及如何在数据库中插入默认值?

由于

2 个答案:

答案 0 :(得分:1)

提示:不要使用SqlBulkCopy - 那件事有很多问题。大多数锁定,默认值也在游戏中。

对临时表使用它;)

这就是我的工作。

  • 使用适当的字段结构创建临时表。如果字段具有默认值,则可以在此处使字段可为空(information_schema可以帮助您找到它)。这个步骤可以自动化 - 100%并且不是那么难。
  • 将SqlBulkCopy导入临时表。没有锁定问题。
  • 之后,您可以运行默认值的更新;)
  • 插入决赛桌。

SqlBulkCopy锁定问题:

  • 锁定桌子。独占。
  • 它不等。它试图立即获得锁定。如果失败则重试。如果表忙,它永远不会获得锁,因为它永远不会等到它得到一个 - 并且每个新请求都是队列结束。

在几年前的ETL情景中,我们受到严重打击。

最重要的是,正如您所发现的那样,您无法使用默认值。

我实际上已经将这些东西完全隔离在一个单独的批量加载器类中,而且我只是在允许这个UPDATE行的过程中(通过从临时表中合并)。

答案 1 :(得分:1)

这是你如何做到的。创建一个与desitination表具有相同结构的DataTable对象,除了删除具有默认值的列。如果在Visual Studio中使用DataSet Designer,则可以从TableAdapter中删除具有默认值的列。

使用名为“connection”的SqlConnection和名为“table”的DataTable对象,您的代码将类似于:

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
    foreach (System.Data.DataColumn c in table.Columns)
    {
        bulkCopy.ColumnMappings.Add(c.ColumnName, c.ColumnName);
    }
    bulkCopy.DestinationTableName = table.TableName;
    bulkCopy.WriteToServer(table);
}

同样,为了使用此方法,您必须确保您的DataTable对象不包含您要使用默认值插入的列。