<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi,<br>
    <br>
    I've ripped  System.Data.Odbc out of mcs/class, to hold an extended
    little debug-session last Sunday.<br>
    <br>
    Overall, the good message is, that so far, it seems to be working
    perfectly with Sybase, which is strange, but all I need at the
    moment.<br>
    <br>
    I was also reattempting to read some tables in NorthWind.mdb (the
    MS-Access example file), to test whether Access over ODBC now works.<br>
    It's already much better than last time, but unsurprisingly, I've
    still found a few show-stopping bugs, mainly in
    System.Data/System.Data.Odbc/libodbc.cs<br>
    <br>
    <br>
    You have this (in 6 overloads):<br>
    <br>
            [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]<br>
            internal static extern OdbcReturn SQLGetData (<br>
                IntPtr StatementHandle,<br>
                ushort ColumnNumber,<br>
                SQL_C_TYPE TargetType,System.Int64<br>
                byte[] TargetPtr,<br>
                int BufferLen,<br>
                ref int Len);<br>
    <br>
    <br>
    <br>
    But MSDN and the header-file in /usr/include defines SQLGetData like
    this:<br>
    SQLRETURN SQLGetData(<br>
          SQLHSTMT       StatementHandle,<br>
          SQLUSMALLINT   Col_or_Param_Num,<br>
          SQLSMALLINT    TargetType,<br>
          SQLPOINTER     TargetValuePtr,<br>
          SQLLEN         BufferLength,<br>
          SQLLEN *       StrLen_or_IndPtr);<br>
    <br>
    <br>
    Note that SQLLEN thing there:<br>
    typedef long SQLLEN <br>
    <br>
    And while <br>
    sizeof(long) = 4 = sizeof(int) on x86-32 and x86-64 Windows, as well
    as x86-32 Linux<br>
    for x86-64 on Linux sizeof(long) = 8   ==  != sizeof(int) = 4 on
    x86-64 Linux<br>
    <br>
    I got all kinds of wired error messages with a definition like that.<br>
    (credits for discovering the cause go to g++ warnings)<br>
    <br>
    I fixed it for my system by replacing int with System.Int64, which
    works fine FOR ME, since I only need to care about my system.<br>
    You should probably fix it by using IntPtr, but I don't know about
    64-bit Windows.<br>
    <br>
            [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]<br>
            internal static extern OdbcReturn SQLGetData (<br>
                IntPtr StatementHandle,<br>
                ushort ColumnNumber,<br>
                SQL_C_TYPE TargetType,<br>
                byte[] TargetPtr,<br>
                int BufferLen,<br>
                ref int Len);<br>
            <br>
    <br>
    <br>
    Then there is a "bug" in Function GetValue in OdbcDataReader.cs<br>
    Overall, case OdbcType.VarChar seems to be the troublechild.<br>
    <br>
    I did a <br>
    "SELECT CompanyName, City From Customers"; // Access, file
    NorthWind.mdb<br>
    <br>
    <br>
    The result is really an infinite do-while loop <br>
    (i fixed it by just adding a break statement -  no idea how correct
    that is, but I see no reason why this is in a loop at all)<br>
    <br>
    OdbcDataReader --> GetValue --> case OdbcType.VarChar <br>
    <br>
    do { <br>
                            ret = libodbc.SQLGetData (hstmt, ColIndex,
    col.SqlCType, buffer, bufsize, ref outsize);<br>
                            if (ret == OdbcReturn.Error)<br>
                                break;<br>
                            // Fix for strance ODBC drivers (like
    psqlODBC)<br>
                            if (ret == OdbcReturn.Success &&
    outsize==-1)<br>
                                ret = OdbcReturn.NoData;<br>
                            if (ret == OdbcReturn.Success || ret ==
    OdbcReturn.SuccessWithInfo) <br>
                            {<br>
                                if (outsize >= bufsize || outsize ==
    (int)OdbcLengthIndicator.NoTotal) // NoTotal = -4<br>
                                    outsize = bufsize - 1;<br>
                                int charCount =
    defaultDecoder.GetChars(buffer, 0, (int) outsize, charBuffer, 0);<br>
                                <br>
                                sb1.Append(charBuffer, 0, charCount);<br>
                                break;  
    /////////////////////////////////////////////////////// FIXME:
    Infinite loop here ?<br>
                            }<br>
                        } while (ret != OdbcReturn.NoData);<br>
                        DataValue = sb1.ToString ();<br>
                        break;<br>
    <br>
    <br>
    (I added the break with the FIXME comment.)<br>
    <br>
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    <span class="hps" style="color: rgb(51, 51, 51); font-family: arial,
      sans-serif; font-size: 16px; font-style: normal; font-variant:
      normal; font-weight: normal; letter-spacing: normal; line-height:
      normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">For risks</span><span style="color: rgb(51, 51, 51);
      font-family: arial, sans-serif; font-size: 16px; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); display: inline !important; float: none; "><span
        class="Apple-converted-space"> </span></span><span class="hps"
      style="color: rgb(51, 51, 51); font-family: arial, sans-serif;
      font-size: 16px; font-style: normal; font-variant: normal;
      font-weight: normal; letter-spacing: normal; line-height: normal;
      orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">and side effects</span><span class="" style="color:
      rgb(51, 51, 51); font-family: arial, sans-serif; font-size: 16px;
      font-style: normal; font-variant: normal; font-weight: normal;
      letter-spacing: normal; line-height: normal; orphans: 2;
      text-align: -webkit-auto; text-indent: 0px; text-transform: none;
      white-space: normal; widows: 2; word-spacing: 0px;
      -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;
      background-color: rgb(245, 245, 245); ">, read the</span><span
      style="color: rgb(51, 51, 51); font-family: arial, sans-serif;
      font-size: 16px; font-style: normal; font-variant: normal;
      font-weight: normal; letter-spacing: normal; line-height: normal;
      orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); display: inline !important; float: none; "><span
        class="Apple-converted-space"> </span></span><span class="hps"
      style="color: rgb(51, 51, 51); font-family: arial, sans-serif;
      font-size: 16px; font-style: normal; font-variant: normal;
      font-weight: normal; letter-spacing: normal; line-height: normal;
      orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">package leaflet</span><span style="color: rgb(51, 51, 51);
      font-family: arial, sans-serif; font-size: 16px; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">, or </span><span style="color: rgb(51, 51, 51);
      font-family: arial, sans-serif; font-size: 16px; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">ask your</span><span style="color: rgb(51, 51, 51);
      font-family: arial, sans-serif; font-size: 16px; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); display: inline !important; float: none; "></span><span
      class="hps" style="color: rgb(51, 51, 51); font-family: arial,
      sans-serif; font-size: 16px; font-style: normal; font-variant:
      normal; font-weight: normal; letter-spacing: normal; line-height:
      normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); "> doctor</span><span style="color: rgb(51, 51, 51);
      font-family: arial, sans-serif; font-size: 16px; font-style:
      normal; font-variant: normal; font-weight: normal; letter-spacing:
      normal; line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); display: inline !important; float: none; "><span
        class="Apple-converted-space"> </span></span><span class="hps"
      style="color: rgb(51, 51, 51); font-family: arial, sans-serif;
      font-size: 16px; font-style: normal; font-variant: normal;
      font-weight: normal; letter-spacing: normal; line-height: normal;
      orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">or</span><span style="color: rgb(51, 51, 51); font-family:
      arial, sans-serif; font-size: 16px; font-style: normal;
      font-variant: normal; font-weight: normal; letter-spacing: normal;
      line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); display: inline !important; float: none; "><span
        class="Apple-converted-space"> </span></span><span class="hps"
      style="color: rgb(51, 51, 51); font-family: arial, sans-serif;
      font-size: 16px; font-style: normal; font-variant: normal;
      font-weight: normal; letter-spacing: normal; line-height: normal;
      orphans: 2; text-align: -webkit-auto; text-indent: 0px;
      text-transform: none; white-space: normal; widows: 2;
      word-spacing: 0px; -webkit-text-size-adjust: auto;
      -webkit-text-stroke-width: 0px; background-color: rgb(245, 245,
      245); ">pharmacist.</span><br>
    <br>
    <br>
    After this fixes, it's now possible to get the list of CompanyName
    and City from the Customers-table in Access !!!<br>
    Keep up the good work !<br>
    <br>
    However, there is an additional bug:<br>
    For each character with an accent, for example French éèà, etc. and
    German Umlauts (äöüÄÖÜ), it displays one character too few at the
    end of the word...<br>
    I guess this is a bug in the decoder, but it's juuuuust a guess.<br>
    Again, isql works correct here, so it really is a mono bug, and not
    an mdbtools-deficiency.<br>
    <br>
    But congratulations so far, it's now possible to access and modify
    an Access database with mono on Linux.<br>
    (using the mdbtools ODBC driver).<br>
    <br>
    <br>
    /etc/odbc.ini:<br>
    <br>
    [Access_NorthWind_Traders] <br>
    Description = Microsoft Access Database <br>
    Database = /root/DBs/Nwind.mdb<br>
    Driver = /usr/lib/libmdbodbc.so <br>
    Setup = <br>
    FileUsage = 1 <br>
    CPTimeout = <br>
    CPReuse = <br>
    <br>
    <br>
    <br>
    <br>
    Additionally, SQLConnect in libodbc.cs<br>
    has this attribute:<br>
    [DllImport ("odbc32.dll", CharSet = CharSet.Unicode)]<br>
    <br>
    However, if Unicode is specified, it doesn't work with a Firebird
    2.5 DSN.<br>
    All others work fine, however, isql command-line works with all of
    them, including Firebird.<br>
    It also works fine with Firebird on mono if I specify CharSet.Ansi<br>
    <br>
    There are some further bugs afterwards, however.<br>
    (SELECT * FROM employee, in the firebird 2.5 employee
    example-database)<br>
    complete with wrong column names (missing underscore in one column),
    and no data if I access that or other rows...<br>
    Something is really wrong here. But since FireBird has a managed
    provider for mono, it's largely irrelevant.<br>
    <br>
    <br>
    <br>
    If I were you, I would really look that Odbc works.<br>
    If it does, you could replace SqlClient, OracleClient, etc, with
    just a wrapper around Odbc.<br>
    That way you needn't fix all those classes whenever a new version
    appears (SQL Server, Oracle, Sybase, etc.).<br>
    Plus you don't depend on the manufacturers providing an
    implementation for mono (Oracle ODP.NET doesn't provide it).<br>
  </body>
</html>