Tablice liczb całkowitych Postgres jako parametry?

Rozumiem, że w Postgres pure można przekazać tablicę liczb całkowitych do funkcji, ale nie jest to obsługiwane przez dostawcę danych.NET Npgsql.

Obecnie mam polecenie DbCommand, do którego Ładuję wywołanie do przechowywanego proc, dodaję parametr i wykonuję Skalar, aby odzyskać Id do wypełnienia obiektu.

To teraz musi przyjąć n liczb całkowitych jako argumenty. Są one używane do tworzenia rekordów potomnych łączących nowo utworzony rekord o jego id z liczbą całkowitą argumenty.

Najlepiej byłoby, gdybym nie musiał wykonywać wielu wywołań ExecuteNonQuery w moim DbCommand dla każdej z liczb całkowitych, więc mam zamiar zbudować ciąg csv jako parametr, który zostanie podzielony po stronie bazy danych.

Normalnie mieszkam w LINQ 2 SQL delektując się abstrakcją Db, pracując nad tym projektem z ręcznym dostępem do danych to wszystko robi się trochę brudne, jak ludzie zwykle idą o przekazywanie tego typu parametrów do postgres?

Author: brichins, 2009-02-20

3 answers

Zobacz: http://www.postgresql.org/docs/9.1/static/arrays.html

Jeśli twój Nie natywny sterownik nadal nie pozwala na przekazywanie tablic, możesz:

  • Przekazać ciąg znaków tablicy (którą Twoja procedura składowana może następnie przetworzyć do tablicy -- patrz string_to_array)

    CREATE FUNCTION my_method(TEXT) RETURNS VOID AS $$ 
    DECLARE
           ids INT[];
    BEGIN
           ids = string_to_array($1,',');
           ...
    END $$ LANGUAGE plpgsql;
    

    Then

    SELECT my_method(:1)
    

    Z :1 = '1,2,3,4'

  • Polegaj na samym Postgresie, aby rzucić ze Sznurka na array

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;
    

    Then

    SELECT my_method('{1,2,3,4}')
    
  • Wybierz, aby nie używać zmiennych bind i zamiast tego wydaj jawny ciąg poleceń ze wszystkimi parametrami (upewnij się, że walidujesz lub unikasz wszystkich parametrów pochodzących z zewnątrz, aby uniknąć ataków SQL injection.)

    CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
           ...
    END $$ LANGUAGE plpgsql;
    

    Then

    SELECT my_method(ARRAY [1,2,3,4])
    
 42
Author: vladr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 18:04:04

Zdaję sobie sprawę, że to stare pytanie, ale znalezienie dobrego rozwiązania Zajęło mi kilka godzin i pomyślałem, że przekażę to, czego się nauczyłem tutaj i zaoszczędzę komuś kłopotu. Spróbuj, na przykład,

SELECT * FROM some_table WHERE id_column = ANY(@id_list)

Gdzie @id_list jest powiązane z parametrem int[] za pomocą

command.Parameters.Add("@id_list", NpgsqlDbType.Array | NpgsqlDbType.Integer).Value = my_id_list;

Gdzie polecenie jest poleceniem Npgsql (używając C# i Npgsql w Visual Studio).

 44
Author: brichins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 23:30:12

Możesz Zawsze używać odpowiednio sformatowanego ciągu znaków. Sztuczka polega na formatowaniu.

command.Parameters.Add("@array_parameter", string.Format("{{{0}}}", string.Join(",", array));

Zauważ, że jeśli tablica jest tablicą łańcuchów, musisz użyć tablicy.Select (value = > string.Format("\"{0}\", wartość)) lub równoważny. Używam tego stylu dla tablicy typu enumerated w PostgreSQL, ponieważ nie ma automatycznej konwersji z tablicy.

W moim przypadku, mój typ wyliczeniowy ma pewne wartości, takie jak 'value1', 'value2', 'value3' i mój C# wyliczenie ma pasujące wartości. W moim przypadku ostateczne zapytanie SQL kończy się wyglądem jak (e ' {"value1", "value2"}') i to działa.

 1
Author: user2738265,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 23:36:37