【发布时间】: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