2017-02-20 1 views
2

暗黙のテーブル型に基づいてカスタム(複合)型を返そうとしています。Npgsqlとストアドプロシージャからカスタムテーブルタイプを返す方法は?

私はこのテーブル定義を持っている:

public class ApplicationUser 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

呼び出すことによってマップされます:

NpgsqlConnection.MapCompositeGlobally<ApplicationUser>("app_user"); 

そして、私がしようとしている。このクラス定義にマッピングされ

CREATE TABLE app_user (id CHAR(36) PRIMARY KEY, name TEXT); 

このストアドプロシージャを使用してレコードを返す:

私はこのようなC#のから呼んでいる
CREATE FUNCTION find_by_id(user_id app_user.id%TYPE) RETURNS app_user AS $$ 
DECLARE 
    found_user app_user; 
BEGIN 
    SELECT * 
    FROM app_user 
    WHERE id = user_id 
    INTO found_user; 

    RETURN found_user; 
END 
$$ LANGUAGE plpgsql STABLE SECURITY DEFINER; 

ApplicationUser user; 
using (NpgsqlConnection db = new NpgsqlConnection(this.connectionString)) 
{ 
    db.Open(); 
    using (NpgsqlCommand cmd = new NpgsqlCommand("find_by_id", db)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("user_id", userId); 
     object result = cmd.ExecuteScalar(); 
     user = result == DBNull.Value ? null : (ApplicationUser)result; 
    } 
} 

しかしApplicationUserresultをキャストするとき、私は例外を取得:

InvalidCastException: Unable to cast object of type 'System.String' to type 'MyApp.ApplicationUser'. 

resultは単なる文字列であるので、これは明らかにされIdしかし、なぜresult私の複合app_userオブジェクトがないのですか?

私はまたoutパラメータでオブジェクトを返そうとしましたが、まったく同じ例外が発生しました。私はNpgsqlを使って何をしようとしているのですか、あるいは個々の列からC#で手動でApplicationUserオブジェクトを再構築する必要がありますか?

私はNpgsql v3.2.0とPostgreSQL v9.6を使用しています。

答えて

1

私はそれを理解したように見えます。私が思ったよりも簡単になった。私が変更する必要があったのは、ストアドプロシージャがC#から呼び出された方法でした。

ApplicationUser user; 
using (NpgsqlConnection db = new NpgsqlConnection(this.connectionString)) 
{ 
    db.Open(); 
    using (NpgsqlCommand cmd = new NpgsqlCommand("SELECT find_by_id(@user_id);", db)) 
    { 
     cmd.Parameters.AddWithValue("user_id", userId); 
     object result = cmd.ExecuteScalar(); 
     user = result == DBNull.Value ? null : (ApplicationUser)result; 
    } 
} 

私はストアドプロシージャを呼び出す別の方法をお勧めしましたが、少なくともこれは機能します。

関連する問題