Start Debugging
2023-09-01 Actualizado 2023-11-05 sqlite Edit on GitHub

SQLite-net No parameterless constructor defined for this object en ExecuteQuery

Cómo arreglar el error 'no parameterless constructor defined' en SQLite-net al usar ExecuteQuery con tipos primitivos como string o int.

Lo más probable es que estés intentando recuperar una sola columna de una tabla de tu base de datos pasando algo similar a SELECT <column_name> FROM <table_name> a ExecuteQuery<string> o ExecuteQuery<int>.

El problema es que ExecuteQuery<string> espera un tipo con un constructor sin parámetros, y string no cumple ese requisito.

Hay dos soluciones posibles:

Solución 1: usa el tipo de la tabla

Deja tu consulta SQL tal cual, seleccionando una sola columna, pero al llamar a ExecuteQuery asegúrate de proporcionar el tipo asociado a tu tabla. No te preocupes demasiado por el rendimiento de la consulta en este caso: solo se recuperará y rellenará en tus objetos esa columna específica; el resto de propiedades se ignorará.

Después, puedes usar LINQ para seleccionar tu string.

cmd.ExecuteQuery<MyTableType>().Select(t => t.MyColumnName).ToArray();

Solución 2: usa un DTO específico para tu consulta

Si no te gusta usar el tipo asociado a la tabla, siempre puedes definir un DTO personalizado para esta consulta concreta y usarlo en su lugar. Recuerda que debe tener un constructor público sin parámetros.

public class MyQueryDto
{
    public string MyColumnName { get; set; }
}

Y luego pásalo al método ExecuteQuery y, opcionalmente, selecciona tu columna en un array de strings después.

cmd.ExecuteQuery<MyQueryDto>().Select(t => t.MyColumnName).ToArray();

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Volver