2012-01-12 52 views
1

我想使用Npgsql將一組鍵值對作爲參數傳遞給PostgreSQL函數。我有以下類型定義:如何提供具有自定義數據類型的Npgsql作爲參數?

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

我想寫像這樣一個功能:

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

... 

return true; 
end; 
$$ language plpgsql; 

我將如何從IDictionary<string, string>對象將數據傳遞給Npgsql的使用存儲過程?這是否支持?我無法在網上找到參考。

謝謝!

回答

4

傑里米!

不幸的是,Npgsql還不支持自定義數據類型。我打算爲此添加支持。

這將意味着添加一些類型的Npgsql類型轉換器的「註冊」。這樣你的應用程序就會爲你的自定義類型註冊一個轉換器,Npgsql會用它來回發送數據。

更多細節可以得到:Npgsql的/ src目錄/ NpgsqlTypes/NpgsqlTypeConverters.cs上cvs.npgsql.org

請添加有關,在我們的項目工地功能要求:project.npgsql.org。

在此先感謝。

+0

該鏈接似乎已損壞/不適用於我。 – 2012-01-12 17:31:59

+0

有時pgfoundry會遇到一些問題。請再試一次,它應該工作。我現在只是在這裏測試它,並沒有問題。 – 2012-01-15 17:15:03

+0

可以在github上找到Npgsql代碼:github.com/npgsql/Npgsql我希望它有幫助。 – 2014-05-08 14:34:52

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代碼中開始工作的指示,我希望它有幫助,請檢查一下,讓我知道你的想法。 – 2014-05-08 14:33:13

0

NPG不支持它(至少在3.1.7)

說你執行類似

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

其中key_value_pairs是你key_value_pair類型的數組,你有喜歡的一類

class key_value_pair 
{ 
    string key; 
    string value; 
} 

和你有這些對象的數組

key_value_pair[] params = {...}; 

那麼你喜歡

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

的關鍵參數添加到命令這裏的參數類型設置爲NpgsqlDbType.Array | NpgsqlDbType.Composite。我還沒有嘗試調用一個採用用戶定義類型的函數,但它應該與上面的一樣。有些例子見this

相關問題