2012-01-12 3 views
1

Npgsqlを使用してPostgreSQL関数の引数としてキーと値のペアの配列を渡したいとします。私は、次のタイプが定義されている:私はNpgsqlのを使用してストアドプロシージャにIDictionary<string, string>オブジェクトからデータを渡す方法カスタムデータ型をパラメータとしてNpgsqlに提供するにはどうすればいいですか?

create or replace function persist_profile(
    _user_id integer, 
    _key_value_pairs key_value_pair[] 
    ) returns boolean as $$ 
begin; 

... 

return true; 
end; 
$$ language plpgsql; 

drop type if exists key_value_pair 
create type key_value_pair as (
    k varchar(250), 
    v text 
    ); 

が、私はそうのような関数を書きたいですか?これはサポートされていますか?私はオンラインで参考文献を見つけることができません。

ありがとうございます!

答えて

4

Jeremy!

残念ながら、Npgsqlはまだカスタムデータ型をサポートしていません。私はそれをサポートするつもりです。

これは、Npgsqlにタイプコンバータの「登録」を追加することを意味します。このようにして、アプリケーションはカスタムタイプのコンバータを登録し、Npgsqlはそれを使ってデータを前後に送信します。 project.npgsql.org:私たちのプロジェクトサイトでそれについての機能要求を追加し、cvs.npgsql.org

上のNpgsql/srcに/ NpgsqlTypes/NpgsqlTypeConverters.csてください:

詳細はで取得することができます。

ありがとうございます。

+0

リンクが壊れている/私のために働いていないようです。 –

+0

時にはpgfoundryにいくつか問題が発生することがあります。もう一度やり直してください。うまくいくはずです。私は今ここでそれをテストしました。それは大丈夫でした。 –

+0

Npgsqlコードはgithub:github.com/npgsql/Npgsqlにあります。 –

0

IDictionaryを2次元配列に変換し、この配列をNpgsql経由でストアドプロシージャに渡します。Npgsql supports配列をパラメータとして使用します。このように変換:

   string[][] columnsArray = new string[2][]; 
       Dictionary<string, string> fields = ... 
       columnsArray[0] = fields.Keys.ToArray(); 
       columnsArray[1] = fields.Values.ToArray(); 
0

ユーザー定義オブジェクトタイプはまだサポートされていないようです。別の方法は、オブジェクトをXMLにシリアル化し、パラメータとして渡し、ストアドプロシージャで解析して実行することです。

ユーザー定義オブジェクトのサポート状況に変更はありますか?

+0

残念ながら、カスタムタイプのサポートはまだありません:(しかし、私はそれを行う方法についてのドキュメントを書いています:https://github.com/npgsql/Npgsql/wiki/How-to-add-a-custom- type-to-Npgsqlこれは非常に早いバージョンですが、Npgsqlコードで作業を開始する場所についていくつかの指針を示していますので、参考にしてください。 –

0

NPGは

あなたは key_value_pairsがあなたの key_value_pair型の配列である

INSERT INTO some_table (key, value) SELECT key, value FROM UNNEST(@key_value_pairs); 

のようなものを実行していると言う(少なくとも3.1.7で)それをサポートし、あなたは、クラスなどを持っています

class key_value_pair 
{ 
    string key; 
    string value; 
} 

、あなたはそれらのオブジェクトの配列を持っている

key_value_pair[] params = {...}; 

その後、あなたはここでNpgsqlDbType.Array | NpgsqlDbType.Compositeにパラメータタイプを設定している

using (NpgsqlCommand cmd = new NpgsqlCommand()) 
{ 
    ... 
    cmd.Parameters.Add("key_value_pairs", NpgsqlDbType.Array | NpgsqlDbType.Composite).Value = params; 
    cmd.ExecuteNonQuery(); 
} 

キーポイントのようにコマンドにパラメータを追加します。私はユーザー定義の型を取る関数を呼び出そうとしませんでしたが、上記と同じように動作するはずです。いくつかの例については、thisを参照してください。

関連する問題