Re: Access violation - probably not the fault of Postgres
От | David Gardner |
---|---|
Тема | Re: Access violation - probably not the fault of Postgres |
Дата | |
Msg-id | 45F1A34C.1070709@yucaipaco.com обсуждение исходный текст |
Ответ на | Re: Access violation - probably not the fault of Postgres (Paul Lambert <paul.lambert@autoledgers.com.au>) |
Список | pgsql-odbc |
I wasn't able to reproduce your error on my side, but I used an Access DB frontend connecting to an ODBC table, but take a look at my test case and see if it fails on your side. Note, with Access you aren't allowed to use dbOpenDynamic, so I went with the dbOpenDynaset. Private Sub testPGDriver() Dim rs As Recordset Dim sSQL As String Dim l As Long sSQL = "SELECT * FROM public_testTable" Set rs = CurrentDb.OpenRecordset(sSQL, dbOpenDynaset, 0, dbOptimistic) rs.AddNew l = load_xxx_to_db(rs, "test23", 0) rs.update rs.AddNew l = load_xxx_to_db(rs, "test23", 1) rs.update End Sub Private Function load_xxx_to_db(table As Recordset, sData As String, i As Integer) As Long If i = 0 Then table("testField").Value = sData Else table("testField").Value = Null End If load_xxx_to_db = 0 End Function Paul Lambert wrote: > David Gardner wrote: >> Could you post the code in question? How are you initializing your >> recordset object? Have you tried feeding the database object an >> insert statement via the execute() function? >> >> > > Excuse the longwindedness of this... I've tried putting in all the > relevant code and other information that I can. > > Recordset object is defined as thus: > > Private Debtor_table As Recordset > About 30 odd times for the various different tables - this is then > passed to the function whos code is below which receives it as > variable name "table" > > Other relevant variable declarations: > Private autodrs_db As DAO.Database > Private autodrs_work As DAO.Workspace > > Database is opened as follows: > Set autodrs_work = CreateWorkspace("autodrs", g_strUserName, > g_strPWD, dbUseODBC) > Set autodrs_db = autodrs_work.OpenDatabase("autodrs", _ > dbDriverNoPrompt, False, "ODBC;DATABASE=" & g_strDBName & _ > ";UID=" & g_strUserName & ";PWD=" & g_strPWD & ";DSN=" & > g_strDBDSN & ";") > > > The code causing the error is as follows: > > Call debug_message(60, "Criteria = " & criteria) > task = "Check for Update or Add" > criteria_orig = criteria > criteria = "Select * from " & table_name & " where " & criteria > Call debug_message(60, "Opening table with criteria=" & criteria) > Set table = autodrs_db.OpenRecordset _ > (criteria, dbOpenDynamic, 0, dbOptimistic) > If table.RecordCount = 0 Then > Call debug_message(60, "Record not found, adding new") > task = "Add" > table.AddNew > Else > Call debug_message(60, "Record found, updating") > task = "Update" > table.Edit > End If > > lngStatusDB = load_xxx_to_db(table_name, table, keyname, > keyname2, keyname3, keyname4, keyname5) > Call debug_message(60, " - load_xxx_to_db exit status " + > Str(lngStatusDB)) > If lngStatusDB = 0 Then > Call debug_message(60, " + updating table") > table.Update > Call debug_message(60, " - updating table") > Else > table.CancelUpdate > load_xxx = lngStatusDB > GoTo subroutine_exit > End If > > The line "table.Update" is where the access violation is occuring. As > explained before the error only occurs if the update is adding a new > record to the table, updating existing records works fine. > > The function load_xxx_to_db called just before the update basically > loops through the message received and puts the data into the > appropriate field in the "table" buffer - the code is as follows: > > Private Function load_xxx_to_db(table_name As String _ > , table As Recordset _ > , keyname As String _ > , keyname2 As String _ > , keyname3 As String _ > , keyname4 As String _ > , keyname5 As String) As Long > > Dim ddmmyy As String > > On Error GoTo error_trap > > indexx = key_id_field + 1 > Call debug_message(80, " + load_xxx_to_db") > If table_name = "Employees" Then > 'Last 60 fields of employee record are loaded to a different > table, bypass them in this load. > item_count = item_count - 60 > End If > > ' The following section sets all the fields from the DMQ message > into the appropriate fields in the database. > Do Until (indexx > item_count) > Select Case field_type(indexx) > 'Straight text/string. > Case "T" > Call debug_message(90, " + load_xxx_to_db > > Setting " & _ > field_name(indexx) & > ".value to " & _ > field_contents(indexx)) > table(field_name(indexx)).value _ > = field_contents(indexx) > 'Date in the formate dd-mmm-yyyy > Case "X", "J", "I", "E" > If ((field_contents(indexx) = "") Or > (field_contents(indexx) = "00000000000")) Then > 'Yes I know we shouldn't use Nulls, but this is > replicating another database not designed/managed by me > 'and I can't change this fact. > Call debug_message(90, " + load_xxx_to_db > > Setting " & _ > field_name(indexx) & > ".value to Null") > table(field_name(indexx)).value = Null > Else > Call debug_message(90, " + load_xxx_to_db > > Setting " & _ > field_name(indexx) & > ".value to " & _ > field_contents(indexx)) > table(field_name(indexx)).value _ > = field_contents(indexx) > End If > 'Time > Case "V" > Call debug_message(90, " + load_xxx_to_db > > Setting " & _ > field_name(indexx) & ".value > to " & _ > field_contents(indexx)) > table(field_name(indexx)).value _ > = cvt_time(field_contents(indexx)) > 'Numeric > Case "B", "W", "L", "F", "M", "1", "2", "3", "4", "5", > "6", "7", "8", "9" > If (IsNumeric(field_contents(indexx))) Then > Call debug_message(90, " + load_xxx_to_db > > Setting " & _ > field_name(indexx) & > ".value to " & _ > field_contents(indexx)) > table(field_name(indexx)).value _ > = Val(field_contents(indexx)) > Else > 'Yes I know we shouldn't use Nulls, but this > is replicating another database not designed/managed by me > 'and I can't change this fact. > Call debug_message(90, " + load_xxx_to_db > > Setting " & _ > field_name(indexx) & > ".value to Null") > table(field_name(indexx)).value = Null > End If > 'Other unknown data type. > Case Else > Call log_load_error(table_name, "Unsupported data type") > load_xxx_to_db = -10 > GoTo subroutine_exit > End Select > indexx = indexx + 1 > Loop > load_xxx_to_db = 0 > subroutine_exit: > Exit Function > > error_trap: > Dim MyError As Error > For Each MyError In DBEngine.Errors > With MyError > Call debug_message(10, "--ODBC update error, " + > Str(.Number) + " : " + .Description) > End With > Next MyError > > End Function > > Relevant section of the resulting logfile: (I've added a lot more than > normal debugging lines to try tracking down what is causing it. > > > "9/03/2007 6:12:29 AM dbg 80- [+loading sundry product table]" > "9/03/2007 6:12:29 AM dbg 70- > [+load_table(Sundry_Product,Product_id,Dealer_id,Franchise,Workshop,Price_Type)]" > > "9/03/2007 6:12:29 AM dbg 60- [Criteria = Product_id = 'BULLBAR' and > Dealer_id = 'F65' and Franchise = 'BLANK' and Workshop = '0' and > Price_Type = '0']" > "9/03/2007 6:12:29 AM dbg 60- [Opening table with criteria=Select * > from Sundry_Product where Product_id = 'BULLBAR' and Dealer_id = > 'F65' and Franchise = 'BLANK' and Workshop = '0' and Price_Type = > '0']" > "9/03/2007 6:12:46 AM dbg 60- [Record not found, adding new]" > "9/03/2007 6:12:46 AM dbg 80- [ + load_xxx_to_db]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DEALER_ID.value to F65]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DATE_CHANGED.value to 06-Mar-2007]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > TIME_CHANGED.value to 1809]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRODUCT_ID.value to BULLBAR]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DES_1.value to Bullbar]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DES_2.value to ]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DES_3.value to ]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DES_4.value to ]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRODUCT_TYPE.value to S]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRODUCT_SALES_GROUP.value to 45]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRICE_1.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRICE_2.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRICE_3.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRICE_4.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > COST.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PARTS_HANDLING.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > INCLUDING_SALES_TAX.value to ]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PARTS_HANDLING_LIMIT.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > HANDLING_LIMIT_PER_PART.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DISC_TYPE.value to ]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DISC_PERCENTAGE.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > MARK_UP_PERCENTAGE.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > ROUND_UP_TO.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > SUBTRACT_FROM_ROUND_UP.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DISC_MINIMUM.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > DISC_MAXIMUM.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > SUPPLIER_NO.value to 113]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > HANDLING_LIMIT_PER_RO.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > OBSOLETE.value to ]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > FRANCHISE.value to BLANK]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > WORKSHOP.value to 0]" > "9/03/2007 6:12:46 AM dbg 90- [ + load_xxx_to_db > Setting > PRICE_TYPE.value to 0]" > "9/03/2007 6:12:46 AM dbg 60- [ - load_xxx_to_db exit status 0]" > "9/03/2007 6:12:46 AM dbg 60- [ + updating table]" > <logfile stops here everytime showing that the table.Update line is > the point of failure> > > Apologies again for the length of this... but hey, you asked for it ;) > > Regards, > Paul. >
В списке pgsql-odbc по дате отправления:
Следующее
От:Дата:
Сообщение: [ psqlodbc-Bugs-1000681 ] Error when using ODBC driver with Microsoft Access