Home > C# > PostgreSQL > Npgsql > ドキュメント

FAQ Npgsql

新規作成日 2019-02-24
最終更新日

FAQ

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から、それを削除することができます。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」