Передача массива в функцию 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;
→ Ссылка