使用NPGSQL 3.0.5批量复制CSV文件BinaryImporter

时间:2016-04-19 03:09:46

标签: npgsql

我已升级到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一样处理分隔符并将数据插入数据存储区?

1 个答案:

答案 0 :(得分:0)

您无法使用二进制导入程序导入CSV,因为CSV不是二进制:)

二进制导入程序是一种更有效的导入数据的方法,请参阅the Npgsql docs中的示例。如果您绝对必须导入CSV,您仍然可以通过BeginTextImport执行此操作,但您必须自己格式化文本,即放置分隔符等等。请参阅相关文档。