我已升级到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.
}
}
}
}
有没有办法可以指定输入数据为CSV的BinaryImporter,以便它像NpgSqlCopyIn一样处理分隔符并将数据插入数据存储区?
答案 0 :(得分:0)
您无法使用二进制导入程序导入CSV,因为CSV不是二进制:)
二进制导入程序是一种更有效的导入数据的方法,请参阅the Npgsql docs中的示例。如果您绝对必须导入CSV,您仍然可以通过BeginTextImport
执行此操作,但您必须自己格式化文本,即放置分隔符等等。请参阅相关文档。