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 回答