Передача массива в функцию postgreSQL, используя npgsql C#
Написал вот такую функцию:
CREATE FUNCTION "FILM"."Films_Actors_Insert"
(
"FilmID" INT,
"ActorIDs" INT[]
)RETURNS VOID AS
$$
DECLARE
actorsIds_length INT := array_length("ActorIDs", 1);
index INT := 0;
BEGIN
WHILE index < actorsIds_length LOOP
INSERT INTO "FILM"."Films_Actors" VALUES ($1, $2[index]);
index = index + 1;
END LOOP;
END
$$
LANGUAGE plpgsql;
Использую её вот так:
public void Insert(Models.FilmActor filmActor)
{
NpgsqlConnection conn = new NpgsqlConnection(_connectionString);
conn.Open();
var parameters = GetParamterFromFilmActorModel(filmActor);
using (var cmd = new NpgsqlCommand("\"FILM\".\"Films_Actors_Insert\"", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (var item in parameters)
{
cmd.Parameters.AddWithValue(item.ParameterName, item.Value);
}
cmd.ExecuteNonQuery();
conn.Close();
}
}
private List<NpgsqlParameter> GetParamterFromFilmActorModel(Models.FilmActor filmActor)
{
var parameters = new List<NpgsqlParameter>();
if (filmActor == null) return parameters;
if (filmActor.FilmID >= 0) parameters.Add(new NpgsqlParameter("FilmID", filmActor.FilmID));
if (filmActor.ActorsIDs !=null) parameters.Add(new NpgsqlParameter("ActorIDs", filmActor.ActorsIDs));
return parameters;
}
Но при выполнении
cmd.ExecuteNonQuery()
Вылетает с ошибкой:
23502: null value in column "ActorID" of relation "Films_Actors" violates not-null constraint
Как я понимаю, я не верно передаю массив в мою функцию, так как при отладке, массив
filmActor.ActorsIDs
не пуст, в нём есть переданные мной айдишники. Вопрос: как правильно передать такой массив в функцию PostgreSQL?
Ответы (1 шт):
Автор решения: Alexander Pavlov
→ Ссылка
У тебя странная функция, которая обращается к $1 и $2.
Да и вообще с циклом
Правильно было бы примерно так
CREATE FUNCTION "FILM"."Films_Actors_Insert"
(
"FilmID" INT,
"ActorIDs" INT[]
)RETURNS VOID AS
$$
BEGIN
insert into "FILM"."Films_Actors"
select "FilmID", unnest("ActorIDs")
END
$$
LANGUAGE plpgsql;