Question

I'm trying to insert a new record while returning the new id as a out-parameter value using the following sql:

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

I get the following error:

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: 

I also tried removing the last "into" but does not work either.

Was it helpful?

Solution

Instead of using an out parameter, you have to use ExecuteReader with npgsql:

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));
}

OTHER TIPS

This example SQL will yield a result set with a single row containing the new ErrorId:

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

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

One problem with your expression is that you have ErrorId in the insert into list, but not a value for it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top