【问题标题】:NPGSQL Copy nullable ValueNPGSQL 复制可为空的值
【发布时间】:2022-01-22 15:33:54
【问题描述】:

我正在尝试通过 Copy-Statement 将一些数据插入 Postgres 数据库。

这是代码的一部分:

            await using var writer =
                await connection.BeginBinaryImportAsync(
                    "COPY \"SomeTable\" (\"NormalLong\", \"NullableLong\") FROM STDIN (FORMAT BINARY)");

            foreach (var t in batch)
            {
                await writer.StartRowAsync();
                await writer.WriteAsync(t.NormalLong, NpgsqlDbType.BigInt);
                await writer.WriteAsync(t.NullableLong, NpgsqlDbType.Bigint);
            }
public class SampleClass {
  public long NormalLong { get; set; }
  public long? NullableLong { get; set; }
}

在执行时,t 上的两个值都设置为某个数值,但类型为 long? 的值总是会导致此错误:

System.NullReferenceException: Object reference not set to an instance of an object.

有没有办法在不改变类型的情况下处理这个问题,因为它有时需要为空?

【问题讨论】:

  • 试试这个:await writer.WriteAsync((object) t.NullableLong ?? DBNull.Value, NpgsqlDbType.Bigint);

标签: c# postgresql npgsql


【解决方案1】:

试试这个

public static void WriteNullable<T>(this NpgsqlBinaryImporter writer, T? obj, NpgsqlDbType type)
    where T : class
{
    if (obj is null)
    {
        writer.WriteNull();
    }
    else
    {
        writer.Write(obj, type);
    }
}

public static void WriteNullable<T>(this NpgsqlBinaryImporter writer, T? obj, NpgsqlDbType type)
    where T : struct
{
    if (obj.HasValue)
    {
        writer.Write(obj.Value, type);
    }
    else
    {
        writer.WriteNull();
    }
}

使用

NpgsqlBinaryImporter writer = ...;
writer.WriteNullable("some text", NpgsqlDbType.Text);
long? value1 = 12;
long? value2 = null;
writer.WriteNullable(value1, NpgsqlDbType.Bigint);
writer.WriteNullable(value2, NpgsqlDbType.Bigint);

您也可以将其调整为 async/await。
适用于 .NET5

【讨论】:

    【解决方案2】:

    虽然CKK 提供的解决方案有效,但它会导致我的 IDE 中出现警告,这没关系。

    我采用了另一种解决方案并编写了一个帮助类,其中包含我需要的每种数据类型的以下代码:

        public static async Task WriteAsync(NpgsqlBinaryImporter writer, long value, NpgsqlDbType type)
        {
            await writer.WriteAsync(value, type);
        }
    
        public static async Task WriteAsync(NpgsqlBinaryImporter writer, long? value, NpgsqlDbType type)
        {
            if (value.HasValue) await writer.WriteAsync(value.Value, type);
            else await writer.WriteNullAsync();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2012-12-10
      • 2015-04-01
      • 2019-06-11
      相关资源
      最近更新 更多