我使用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语句中返回值,我感兴趣。