Npgsql二进制副本中的外部“数字”值错误登录无效

时间:2019-07-15 04:39:49

标签: npgsql

在使用Npgsql二进制副本时出现此错误(请参阅底部的实现):

invalid sign in external "numeric" value

失败的RetailCost列具有以下PostgreSQL属性:

  • 类型:数字(19,2)
  • 可为空:不能为空
  • 存储:主要
  • 默认:0.00

PostgreSQL日志如下:

2019-07-15 13:24:05.131 ACST [17856] ERROR:  invalid sign in external "numeric" value
2019-07-15 13:24:05.131 ACST [17856] CONTEXT:  COPY products_temp, line 1, column RetailCost
2019-07-15 13:24:05.131 ACST [17856] STATEMENT:  copy products_temp (...) from stdin (format binary)

我认为这无关紧要,但是RetailCost值只有零个或正数(没有负数或空值)

我的实现如下:

using (var importer = conn.BeginBinaryImport($"copy {tempTableName} ({dataColumns}) from stdin (format binary)"))
{
    foreach (var product in products)
    {
        importer.StartRow();
        importer.Write(product.ManufacturerNumber, NpgsqlDbType.Text);
        if (product.LastCostDateTime == null)
            importer.WriteNull();
        else
            importer.Write((DateTime)product.LastCostDateTime, NpgsqlDbType.Timestamp); 
        importer.Write(product.LastCost, NpgsqlDbType.Numeric);
        importer.Write(product.AverageCost, NpgsqlDbType.Numeric);
        importer.Write(product.RetailCost, NpgsqlDbType.Numeric);
        if (product.TaxPercent == null)
            importer.WriteNull();
        else
            importer.Write((decimal)product.TaxPercent, NpgsqlDbType.Numeric); 
        importer.Write(product.Active, NpgsqlDbType.Boolean);
        importer.Write(product.NumberInStock, NpgsqlDbType.Bigint);
    }
    importer.Complete();
}

任何建议都会受到欢迎

2 个答案:

答案 0 :(得分:0)

问题的原因是importer.Write语句与dataColumns的顺序不同

答案 1 :(得分:0)

我在使用 MapBigInt 时导致了这个问题,没有意识到列是意外的数字 (18)。将列更改为 bigint 解决了我的问题。