gpt4 book ai didi

c# - 如何为 BULK INSERT 命令准备数据

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:19 25 4
gpt4 key购买 nike

我正在尝试将给定 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 期间有时会出现错误:“意外的文件结尾”。它不会发生在每一行或每个表上。

我希望能够无误地处理任何类型的列和任何类型的数据。

最佳答案

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

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

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

关于c# - 如何为 BULK INSERT 命令准备数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18621451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com