使用 NPGSQL 3.0.5 BinaryImporter 批量复制 CSV 文件
Bulk copy CSV files using NPGSQL 3.0.5 BinaryImporter
我已经升级到 NPGSQL 3.0.5 并意识到 NpgsqlCopyIn 不再可用。使用旧版本,我可以使用 NpgsqlCopyIn 处理 CSV 文件,这对于批量复制大量数据来说非常快速和高效。我用了
var copystr = "COPY tablename (col1,col2,etc) FROM 'csv file' STDIN WITH DELIMITER ',' CSV HEADER" ;
NpgsqlCommand dbCommand = new NpgsqlCommand(copyStr, _DataStoreConnection);
NpgsqlCopyIn copyIn = new NpgsqlCopyIn(dbCommand, _DataStoreConnection, stream);
copyIn.Start();
但是对于 3.0 版本,我无法通过让二进制导入程序将数据为 CSV 来找到批量复制的方法。相反,我使用下面的代码
StreamReader streamReader = null;
try {
streamReader = new StreamReader(fileStream);
{
var copyStr = string.Format("COPY {0} ({1}) FROM STDIN (FORMAT BINARY)", _DataStoreName, string.Join(",", _DataStoreColumns.Select(a => a.ToLower())));
if (_DataStoreConnection.State == ConnectionState.Closed)
_DataStoreConnection.Open();
string csvLine = string.Empty;
while ((csvLine = streamReader.ReadLine()) != null)
{
if (lineCount > 0)
{
using (var importWriter = _DataStoreConnection.BeginBinaryImport(copyStr))
{
importWriter.WriteRow(csvLine.Split(','));
}
}
else
{
lineCount++; //This is to skip the first line from the CSV file. First line will be header, so skip it.
}
}
}
}
有没有一种方法可以让 BinaryImporter 指定输入数据为 CSV,以便它处理定界符并将数据插入数据存储区,就像在 NpgSqlCopyIn 中一样?
您不能使用二进制导入器导入 CSV,因为 CSV 不是二进制:)
二进制导入器是一种更有效的数据导入方式,请参阅 the Npgsql docs 中的示例。如果您绝对必须导入 CSV,您仍然可以通过 BeginTextImport
来导入,但您必须自己格式化文本,即放置分隔符等。也请参阅文档。
我已经升级到 NPGSQL 3.0.5 并意识到 NpgsqlCopyIn 不再可用。使用旧版本,我可以使用 NpgsqlCopyIn 处理 CSV 文件,这对于批量复制大量数据来说非常快速和高效。我用了
var copystr = "COPY tablename (col1,col2,etc) FROM 'csv file' STDIN WITH DELIMITER ',' CSV HEADER" ;
NpgsqlCommand dbCommand = new NpgsqlCommand(copyStr, _DataStoreConnection);
NpgsqlCopyIn copyIn = new NpgsqlCopyIn(dbCommand, _DataStoreConnection, stream);
copyIn.Start();
但是对于 3.0 版本,我无法通过让二进制导入程序将数据为 CSV 来找到批量复制的方法。相反,我使用下面的代码
StreamReader streamReader = null;
try {
streamReader = new StreamReader(fileStream);
{
var copyStr = string.Format("COPY {0} ({1}) FROM STDIN (FORMAT BINARY)", _DataStoreName, string.Join(",", _DataStoreColumns.Select(a => a.ToLower())));
if (_DataStoreConnection.State == ConnectionState.Closed)
_DataStoreConnection.Open();
string csvLine = string.Empty;
while ((csvLine = streamReader.ReadLine()) != null)
{
if (lineCount > 0)
{
using (var importWriter = _DataStoreConnection.BeginBinaryImport(copyStr))
{
importWriter.WriteRow(csvLine.Split(','));
}
}
else
{
lineCount++; //This is to skip the first line from the CSV file. First line will be header, so skip it.
}
}
}
}
有没有一种方法可以让 BinaryImporter 指定输入数据为 CSV,以便它处理定界符并将数据插入数据存储区,就像在 NpgSqlCopyIn 中一样?
您不能使用二进制导入器导入 CSV,因为 CSV 不是二进制:)
二进制导入器是一种更有效的数据导入方式,请参阅 the Npgsql docs 中的示例。如果您绝对必须导入 CSV,您仍然可以通过 BeginTextImport
来导入,但您必须自己格式化文本,即放置分隔符等。也请参阅文档。