0

次のように定義された PostgreSQL のストアド プロシージャがあります。

CREATE OR REPLACE FUNCTION g_changename(oldname character varying, newname character varying)
   RETURNS integer AS
$BODY$
    declare
        k integer :=0;
    begin       
        UPDATE test SET name = $2 WHERE name = $1;
        GET DIAGNOSTICS k = ROW_COUNT;
    return k;
    end;    
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION g_changename(character varying, character varying)
OWNER TO postgres;

ストアド プロシージャは、次の場合に更新されたレコードの数を返すように正しくテストします。

Select g_changename('a','b');

PgAdmin 内で実行されます。データベースからドメインを更新するために Telerik DataAccess が呼び出されると、次のようにコンパイルされます。

 [MappedFunctionAttribute(Name="\"public\".\"g_changename\"", IsDeterministic=false, Backend=Backend.PostgreSql)]
    public static Int32 ChangeName(string oldname, string newname)
    {
        throw new NotImplementedException();
    }

私が読んだすべてから、どれが適切だと思われます。しかし、それを呼び出すメソッドをどのように記述しますか?

実装されていない静的プロシージャを呼び出すため、これは失敗します。

    public int ChangeName(string OldName, string NewName)
    {
         var x =  Nova.Data.Data.ChangeName(OldName, NewName);
         return x;
    }

また、「MappedFunctionAttribute」が参照する Telerik メタデータの使用方法もわかりません。

私はこれに何日も苦労してきたので、どんな助けも大歓迎です。

4

1 に答える 1

1

スカラー戻り値で定義されたストアド プロシージャは、LINQ ステートメント内でのみ呼び出すことができ、非定数パラメーターを使用してのみ呼び出すことができるようです。したがって、これを解決する最も簡単な方法は、(実装されていない) テンプレート メソッドを完全にバイパスし、次のようにデータベースに直接アクセスすることでした。

public int ChangeName(string OldName, string NewName)
    {
        using (var ctx = new Nova.Data.Data())
        {
           OAParameter p1 = new OAParameter();
           p1.ParameterName = "oldname";
           p1.Value = OldName;

           OAParameter p2 = new OAParameter();
           p2.ParameterName = "newname";
           p2.Value = NewName;

           IList<Int32> rslt = 
               ctx.ExecuteQuery<Int32>("g_changename", CommandType.StoredProcedure, p1, p2);

           ctx.SaveChanges();

           return rslt[0];

        }
    }

誰もがより良いアイデアを持っていますか?

于 2015-04-03T04:00:38.567 に答える