44

Postgres pureでは、整数配列を関数に渡すことができますが、これは.NETデータプロバイダーNpgsqlではサポートされていないことを理解しています。

現在、ストアドプロシージャへの呼び出しをロードし、パラメーターを追加し、スカラーを実行してIDを取得し、オブジェクトにデータを入力するDbCommandがあります。

これは、引数としてn個の整数を取る必要があります。これらは、IDによって新しく作成されたレコードを整数引数にリンクする子レコードを作成するために使用されます。

理想的には、整数ごとにDbCommandで複数のExecuteNonQuery呼び出しを行う必要がないので、データベース側で分割されるパラメーターとしてcsv文字列を作成しようとしています。

私は通常、Db抽象化を味わうLINQ 2 SQLに住んでおり、手動データアクセスを使用してこのプロジェクトに取り組んでいますが、すべてが少し汚れていますが、通常、これらの種類のパラメーターをpostgresに渡すにはどうすればよいですか?

4

4 に答える 4

71

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

非ネイティブ ドライバーでまだ配列を渡すことができない場合は、次のことができます。

  • 配列の文字列表現を渡します (ストアド プロシージャは配列に解析できます。「 」を参照してくださいstring_to_array) 。

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

    それから

    SELECT my_method(:1)
    

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

  • Postgres 自体に依存して文字列から配列にキャストする

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

    それから

    SELECT my_method('{1,2,3,4}')
    
  • バインド変数を使用しないことを選択し、代わりにすべてのパラメーターを綴った明示的なコマンド文字列を発行します (SQL インジェクション攻撃を避けるために、外部からのすべてのパラメーターを検証またはエスケープしてください)。

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

    それから

    SELECT my_method(ARRAY [1,2,3,4])
    
于 2009-02-20T20:54:55.827 に答える
64

これは古い質問だと思いますが、良い解決策を見つけるのに数時間かかり、ここで学んだことを伝えて、他の誰かの手間を省くことができると思いました。たとえば、試してみてください

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

ここで、は次の方法でパラメータに@id_listバインドされますint[]

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

ここで、commandはNpgsqlCommandです(Visual StudioでC#とNpgsqlを使用)。

于 2011-10-11T23:30:12.863 に答える
2

適切にフォーマットされた文字列をいつでも使用できます。コツは整形です。

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

array.Select(value => string.Format("\"{0}\", value))配列が文字列の配列である場合は、または同等のものを使用する必要があることに注意してください。配列からの自動変換がないため、PostgreSQL の列挙型の配列にこのスタイルを使用します。

私の場合、列挙型には 、 、 などの値が'value1'あり'value2''value3'C# 列挙には一致する値があります。私の場合、最終的な SQL クエリは次のよう(E'{"value1","value2"}')になり、これは機能します。

于 2013-09-01T23:36:37.483 に答える