2014-04-02 57 views
1

我試圖插入新記錄,同時使用下面的SQL返回新的ID作爲外部參數值返回新的ID作爲輸出參數:如何插入一條記錄,並在PostgreSQL

Insert into ERRORS (ErrorId, Date, ErrorInfo) values (:ItemDate, :Text) returning ErrorId into :ID 

我收到以下錯誤:

Npgsql.NpgsqlException occurred 
    BaseMessage=syntax error at or near "into" 
    Code=42601 
    ColumnName="" 
    ConstraintName="" 
    DataTypeName="" 
    Detail="" 
    ErrorCode=-2147467259 
    ErrorSql=Insert into ERRORS (ErrorId, Date, ErrorInfo) values ((('2014-04-02 08:16:36.045969')::timestamp), (('Test 333 4/2/2014 8:16:36 AM')::text)) returning ErrorId into 
    File=src\backend\parser\scan.l 
    Hint="" 
    HResult=-2147467259 
    Line=1053 
    Message=ERROR: 42601: syntax error at or near "into" 
    Position=168 
    Routine=scanner_yyerror 
    SchemaName="" 
    Severity=ERROR 
    Source=Npgsql 
    TableName="" 
    Where="" 
    StackTrace: 
     at Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__9.MoveNext() 
     at Npgsql.ForwardsOnlyDataReader.GetNextResponseObject(Boolean cleanup) 
     at Npgsql.ForwardsOnlyDataReader.GetNextRowDescription() 
     at Npgsql.ForwardsOnlyDataReader.NextResultInternal() 
     at Npgsql.ForwardsOnlyDataReader..ctor(IEnumerable`1 dataEnumeration, CommandBehavior behavior, NpgsqlCommand command, NotificationThreadBlock threadBlock, Boolean preparedStatement, NpgsqlRowDescription rowDescription) 
     at Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb) 
     at Npgsql.NpgsqlCommand.ExecuteNonQuery() 
     at FrozenElephant.Symbiotic.ObjectWriter.Create(IDatabaseTypesFactory factory, Object value, IDbTransaction transaction, Boolean performCommitClose) in E:\Dev\FrozenElephant\SymbioticORM\Symbiotic\Symbiotic\ObjectWriter.vb:line 423 
    InnerException: 

我也嘗試刪除最後一個「入」,但也不工作。

+0

是什麼,當你刪除最後一個到的錯誤信息? –

回答

2

除了使用out參數,你必須與使用Npgsql的的ExecuteReader:

NpgsqlCommand cmd = new NpgsqlCommand(@"Insert into ERRORS(Date, ErrorInfo) values(:ItemDate, :Text) returning ErrorId", conn); 

...Add your inpout parameters... 

NpgsqlDataReader reader = cmd.ExecuteReader(); 

int errorId; 

while (reader.Read()) 
{ 
    errorId = reader.GetInt32(0)); 
} 
0

這個例子SQL將產生包含新ErrorID中單列一個結果集:

與表達
CREATE TABLE errors(ErrorId SERIAL, date TIMESTAMP, ErrorInfo VARCHAR(100)); 

INSERT INTO errors(Date, ErrorInfo) 
VALUES (now(), 'abc') 
RETURNING ErrorId 

的一個問題是,你有ErrorID中在插入到列表中,但它不是一個值。

+0

是的,在這種情況下,通常排除自動增量值或「串行」。但我需要一個返回參數。 – eschneider

+0

我的示例中將返回ErrorId,但它將成爲一個正常的結果集。在Java中,我會執行executeQuery()而不是executeUpdate()。 –

+0

「RETURNING」部分確定返回結果集中的列。 –