如何为BULK INSERT命令准备数据

时间:2013-09-04 18:44:00

标签: c# sql sql-server bulkinsert

我正在尝试将给定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期间有时会收到错误:“意外的文件结束”。每行或每个表都不会发生这种情况。

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

1 个答案:

答案 0 :(得分:1)

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

我的特殊问题是,在编写文件之后,我并不总是使用FileStream.Close或Dispose方法正常关闭FileStreams。这导致文件的结束字节有些损坏,数据尚未刷新到磁盘。

使用SQL BULK INSERT命令中的LASTROW参数,我可以成功地将每个文件中的所有内容导入到已损坏的行。正确关闭我的FileStream将确保不再发生这种情况。