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

时间:2014-07-26 07:00:45

标签: c# postgresql devart parameterized-query

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

  

找不到参数名称

我的代码在

下面
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 个答案:

答案 0 :(得分:1)

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

e.g。

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;";

如果这样可行,但DO块中的版本不起作用,则可能是因为DevArt无法解析DO块或其{$$块1}}引用以查找参数。

您可能需要使用SQL函数(假设您在第一个语句之后尝试执行更多操作,否则根本不会使用DO块)。然后在单独的语句中调用该函数。例如首先执行此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