如何在PostgreSql中插入记录并返回新的id作为输出参数

时间:2014-04-02 13:22:10

标签: sql .net postgresql npgsql

我尝试使用以下sql将新id作为out-parameter值返回时插入新记录:

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: 

我也尝试将最后一个&#34;删除到&#34;但也不起作用。

2 个答案:

答案 0 :(得分:2)

您必须使用带有npgsql的ExecuteReader:

,而不是使用out参数
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));
}

答案 1 :(得分:0)

此示例SQL将生成一个结果集,其中包含一个包含新ErrorId的行:

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

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

表达式的一个问题是插入列表中有ErrorId,但不是它的值。