es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

NPGSQL Copiar Valor Nullable.

Estoy intentando insertar algunos datos en una base de datos Postgres a través de la instrucción Copy.

Esta es parte del código:

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

<pre><code><br />“`c#
foreach (var t in batch)
{
await writer.StartRowAsync();
await writer.WriteAsync(t.NormalLong, NpgsqlDbType.BigInt);
await writer.WriteAsync(t.NullableLong, NpgsqlDbType.Bigint);
}

“`c#

public class SampleClass {
public long NormalLong { get; set; }
public long? NullableLong { get; set; }
}


En el momento de la ejecución, ambos valores en `t` están asignados a algún valor numérico, pero el valor del tipo `long?` siempre resulta en este error: ```c# System.NullReferenceException: Object reference not set to an instance of an object.

¿Existe alguna manera de manejar esto sin cambiar el tipo, ya que a veces necesita ser nulo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes manejar esto utilizando el operador de fusión nula ??. Este operador devuelve el operando de la izquierda si no es nulo, de lo contrario devuelve el operando de la derecha. En este caso, puedes utilizarlo para escribir el valor si no es nulo o escribir DBNull.Value si es nulo.

    Aquí tienes una modificación de ejemplo del código:

    “`c#
    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 ?? DBNull.Value, NpgsqlDbType.Bigint); // línea modificada
    }
    “`

    Con esta modificación, si t.NullableLong no es nulo, su valor se escribirá en la base de datos, de lo contrario se escribirá DBNull.Value, que Postgres puede manejar como nulo.

Comments are closed.