2014-07-26 2 views
0

devat dotconnect 연결 드라이버가있는 postgresql을 사용하여 Asp.net에서 작업하고 있습니다. 내가오류 : 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;"[email protected]" 
END$$;"; 

// Rest is execution code 

이하?

편집 :이 메시지가 발생하는 코드가 있습니다. 명령을 다시 입력 할 때 삽입 명령이 아닙니다.

+0

* 전체 * 오류 메시지가 확실합니까? 전체 오류/예외를 복사하여 붙여 넣으십시오. –

+0

전체 예외입니다. 다른 세부 사항은 나와 동일하지 않습니다. –

+0

내 편집을 확인하십시오. 명령을 내릴 때 오류가 삽입 명령에 없습니다. –

답변

1

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에 의해거야, 그것을 사용하지 않은 기초에 대해 같은 많은 것 같다.)


그러나, 그것은 또한입니다 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 매개 변수를 찾을 수에 따옴표 DO 블록 또는 $$을 구문 분석 할 수 있기 때문에 DO 블록의 버전은, 그것은 아마하지 않습니다 사항을 확인하기 위해 시도합니다.

대신 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); 

이 호출 할 수 있습니다.

계속 유지하고 재사용하지 않으려면 DROP FUNCTION을 입력해야합니다. 따라서 을 입력해야합니다.

+0

예, 파서를 가지고 있습니다. 파싱을하지 않아 오류가 발생합니다. 이제 함수를 사용해 보겠습니다. –

+0

함수에서 매개 변수를 사용하는 방법과 C# 코드에서 호출하는 방법을 도와 줄 수 있습니까? –

+1

@HaiderAliWajihi 새로운 것이 있으면 * 새로운 질문을 게시하십시오. 이번에는 http://stackoverflow.com/tour 및 http://stackoverflow.com/help/how-to-ask를 먼저 읽어보십시오. 그러면 추측이 덜 필요한 명확한 질문을 할 수 있습니다. –

관련 문제