Ошибка с типом переменной 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 шт):
Попробуйте так:
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();
Решение используя приведение типов (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();
Решение используя приведение типов (cast): cmd.Parameters.AddWithValue("@birthday", NpgsqlTypes.NpgsqlDbType.Date).Value = birthday;
Решение работает! Сам промучался пол-дня, после обновления NuGet Npgsql 7.0.6