代码之家  ›  专栏  ›  技术社区  ›  Haider Ali Wajihi

错误:在Postgresql中找不到参数名

  •  0
  • Haider Ali Wajihi  · 技术社区  · 10 年前

    我在Asp.net中使用postgresql和devart dotconnect连接驱动程序。 当我执行分段查询时,它显示错误,

    未找到参数名称

    我的代码在下面

    Command = new Devart.Data.PostgreSql.PgSqlCommand();
    Command.Parameters.AddWithValue("@TestName", testmaster.TestName);
    Command.Parameters.AddWithValue("@TestShortName", testmaster.TestShortName);
    DAF.Command.CommandText = @"Do $$
    DECLARE newTestID INT;
    BEGIN
    "+"Insert into \"TestMaster\"(\"TestName\", \"TestShortName\", \"RCUID\", \"RCDate\", \"RCTime\") " + @"
        "+"values (:TestName, :TestShortName, 0, CURRENT_DATE, CURRENT_TIME(0)) " + @"
        "+"RETURNING \"TestID\" INTO newTestID;"+@"
    END$$;";
    
    // Rest is execution code
    

    我在这里犯了什么错误?

    编辑:我知道这条消息发生在哪个代码上,它不是在插入命令上,而是在返回命令上。

    1 回复  |  直到 10 年前
        1
  •  1
  •   Craig Ringer    10 年前

    Parameter name not found 必须是数据库驱动程序中的错误。如果没有 完整异常跟踪 ,但我猜测DevArt必须要求您在尝试设置参数之前设置SQL文本。

    例如

    Command = new Devart.Data.PostgreSql.PgSqlCommand();
    Command.CommandText = "SELECT ...."; /* or whatever your SQL is */
    Command.Parameters.AddWithValue("@TestName", testmaster.TestName);
    Command.Parameters.AddWithValue("@TestShortName", testmaster.TestShortName);
    

    (我没用过,我只是路过 the examples in some of the docs ,虽然它们指的是Oracle参数,但对于基础知识来说似乎是一样的。)


    然而,DevArt也可能无法解析 DO 块和 $$ 引用。要确认这一点,请尝试:

    Command = new Devart.Data.PostgreSql.PgSqlCommand();
    Command.Parameters.AddWithValue("@TestName", testmaster.TestName);
    Command.Parameters.AddWithValue("@TestShortName", testmaster.TestShortName);
    Command.CommandText = "Insert into \"TestMaster\"(\"TestName\", \"TestShortName\", \"RCUID\", \"RCDate\", \"RCTime\") values (:TestName, :TestShortName, 0, CURRENT_DATE, CURRENT_TIME(0)) RETURNING \"TestID\" INTO newTestID;";
    

    如果此操作有效 块没有,那么可能是因为DevArt无法解析 块或其 $$ 引用以查找参数。

    您可能需要改用SQL函数(假设您在第一条语句之后尝试执行更多操作,否则使用 完全阻塞)。然后在单独的语句中调用该函数。例如,首先在没有任何参数的情况下执行该SQL:

    CREATE OR REPLACE FUNCTION myfunc(testname text, testshortname text) returns void AS $$
    DECLARE
        newTestID INT;
    BEGIN
        INSERT into "TestMaster"("TestName", "TestShortName", "RCUID", "RCDate", "RCTime")
        VALUES (testname, testshortname, 0, CURRENT_DATE, CURRENT_TIME(0))
        RETURNING TestID INTO newTestID;
    
        -- whatever you want to do with newTestID here
    END$$;
    

    然后 运行另一条语句来调用函数,例如:

    Command = new Devart.Data.PostgreSql.PgSqlCommand();
    Command.CommandText = "SELECT myfunc(:TestName, :TestShortName)";
    Command.Parameters.AddWithValue("@TestName", testmaster.TestName);
    Command.Parameters.AddWithValue("@TestShortName", testmaster.TestShortName);
    

    称之为。

    没有 CREATE TEMPORARY FUNCTION 所以你必须 DROP FUNCTION 如果你不想保留和重复使用它,那就在以后。