【问题标题】:How to prepare data for a BULK INSERT command如何为 BULK INSERT 命令准备数据
【发布时间】:2013-09-04 18:44:00
【问题描述】:

我正在尝试将给定 SQL 数据库表的所有字段动态写入一个文件,以便稍后用作 BULK INSERT 命令的源文件。

我正在使用 SqlDataReader 来读取将值存储为对象的每个字段。根据对象的类型,我将值写入文件。这是我目前使用的代码:

StreamWriter writer = new StreamWriter(filePath, false, Encoding.GetEncoding("iso-8859-1");

foreach (var fields in rows)
{
    foreach (object val in fields)
    {
        if (val != DBNull.Value)
        {
            if (val is bool)
                writer.Write((bool)val ? 1 : 0);
            else if (val is byte[])
                writer.Write(BitConverter.ToString((byte[])val).Replace("-", ""));
            else if (val is DateTime)
                writer.Write(string.Format("{0} {1}", ((DateTime)val).ToString("yyyy-MM-dd"), ((DateTime)val).ToString("HH:mm:ss:fff")));
            else if (val is string)
                writer.Write(((string)val).Replace("\0", string.Empty));
            else
                writer.Write(val);
        }

        // Field terminator
        writer.Write('\0');
    }
}

稍后,我运行 BULK INSERT 命令如下:

BULK INSERT tableName
FROM 'c:\fileName'
WITH (
   FIELDTERMINATOR = '\0'
   ROWTERMINATOR = '\0'
   KEEPNULLS
);

我遇到的问题是有时在 BULK INSERT 期间出现错误:“文件意外结束”。并非每行或每张表都会发生这种情况。

我希望能够处理任何类型的列和任何类型的数据而不会出错。

【问题讨论】:

  • 到底如何\0 既是字段终止符又是行终止符? SQL Server 如何知道它是到达字段的末尾还是行的末尾?我怀疑你希望那些不同,例如使用逗号作为字段终止符,使用 \r\n 作为行终止符。
  • 由于我正在读取和写入所有列,MSSQL 足够聪明,可以知道在第 n 列之后行已经结束,下一行开始。这就是为什么我不手动编写行终止符的原因......如果我这样做了,我会收到一个错误,说意外的空值。
  • 我想通了,这是一个与上面的代码无关的单独问题。我的问题中的代码非常适合分布在数十个不同表中的超过 30GB 的数据。

标签: c# sql sql-server bulkinsert


【解决方案1】:

我解决了这个问题。我上面的代码没有问题。但我将把我的问题留在这里供其他人使用,因为我在任何谷歌搜索中都找不到等效的解决方案。

我的特殊问题是,在写入文件后,我并不总是使用 FileStream.Close 或 Dispose 方法优雅地关闭 FileStreams。这会导致数据尚未刷新到磁盘的文件的结束字节出现一些损坏。

在 SQL BULK INSERT 命令中使用 LASTROW 参数使我能够成功地将每个文件中的所有内容导入到损坏的行。并且正确关闭我的 FileStreams 将确保这种情况不会再次发生。

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多