Ошибка с типом переменной C# + PostgreSQL

Кратко введу в курс дела. Есть приложение на С# для работы с БД (PostgreSQl). Есть база данных, в которой есть таблица со списком детей, учащихся в школе:

create table child (
    id_child serial primary key, 
    FIO_child text not null,
    birthday date not null
);

Есть процедура, которая заполняет эту таблицу:

create or replace function insert_child (_fio_child text, _birthday date)
returns void as $$
begin 
    insert into child (fio_child, birthday) 
    values (_fio_child, _birthday);
end;
$$ language plpgsql;

Пытаясь запустить эту функцию через приложение на C# выдаёт ошибку:

процедура insert_child(text, timestamp without time zone) не существует

Функция на С#:

public bool insert_child(string fio_child, DateTime birthday)
{
    bool saved = false;
    using(var cn = GetConnection())
    {
        cn.Open();
        NpgsqlCommand cmd = new NpgsqlCommand("call insert_child (:_fio_child, :_birthday);", cn);
        cmd.Parameters.AddWithValue("_fio_child", DbType.String).Value = fio_child;
        // cmd.Parameters.AddWithValue("_birthday", DbType.DateTime).Value = birthday;
        cmd.Parameters.AddWithValue("_birthday", DbType.Date).Value = birthday;
        cmd.CommandType = CommandType.Text;
        // cn.Open();
        int result = cmd.ExecuteNonQuery();
        saved = result == 1;
    }
    return saved;
}

Как я понял - ошибка тут public bool insert_child(string fio_child, DateTime birthday), но с её исправлением возникают сложности.


Ответы (3 шт):

Автор решения: Alexander Petrov

Попробуйте так:

NpgsqlCommand cmd = new NpgsqlCommand("insert_child", cn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("_fio_child", NpgsqlDbType.Text).Value = fio_child;
cmd.Parameters.Add("_birthday", NpgsqlDbType.Date).Value = birthday;

int result = cmd.ExecuteNonQuery();
→ Ссылка
Автор решения: wesbi

Решение используя приведение типов (cast):

string sql = "select * from insert_child (@fio_child, cast(@birthday as date))";
NpgsqlCommand cmd = new NpgsqlCommand(sql, cn);
cmd.Parameters.AddWithValue("@fio_child", NpgsqlTypes.NpgsqlDbType.Text).Value = fio_child;
cmd.Parameters.AddWithValue("@birthday", NpgsqlTypes.NpgsqlDbType.Date).Value = birthday;

int result = cmd.ExecuteNonQuery();
→ Ссылка
Автор решения: Nova Ro

Решение используя приведение типов (cast): cmd.Parameters.AddWithValue("@birthday", NpgsqlTypes.NpgsqlDbType.Date).Value = birthday;

Решение работает! Сам промучался пол-дня, после обновления NuGet Npgsql 7.0.6

→ Ссылка