[python-win32] MS Access: silent overflow failure
Robert Brewer
fumanchu at amor.org
Tue Mar 27 22:55:39 CEST 2007
Mark Hammond wrote:
> Robert Brewer wrote:
> > The small demo script below makes ADO calls to a Microsoft
> > Access (Jet)
> > database via win32com. But it fails in a potentially dangerous way;
> > "SELECT int * int;" can return None with no warning if the result is
> > large enough. This can also occur if one or both of the
> > operands is a column reference.
> >
> > The same SQL run as a Query inside the Access GUI works as expected.
> > Manually changing one of the ints to a Single by appending
> > ".0" works as expected.
> >
> > Any ideas about where I need to look next to find the cause
> > of, and then fix, this behavior?
>
> I'd suggest using VB to see if the behaviour is different
> than with Python. If it is and we can narrow a test case to
> a very small snippet, then we can probably sort out why. If
> VB works the same, it is likely to be a "feature" of ADO as
> implemented, and not much we can do.
Below is a VB 4 demo (wow, that takes me back! :).
The return value on overflow is a zero-length string.
Robert Brewer
System Architect
Amor Ministries
fumanchu at amor.org
' demo_access_overflow.bas
Attribute VB_Name = "Module1"
Option Explicit
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
Const dbname = "test.mdb"
Sub create_db()
Dim cat As New ADOX.Catalog
cat.Create "PROVIDER=MICROSOFT.JET.OLEDB.4.0;DATA SOURCE=" & dbname
cat.ActiveConnection.Close
End Sub
Function fetch(query, conn) As String
Dim res As New ADODB.Recordset
res.Open query, conn, adOpenForwardOnly, adLockReadOnly, -1
Dim Data As Variant
Data = res.GetRows(1, 0)
fetch = Data(0, 0)
res.Close
End Function
Sub Main()
create_db
Dim conn As New ADODB.Connection
conn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source='" & dbname
& "'", "", "", -1
' This works fine.
Dim Data As String
Data = fetch("SELECT 86400;", conn)
If Data <> 86400 Then MsgBox (Data)
' This fails because data is ""
Data = fetch("SELECT 62647 * 86400;", conn)
If Data <> CStr(CSng(62647) * CSng(86400)) Then
MsgBox (Data & " (len " & Len(Data) & ")")
End If
conn.Close
Kill dbname
End Sub
More information about the Python-win32
mailing list