Bug #44199 | Unable to INSERT columns into view using ODBC 5.1.6/ADO | ||
---|---|---|---|
Submitted: | 10 Apr 2009 0:11 | Modified: | 10 Apr 2009 22:29 |
Reporter: | John Kounis | Email Updates: | |
Status: | Can't repeat | Impact on me: | |
Category: | Connector / ODBC | Severity: | S2 (Serious) |
Version: | 5.1.6 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[10 Apr 2009 0:11]
John Kounis
[10 Apr 2009 8:37]
Tonci Grgin
Hi John and thanks for your report. I have two problems on my side: o I'm on W2K8SE x64 o Don't have Access right now Writing test case in VS2005 against remote MySQL server 5.1.31 on OpenSolaris x64 box works as expected: o Test case: Dim cnn As ADODB.Connection Dim strConnectString As String strConnectString = "Provider=MSDASQL.1;Persist Security Info=True;DSN=5-1-5-x64-on-opensol" cnn = New ADODB.Connection cnn.CommandTimeout = 1800 cnn.ConnectionTimeout = 1800 cnn.Open(strConnectString) cnn.Execute("drop view if exists vbug44199") cnn.Execute("drop table if exists bug44199") cnn.Execute("create table bug44199(Line1 VARCHAR(30) NOT NULL PRIMARY KEY)") cnn.Execute("create view vbug44199 AS select Line1 AS ViewLine1 from bug44199") Dim rs As ADODB.Recordset rs = New ADODB.Recordset With rs .ActiveConnection = cnn .LockType = ADODB.LockTypeEnum.adLockOptimistic .CursorType = ADODB.CursorTypeEnum.adOpenDynamic .CursorLocation = ADODB.CursorLocationEnum.adUseClient .Open("SELECT * FROM vbug44199") .AddNew() rs.Fields(0).Value = "Test bug 44199" .Update() .Close() End With Dim rs1 As ADODB.Recordset rs1 = New ADODB.Recordset With rs1 .ActiveConnection = cnn .LockType = ADODB.LockTypeEnum.adLockOptimistic .CursorType = ADODB.CursorTypeEnum.adOpenDynamic .CursorLocation = ADODB.CursorLocationEnum.adUseClient .Open("SELECT * FROM vbug44199") .Update("ViewLine1", "New name bug#44199") .Update() .Close() End With cnn.Close() cnn = Nothing and the log: tonci01@opensol:~# tail /var/lib/mysql/opensol.log 130 Query SELECT @@tx_isolation 130 Query drop view if exists vbug44199 130 Query drop table if exists bug44199 130 Query create table bug44199(Line1 VARCHAR(30) NOT NULL PRIMARY KEY) 130 Query create view vbug44199 AS select Line1 AS ViewLine1 from bug44199 130 Query SELECT * FROM vbug44199 130 Query INSERT INTO `test`.`vbug44199` (`ViewLine1`) VALUES ('Test bug 44199') 130 Query SELECT * FROM vbug44199 130 Query UPDATE `test`.`vbug44199` SET `ViewLine1`='New name bug#44199' WHERE `ViewLine1`='Test bug 44199' 090410 10:14:57 130 Quit tonci01@opensol:~# I have also tested this: .AddNew() rs.Fields(0).Value = "Test bug 44199" .Update() .AddNew() rs.Fields("ViewLine1").Value = "Test bug 44199-take 2" .Update() and it works proving rs.Fields structure has been populated correctly. What might be happening at your side is that server is not returning enough metadata. You can check this in BugsDB, look for views and Org_table (you can obtain this info by starting cmd line client with -T option in MySQL server 5.0 or with --column-type-info in 5.1+). I tested with c/ODBC 5.1.5GA and latest snapshot, 5.1.6r823. ADODB used is 7.0.3300.0. What you can do now is to attach ODBC traces from both c/ODBC 3.51 and 5.1 so I can see what Access messed up. A snip from general query log from MySQL server would be nice too.
[10 Apr 2009 9:08]
Tonci Grgin
Ok, found 32bit XPPro box with Office2003Pro. In "Tables" I linked view in question and checked fetch/insert works. In "Forms" I created form showing linked view with wizard. Added button and following code: Private Sub Command2_Click() On Error GoTo Err_Command2_Click Set cnn = New ADODB.Connection cnn.Open "DRIVER={MySQL ODBC 5.1 Driver}; SERVER=**; PORT=3306; DATABASE=test;OPTION=3;User=**;Password=**;" Set rst = New ADODB.Recordset rst.Open "vbug44199", cnn, adOpenForwardOnly, adLockOptimistic rst.AddNew rst!ViewLine1 = "TEST" rst.Update rst.Close cnn.Close Set rst = Nothing Set cnn = Nothing Exit_Command2_Click: Exit Sub Err_Command2_Click: MsgBox Err.Description Resume Exit_Command2_Click End Sub Everything works as expected.
[10 Apr 2009 20:55]
John Kounis
I tried your code and it works fine on my machine. The difference is that my code uses a server-side cursor (rs.CursorLocation = adUseServer), whereas your code uses a client-side cursor (adUseClient). The bug only appears if rs.CursorLocation is set to "adUseServer" I'll get the ODBC logs for you and attach them in my next post.
[10 Apr 2009 22:18]
John Kounis
SQL 5.1.6 bug (with error at the end)
Attachment: SQL51.LOG (application/force-download, text), 194.48 KiB.
[10 Apr 2009 22:18]
John Kounis
SQL 3.51 log (no errors)
Attachment: SQL351.LOG (application/force-download, text), 190.51 KiB.
[10 Apr 2009 22:29]
John Kounis
For further information, I am using: MS Access 2003 (11.8166.8202) SP3 ADO version 2.81.1132.0 (NOTE: You mentioned a completely different version number for ADO, so I'm not sure which number you used. This is the version number of msado15.dll on my machine) ODBC Connector: 5.1.6r823 MySQL version: 5.0.67-0ubuntu6
[13 Apr 2009 4:18]
Jess Balint
This is working correctly w/5.1.30 and server cursor: 2057 Query INSERT INTO viewTEST1 ( viewFld1) VALUES(_latin1'TEST') I will try w/5.0 tomorrow.