使用 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 来导入,但您必须自己格式化文本,即放置分隔符等。也请参阅文档。