Обсуждение: Removing pollution from log files
I'm using PostgreSQL PostgreSQL 8.2.4 from ODBC 08.02.0300 client. Postgres log files are polluted with messages 2007-08-27 06:10:38 WARNING: nonstandard use of \\ in a string literal at character 190 2007-08-27 06:10:38 HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2007-08-27 06:10:39 WARNING: nonstandard use of \\ in a string literal at character 197 2007-08-27 06:10:39 HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2007-08-27 06:10:47 WARNING: nonstandard use of \\ in a string literal at character 190 2007-08-27 06:10:47 HINT: Use the escape string syntax for backslashes, e.g., E'\\'. 2007-08-27 06:10:48 WARNING: nonstandard use of \\ in a string literal at character 197 2007-08-27 06:10:48 HINT: Use the escape string syntax for backslashes, e.g., E'\\'. How to force Postgres not to write those messages to log file ? Should I configure ODBC driver, Postgres or change my application ? Andrus.
On Mon, Aug 27, 2007 at 02:00:02PM +0300, Andrus wrote: > Postgres log files are polluted with messages > > 2007-08-27 06:10:38 WARNING: nonstandard use of \\ in a string literal at > character 190 > 2007-08-27 06:10:38 HINT: Use the escape string syntax for backslashes, > e.g., E'\\'. That's not pollution; it's telling you you need to fix your application to escape the backslashes differently. If you want to suppress them, though, you can change your logging level to be higher than "WARNING". A -- Andrew Sullivan | ajs@crankycanuck.ca "The year's penultimate month" is not in truth a good way of saying November. --H.W. Fowler
Maybe someone here can figure it out. Everything updates fine with this code, except where there's an exception, it's not rolling back by the transaction. What I'm trying to do: Begin a transaction Do the update, insert, delete checks on each of the data tables, using a different npgsqlcommandbuilder for each of the tables. Commit if any failure happens, roll back all the changes to the transaction beginning. I assign the transaction object to each of the commands, but it seems that some tables will get updated, even when I call rollback. Is something I'm calling secretly calling "commit" somewhere? My code follows. Thanks for checking it over. Sorry about the length, but I wanted you to see that I'm updating multiple tables with multiple dataadapters. -Owen Option Explicit On Imports System.Windows.Forms Imports npgsql Imports System.Xml.Serialization Imports System.IO Imports System.Collections.Generic Imports System.Configuration ' Note: some controls, in the forms designer, cover other controls, i.e. CommUsageCB covers styleCB Public Class ParcelDisplayFrm Public Sub WriteAllData() Dim trans As NpgsqlTransaction = Nothing Dim cmd As NpgsqlCommandBuilder Dim i As Integer Dim success As Boolean Try If Not statusReadOnly Then i = vbCancel success = priceIt(Me, full_DataSet, True, True, pc) dt = full_DataSet.Tables(currentSchema & ".parcel") dt.Rows(0).EndEdit() dt = full_DataSet.Tables(currentSchema & ".accounts") dt.Rows(0).EndEdit() dt = full_DataSet.Tables(currentSchema & ".bldg") For i = 0 To dt.Rows.Count - 1 dt.Rows(i).EndEdit() Next i dt = full_DataSet.Tables(currentSchema & ".commcost") For i = 0 To dt.Rows.Count - 1 dt.Rows(i).EndEdit() Next i dt = full_DataSet.Tables(currentSchema & ".outbuildings") For i = 0 To dt.Rows.Count - 1 If dt.Rows(i).RowState = DataRowState.Added Then dt.Rows(i).Item("maplot") = Form1.currentMapLot End If Debug.Print(dt.Rows.Count) dt.Rows(i).EndEdit() Next i If Not dirtySketch And Not full_DataSet.HasChanges Then Exit Sub ' Nothing to change End If Dim dg As New SaveChangesDlog If dg.ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub ' don't save writeFinalize() dt = full_DataSet.Tables(currentSchema & ".parcel") m_SqlConnection.Open() ' create a transaction for the rest of all the changes trans = m_SqlConnection.BeginTransaction cmd = New NpgsqlCommandBuilder(parcel_DataAdapter) Dim parcelchanges As DataTable = dt.GetChanges(DataRowState.Modified) If parcelchanges IsNot Nothing Then parcel_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(0)) parcel_DataAdapter.UpdateCommand.Transaction = trans parcel_DataAdapter.Update(parcelchanges) End If parcelchanges = dt.GetChanges(DataRowState.Deleted) If parcelchanges IsNot Nothing Then parcel_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) parcel_DataAdapter.DeleteCommand.Transaction = trans parcel_DataAdapter.Update(parcelchanges) End If parcelchanges = dt.GetChanges(DataRowState.Added) If parcelchanges IsNot Nothing Then parcel_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(0)) parcel_DataAdapter.InsertCommand.Transaction = trans parcel_DataAdapter.Update(parcelchanges) End If ' accounts table cmd = New NpgsqlCommandBuilder(accts_DataAdapter) dt = full_DataSet.Tables(currentSchema & ".accounts") Dim acctchanges As DataTable = dt.GetChanges(DataRowState.Modified) If acctchanges IsNot Nothing Then accts_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(0)) accts_DataAdapter.UpdateCommand.Transaction = trans accts_DataAdapter.Update(acctchanges) End If acctchanges = dt.GetChanges(DataRowState.Deleted) If acctchanges IsNot Nothing Then accts_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) accts_DataAdapter.DeleteCommand.Transaction = trans accts_DataAdapter.Update(acctchanges) End If acctchanges = dt.GetChanges(DataRowState.Added) If acctchanges IsNot Nothing Then accts_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(0)) accts_DataAdapter.InsertCommand.Transaction = trans accts_DataAdapter.Update(acctchanges) End If ' do for every building dt = full_DataSet.Tables(currentSchema & ".bldg") If dt.Rows.Count > 0 Then If dirtySketch Then For i = currentBuilding To howManyBuildings - 1 returnSketchToDatabase(dt.Rows(0).Item("maplot"), i, trans, Me) Next i End If cmd = New NpgsqlCommandBuilder(bldg_DataAdapter) ' add modified dates addModDates(dt, "modified") 'Debug.Print(ZoningCode.DataBindings.BindableComponent) Dim bldgchanges As DataTable = dt.GetChanges(DataRowState.Deleted) If bldgchanges IsNot Nothing Then bldg_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) bldg_DataAdapter.DeleteCommand.Transaction = trans bldg_DataAdapter.Update(bldgchanges) End If bldgchanges = dt.GetChanges(DataRowState.Modified) If bldgchanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While bldg_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(j)) bldg_DataAdapter.UpdateCommand.Transaction = trans bldg_DataAdapter.Update(bldgchanges) End If bldgchanges = dt.GetChanges(DataRowState.Added) If bldgchanges IsNot Nothing Then bldg_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(0)) bldg_DataAdapter.InsertCommand.Transaction = trans bldg_DataAdapter.Update(bldgchanges) End If End If dt = full_DataSet.Tables(currentSchema & ".commcost") If dt.Rows.Count > 0 Then cmd = New NpgsqlCommandBuilder(commbldg_DataAdapter) 'Debug.Print(ZoningCode.DataBindings.BindableComponent) Dim commBldgChanges As DataTable commBldgChanges = dt.GetChanges(DataRowState.Deleted) If commBldgChanges IsNot Nothing Then commbldg_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) commbldg_DataAdapter.DeleteCommand.Transaction = trans commbldg_DataAdapter.Update(commBldgChanges) End If commBldgChanges = dt.GetChanges(DataRowState.Modified) If commBldgChanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While commbldg_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(j)) commbldg_DataAdapter.UpdateCommand.Transaction = trans commbldg_DataAdapter.Update(commBldgChanges) End If commBldgChanges = dt.GetChanges(DataRowState.Added) If commBldgChanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While commbldg_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(j)) commbldg_DataAdapter.InsertCommand.Transaction = trans commbldg_DataAdapter.Update(commBldgChanges) End If End If dt = full_DataSet.Tables(currentSchema & ".outbuildings") If dt.Rows.Count > 0 Then cmd = New NpgsqlCommandBuilder(outbldg_DataAdapter) For i = 0 To dt.Rows.Count - 1 If dt.Rows(i).RowState = DataRowState.Added Then dt.Rows(i).Item("MapLot") = full_DataSet.Tables(currentSchema & ".parcel").Rows(0).Item("MapLot") End If Next i 'Debug.Print(ZoningCode.DataBindings.BindableComponent) Dim outchanges As DataTable outchanges = dt.GetChanges(DataRowState.Deleted) If outchanges IsNot Nothing Then outbldg_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) outbldg_DataAdapter.DeleteCommand.Transaction = trans outbldg_DataAdapter.Update(outchanges) End If outchanges = dt.GetChanges(DataRowState.Modified) If outchanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While outbldg_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(j)) outbldg_DataAdapter.UpdateCommand.Transaction = trans outbldg_DataAdapter.Update(outchanges) End If outchanges = dt.GetChanges(DataRowState.Added) If outchanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While outbldg_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(j)) outbldg_DataAdapter.InsertCommand.Transaction = trans outbldg_DataAdapter.Update(outchanges) End If End If ' write changes to sales tables dt = full_DataSet.Tables(currentSchema & ".sales") If dt.Rows.Count > 0 Then cmd = New NpgsqlCommandBuilder(sales_DataAdapter) 'Debug.Print(ZoningCode.DataBindings.BindableComponent) Dim salesChanges As DataTable salesChanges = dt.GetChanges(DataRowState.Deleted) If salesChanges IsNot Nothing Then sales_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) sales_DataAdapter.DeleteCommand.Transaction = trans sales_DataAdapter.Update(salesChanges) End If salesChanges = dt.GetChanges(DataRowState.Modified) If salesChanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While sales_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(j)) sales_DataAdapter.UpdateCommand.Transaction = trans sales_DataAdapter.Update(salesChanges) End If salesChanges = dt.GetChanges(DataRowState.Added) If salesChanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While sales_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(j)) sales_DataAdapter.InsertCommand.Transaction = trans sales_DataAdapter.Update(salesChanges) End If End If ' write changes to sales overflow table dt = full_DataSet.Tables(currentSchema & ".salesovflowtype") If dt.Rows.Count > 0 Then cmd = New NpgsqlCommandBuilder(salesOF_DataAdapter) 'Debug.Print(ZoningCode.DataBindings.BindableComponent) Dim salesOFChanges As DataTable salesOFChanges = dt.GetChanges(DataRowState.Deleted) If salesOFChanges IsNot Nothing Then salesOF_DataAdapter.DeleteCommand = cmd.GetDeleteCommand(dt.Rows(0)) salesOF_DataAdapter.DeleteCommand.Transaction = trans salesOF_DataAdapter.Update(salesOFChanges) End If salesOFChanges = dt.GetChanges(DataRowState.Modified) If salesOFChanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While salesOF_DataAdapter.UpdateCommand = cmd.GetUpdateCommand(dt.Rows(j)) salesOF_DataAdapter.UpdateCommand.Transaction = trans salesOF_DataAdapter.Update(salesOFChanges) End If salesOFChanges = dt.GetChanges(DataRowState.Added) If salesOFChanges IsNot Nothing Then Dim j As Integer = 0 While dt.Rows(j).RowState = DataRowState.Deleted j = j + 1 End While salesOF_DataAdapter.InsertCommand = cmd.GetInsertCommand(dt.Rows(j)) salesOF_DataAdapter.InsertCommand.Transaction = trans salesOF_DataAdapter.Update(salesOFChanges) End If End If trans.Commit() m_SqlConnection.Close() dirtySketch = False BrowserPanel.Refresh() End If Catch ex As Exception MsgBox(" error on writing data " & ex.Message, MsgBoxStyle.AbortRetryIgnore) If trans IsNot Nothing Then trans.Rollback() If m_SqlConnection.State = ConnectionState.Open Then m_SqlConnection.Close() End Try End Sub End Class
Andrew Sullivan wrote: >On Mon, Aug 27, 2007 at 02:00:02PM +0300, Andrus wrote: >> Postgres log files are polluted with messages >> >> 2007-08-27 06:10:38 WARNING: nonstandard use of \\ in a string literal at >> character 190 >> 2007-08-27 06:10:38 HINT: Use the escape string syntax for backslashes, >> e.g., E'\\'. > >That's not pollution; it's telling you you need to fix your >application to escape the backslashes differently. If you want to >suppress them, though, you can change your logging level to be higher >than "WARNING". Or lookup <http://www.postgresql.org/docs/8.2/static/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS>. Apart from that: there was a bug in the ODBC driver prior 08.02.0402 which resulted in this error message whenever binary data of type SQL_LONGVARBINARY was send. Rainer
Owen Hartnett <owen@clipboardinc.com> writes: > I assign the transaction object to each of the commands, but it seems > that some tables will get updated, even when I call rollback. Is > something I'm calling secretly calling "commit" somewhere? Dunno anything about vb.net, but this sounds like an autocommit feature that's not doing what you expect. If nothing else comes to mind, try setting the DB to log all statements (see log_statement), and compare the resulting trace to what you think your code is doing. That should at least narrow it down a lot. regards, tom lane
At 7:05 PM -0400 8/27/07, Tom Lane wrote: >Owen Hartnett <owen@clipboardinc.com> writes: >> I assign the transaction object to each of the commands, but it seems >> that some tables will get updated, even when I call rollback. Is >> something I'm calling secretly calling "commit" somewhere? > >Dunno anything about vb.net, but this sounds like an autocommit feature >that's not doing what you expect. > >If nothing else comes to mind, try setting the DB to log all statements >(see log_statement), and compare the resulting trace to what you think >your code is doing. That should at least narrow it down a lot. > > regards, tom lane Thanks, I'll give that a try. -Owen
> That's not pollution; it's telling you you need to fix your > application to escape the backslashes differently. I havent seen that ODBC specification requires escaping strings. So this is task of ODBC driver. Andrus.
Andrus wrote: > > That's not pollution; it's telling you you need to fix your > > application to escape the backslashes differently. > > I havent seen that ODBC specification requires escaping strings. > So this is task of ODBC driver. So complain to the ODBC guys. OTOH, maybe you are using ODBC wrongly. -- Alvaro Herrera http://www.amazon.com/gp/registry/CTMLCN8V17R4 "El destino baraja y nosotros jugamos" (A. Schopenhauer)
Andrus wrote: >> Apart from that: there was a bug in the ODBC driver prior 08.02.0402 which >> resulted in this error message whenever binary data of type >> SQL_LONGVARBINARY >> was send. > >Where is 0402 driver ? The snapshot drivers can be found here: <http://www.geocities.jp/inocchichichi/psqlodbc/index.html> Rainer
> Apart from that: there was a bug in the ODBC driver prior 08.02.0402 which > resulted in this error message whenever binary data of type > SQL_LONGVARBINARY > was send. Where is 0402 driver ? Last downloadable version in 0400 which has this issue. Andrus.
At 10:14 AM -0400 8/28/07, Owen Hartnett wrote: >At 7:05 PM -0400 8/27/07, Tom Lane wrote: >>Owen Hartnett <owen@clipboardinc.com> writes: >>> I assign the transaction object to each of the commands, but it seems >>> that some tables will get updated, even when I call rollback. Is >>> something I'm calling secretly calling "commit" somewhere? >> >>Dunno anything about vb.net, but this sounds like an autocommit feature >>that's not doing what you expect. >> >>If nothing else comes to mind, try setting the DB to log all statements >>(see log_statement), and compare the resulting trace to what you think >>your code is doing. That should at least narrow it down a lot. >> >> regards, tom lane > >Thanks, I'll give that a try. > I've been able to turn on statement logging (I've set log_statement to 'all'), but it doesn't seem to show the begin transaction - commit - rollback statements. Is there another way to have them show up in the log? -Owen
Owen Hartnett wrote: > At 10:14 AM -0400 8/28/07, Owen Hartnett wrote: >> At 7:05 PM -0400 8/27/07, Tom Lane wrote: >>> Owen Hartnett <owen@clipboardinc.com> writes: >>>> I assign the transaction object to each of the commands, but it seems >>>> that some tables will get updated, even when I call rollback. Is >>>> something I'm calling secretly calling "commit" somewhere? >>> >>> Dunno anything about vb.net, but this sounds like an autocommit feature >>> that's not doing what you expect. >>> >>> If nothing else comes to mind, try setting the DB to log all statements >>> (see log_statement), and compare the resulting trace to what you think >>> your code is doing. That should at least narrow it down a lot. > > I've been able to turn on statement logging (I've set log_statement to > 'all'), but it doesn't seem to show the begin transaction - commit - > rollback statements. Is there another way to have them show up in the log? If they don't show up, they are not being executed at all; which explains why your transactions "don't roll back", because there are no transaction blocks defined at all. -- Alvaro Herrera http://www.advogato.org/person/alvherre "Oh, great altar of passive entertainment, bestow upon me thy discordant images at such speed as to render linear thought impossible" (Calvin a la TV)
Alvaro Herrera <alvherre@commandprompt.com> writes: > Owen Hartnett wrote: >> I've been able to turn on statement logging (I've set log_statement to >> 'all'), but it doesn't seem to show the begin transaction - commit - >> rollback statements. Is there another way to have them show up in the log? > If they don't show up, they are not being executed at all; which > explains why your transactions "don't roll back", because there are no > transaction blocks defined at all. In PG 8.2 I'd agree, but older versions are not so good about logging execution of prepared statements. What's the server version exactly, and is there any indication of use of prepared statements in the log? regards, tom lane
Tom Lane wrote: > Alvaro Herrera <alvherre@commandprompt.com> writes: > > Owen Hartnett wrote: > >> I've been able to turn on statement logging (I've set log_statement to > >> 'all'), but it doesn't seem to show the begin transaction - commit - > >> rollback statements. Is there another way to have them show up in the log? > > > If they don't show up, they are not being executed at all; which > > explains why your transactions "don't roll back", because there are no > > transaction blocks defined at all. > > In PG 8.2 I'd agree, but older versions are not so good about logging > execution of prepared statements. What's the server version exactly, > and is there any indication of use of prepared statements in the log? Humm, but can you prepare BEGIN or COMMIT at all? -- Alvaro Herrera http://www.advogato.org/person/alvherre "¿Cómo puedes confiar en algo que pagas y que no ves, y no confiar en algo que te dan y te lo muestran?" (Germán Poo)
Alvaro Herrera <alvherre@commandprompt.com> writes: > Tom Lane wrote: >> In PG 8.2 I'd agree, but older versions are not so good about logging >> execution of prepared statements. What's the server version exactly, >> and is there any indication of use of prepared statements in the log? > Humm, but can you prepare BEGIN or COMMIT at all? At the protocol level you're allowed to prepare anything at all. It surely is a bit useless to prepare BEGIN or COMMIT, since there's no plan and no noticeable parse/analyze costs, but I seem to recall seeing logs suggesting that some client software does so... regards, tom lane
At 11:32 AM -0400 9/5/07, Tom Lane wrote: >Alvaro Herrera <alvherre@commandprompt.com> writes: >> Owen Hartnett wrote: >>> I've been able to turn on statement logging (I've set log_statement to >>> 'all'), but it doesn't seem to show the begin transaction - commit - >>> rollback statements. Is there another way to have them show up in the log? > >> If they don't show up, they are not being executed at all; which >> explains why your transactions "don't roll back", because there are no >> transaction blocks defined at all. > >In PG 8.2 I'd agree, but older versions are not so good about logging >execution of prepared statements. What's the server version exactly, >and is there any indication of use of prepared statements in the log? > > regards, tom lane That's what I thought at first, but then I went to pgAdmin's SQL page and typed in "Begin" and ran it. No log shows up, but when I run it again from pgAdmin (and from my application), I get a "no nested transactions allowed" error (which I know Npgsql doesn't support), which indicates there's a transaction there which is not getting logged. If I run transactions with ADO's normal Execute* functions, they work fine. It's when I'm trying to use the dataset write back routines, with a NpgsqlTransaction and a NpgsqlCommandBuilder using Update, Insert and Delete commands on multiple tables one after another that it behaves as if the transaction isn't there, though it blithely accepts the begintransaction and commit commands without complaining. I'm running the latest, 8.2.4. The server is Mac OS X Server and Windows XP (of course) clients running the ADO software and npgsql stuff. -Owen
At 12:41 PM -0400 9/5/07, Owen Hartnett wrote: >At 11:32 AM -0400 9/5/07, Tom Lane wrote: >>Alvaro Herrera <alvherre@commandprompt.com> writes: >>> Owen Hartnett wrote: >>>> I've been able to turn on statement logging (I've set log_statement to >>>> 'all'), but it doesn't seem to show the begin transaction - commit - >>>> rollback statements. Is there another way to have them show up >>>>in the log? >> >>> If they don't show up, they are not being executed at all; which >>> explains why your transactions "don't roll back", because there are no >>> transaction blocks defined at all. >> >>In PG 8.2 I'd agree, but older versions are not so good about logging >>execution of prepared statements. What's the server version exactly, >>and is there any indication of use of prepared statements in the log? >> >> regards, tom lane > >That's what I thought at first, but then I went to pgAdmin's SQL >page and typed in "Begin" and ran it. No log shows up, but when I >run it again from pgAdmin (and from my application), I get a "no >nested transactions allowed" error (which I know Npgsql doesn't >support), which indicates there's a transaction there which is not >getting logged. > >If I run transactions with ADO's normal Execute* functions, they >work fine. It's when I'm trying to use the dataset write back >routines, with a NpgsqlTransaction and a NpgsqlCommandBuilder using >Update, Insert and Delete commands on multiple tables one after >another that it behaves as if the transaction isn't there, though it >blithely accepts the begintransaction and commit commands without >complaining. > >I'm running the latest, 8.2.4. The server is Mac OS X Server and >Windows XP (of course) clients running the ADO software and npgsql >stuff. > Looking at the problem some more - I've been looking at the logs for some updates - what I do is update most of the tables with the ADO dataset writeback (as used in the Mcmanus & Goldstein's book: "Database Access with Visual Basic .NET"), but I use a simple ExecuteNoQuery to update another table, all wrapped up in the same transaction. The transaction affects the ExecuteNoQuery updates, but doesn't affect the ADO DataSet writebacks. In fact, in the logfiles, for each logline, it prints "IDLE in transaction" on the ExecuteNoQuery log statement, but just "IDLE" on the other updates. It's almost like the ADO has an independent path, even though I'm assigning the same NpgsqlTransaction object to it as I am to the ExecuteNoQuery command. I suppose I'll have to be stepping through that Npgsql code to see just what's going on. -Owen