FAQ
PostgreSQL 11のストアド・プロシージャを呼び出すにはどうすればいいですか?CommandType.StoredProcedureで試してみたところエラーが発生しました...
PostgreSQL 11のストアド・プロシージャを呼び出すことができますが、残念ながらCommandType.StoredProcedureには、ありません。PostgreSQLは、長い間、ストアド関数をサポートしてきました。そして、これらが、存在しない手順のための代替として機能してきたため、NpgsqlのCommandType.StoredProcedureは、それらを呼び出すために実装されています。;これは、CommandType.StoredProcedureを、SELECT * FROM my_stored_function()に変換することを示しています。新しいストアド・プロシージャは、特別な呼出し構文- CALL my_stored_procedure() -を導入します。これは、既存のストアド関数の構文と互換性がありません。
利点は、ストアド・プロシージャ(あるいは、関数)を自分で呼び出すことが、とても簡単です。-あなたは、本当に、CommandType.StoredProcedureを必要としません。単純に、通常のコマンドを作成します。そして、CommandTextをCALL my_stored_procedure(@p1, @p2)に設定します。他のステートメントと同じように、パラメータを処理します。実際には、NpgsqlとPostgreSQLで、CommandType.StoredProcedureには、コマンドを自分で作成する以上の付加価値はありません。
私は、例外「フィールドfield1は、現在、Npgsql (OID XXXXX)に認識されていない型を持っています。あなたは、unknownと印をつけることで、文字列として、それを取得することができます」を取得します。
"The field field1 has a type currently unknown to Npgsql (OID XXXXX). You can retrieve it as a string by marking it as unknown"
Npgsqlは、それぞれのPostgreSQL型のためのサポートを実装する必要があります。そして、あなたは、サポートされていない型に遭遇したようです。
まず、私たちの問題ページに移動し、問題が、既に、あなたの型に存在するかどうか確認してください。それ以外の場合には、私たちに、それを知らせてください。
続いて、回避方法として、あなたは、型をテキストとして扱うことができます。-あなたのプログラムで、それを解析するのは、あなた次第です。これを行う簡単な方法の1つは、クエリに::TEXTを追加することです(例:SELECT 3::TEXT)。
あなたが、あなたのクエリを変更したくない場合、Npgsqlには、テキストとして型を要求するためのAPIも含まれています。テキストとして、結果セット内のすべての列を取得します。
using (var cmd = new NpgsqlCommand(...)) {
cmd.AllResultTypesAreUnknown = true;
var reader = cmd.ExecuteReader();
// Read everything as strings
// すべてを文字列として、読み込みます。
}
また、あなたは、結果セットの一部の列にだけ、テキストを指定することもできます。:
using (var cmd = new NpgsqlCommand(...)) {
// Only the second field will be fetched as text
// 2つ目のフィールドだけが、テキストとして取り出されます。
cmd.UnknownResultTypeList = new[] { false, true };
var reader = cmd.ExecuteReader();
// Read everything as strings
// すべてを文字列として、読み込みます。
}
私は、JSONB型を記述するために試みています。そして、「列 "XXX"は、jsonb型ですが、式は、テキスト型です。」を取得します。
'column "XXX" is of type jsonb but expression is of type text'
JSONBパラメータを送信するとき、あなたは、NpgsqlDbTypeを使用して、明示的に型をJSONBに指定する必要があります。:
using (var cmd = new NpgsqlCommand("INSERT INTO foo (col) VALUES (@p)", conn)) {
cmd.Parameters.AddWithValue("p", NpgsqlDbType.Jsonb, jsonText);
}
Entity Framework 6の移行を適用しようとし、そして、「型は、メンバーのために解決されていません。」を取得します。
'Npgsql.NpgsqlException,Npgsql'!
残念ながら、EF6の欠点は、グローバル・アセンブリ・キャッシュ(GAC)で、Npgsql.dllを持つ必要があることです。それ以外の場合には、移行で、例外が発生することはありません。あなたは、管理者として、VS Developer Command Promptを開き、コマンド gacutil/i Npgsql.dllを実行することによって、GACにNpgsql.dllを追加することができます。あなたは、gacutil/u Npgsqlで、GACから、それを削除することができます。