我在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
我在这里犯了什么错误?
编辑:我得到了这条消息正在发生的代码,它不在插入命令上,而是返回命令。
答案 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
。