使用NpgsqlDataAdapter插入带有返回子句

时间:2016-08-11 14:02:30

标签: npgsql dataadapter

我使用NpgsqlDataAdapter(Npgsql 3.0.5)在表中插入新行。新行的主键值由数据库创建,因此我想将其传递回应用程序。因此,我使用适当的参数生成了一个InsertCommand,如下所示:

INSERT INTO TASK_JOURNAL(TJ_ID, TJ_COMMENT, TJ_COMPLETION_STATE) 
  VALUES(ID_GENERATOR.GenerateId('TASK_JOURNAL'), :p0_TJ_COMMENT, :p1_TJ_COMPLETION_STATE RETURNING TJ_ID, UPDATED_ON)
  INTO :p11_TJ_ID, :p19_UPDATED_ON

但是,似乎Npgsql没有准备接受DataAdapter.InsertCommand中的返回值,我收到以下错误:

  

参数':p11_TJ_ID'在SQL中引用但是只是一个out-only参数

调用堆栈:

Npgsql.dll!Npgsql.SqlQueryParser.ParseRawQuery(string sql = "INSERT INTO NET_UT.TASK_JOURNAL(TJ_ID, TJ_COMMENT, TJ_COMPLETION_STATE) VALUES(NET_UT.ID_GENERATOR.GenerateId('TASK_JOURNAL'), :p0_TJ_COMMENT, :p1_TJ_COMPLETION_STATE) RETURNING TJ_ID, UPDATED_ON INTO :p11_TJ_ID, :p19_UPDATED_ON", bool standardConformantStrings = true, Npgsql.NpgsqlParameterCollection parameters = {Npgsql.NpgsqlParameterCollection}, System.Collections.Generic.List<Npgsql.NpgsqlStatement> queries = Count = 0) Line 127  C#
Npgsql.dll!Npgsql.NpgsqlCommand.ProcessRawQuery() Line 504  C#
Npgsql.dll!Npgsql.NpgsqlCommand.CreateMessagesNonPrepared(System.Data.CommandBehavior behavior = SequentialAccess) Line 563 C#
Npgsql.dll!Npgsql.NpgsqlCommand.ValidateAndCreateMessages(System.Data.CommandBehavior behavior = SequentialAccess) Line 555 + 0x12 bytes    C#
Npgsql.dll!Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(System.Data.CommandBehavior behavior = SequentialAccess) Line 914   C#
Npgsql.dll!Npgsql.NpgsqlCommand.ExecuteDbDataReader(System.Data.CommandBehavior behavior = SequentialAccess) Line 901 + 0xe bytes   C#
System.Data.dll!System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(System.Data.CommandBehavior behavior) + 0xf bytes 
System.Data.dll!System.Data.Common.DbDataAdapter.UpdateRowExecute(System.Data.Common.RowUpdatedEventArgs rowUpdatedEvent = {Npgsql.NpgsqlRowUpdatedEventArgs}, System.Data.IDbCommand dataCommand = {Npgsql.NpgsqlCommand}, System.Data.StatementType cmdIndex = Insert) + 0xbe bytes   
System.Data.dll!System.Data.Common.DbDataAdapter.Update(System.Data.DataRow[] dataRows, System.Data.Common.DataTableMapping tableMapping = {System.Data.Common.DataTableMapping}) + 0xa88 bytes 
System.Data.dll!System.Data.Common.DbDataAdapter.Update(System.Data.DataRow[] dataRows) + 0x13c bytes   

我知道这可以通过使用NpgsqlCommand.ExecuteReader来实现,但是,不使用NpgsqlDataAdapter需要更改我也用于Oracle的所有框架(它接受在Insert和Update中返回参数)。

如果有一个解决方案使用NpgsqlDataAdapter在insert语句中返回值,我感兴趣。

0 个答案:

没有答案