<br><br><div class="gmail_quote">On Wed, Apr 7, 2010 at 9:08 PM, Tim Docker <span dir="ltr">&lt;<a href="mailto:twd2@dockerz.net">twd2@dockerz.net</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I&#39;m experimenting with haskell and relational databases. I have<br>
successfully coupled unixodbc + freetds + hdbc-odbc, and can make<br>
trivial queries. However, I&#39;m surprised at the result types:<br>
<br>
$ ghci<br>
GHCi, version 6.10.3: <a href="http://www.haskell.org/ghc/" target="_blank">http://www.haskell.org/ghc/</a>  :? for help<br>
Loading package ghc-prim ... linking ... done.<br>
Loading package integer ... linking ... done.<br>
Loading package base ... linking ... done.<br>
Prelude&gt; c &lt;-  Database.HDBC.ODBC.connectODBC<br>
     &quot;DSN=xxxxx;UID=xxxxx;PWD=xxxx&quot;<br>
Loading package syb ... linking ... done.<br>
Loading package base-3.0.3.1 ... linking ... done.<br>
Loading package array-0.2.0.0 ... linking ... done.<br>
Loading package containers-0.2.0.1 ... linking ... done.<br>
Loading package bytestring-0.9.1.4 ... linking ... done.<br>
Loading package old-locale-1.0.0.1 ... linking ... done.<br>
Loading package old-time-1.0.0.2 ... linking ... done.<br>
Loading package mtl-1.1.0.2 ... linking ... done.<br>
Loading package utf8-string-0.3.5 ... linking ... done.<br>
Loading package time-1.1.4 ... linking ... done.<br>
Loading package convertible-1.0.9 ... linking ... done.<br>
Loading package HDBC-2.2.4 ... linking ... done.<br>
Loading package HDBC-odbc-2.2.3.0 ... linking ... done.<br>
Prelude&gt; Database.HDBC.quickQuery c &quot;select 1+3&quot; []<br>
[[SqlByteString &quot;4&quot;]]<br>
Prelude&gt;<br>
<br>
Why do I see an SqlByteString returned, rather than a numeric type?<br></blockquote><div><br></div><div>The query consists of one column and one row of an integer whose value is 4.  But, ODBC lets you request your data as some other type if you like during the call to SQLFetch.  You set this up during SQLBindCol.  It&#39;s up to the database to support (or not) the conversion from the type it has to the type you requested.  I think pretty much every database supports converting its types to string.  What I&#39;m getting at, is that yes the database should be holding an int for you to fetch, but the code is requesting it as a string.</div>
<div><br></div><div>You can read more about how it works here:</div><div><a href="http://msdn.microsoft.com/en-us/library/ms709280(v=VS.85).aspx">http://msdn.microsoft.com/en-us/library/ms709280(v=VS.85).aspx</a> </div><div>
<br></div><div>Furthermore, your specific case is not giving the database any hint as to what type you&#39;re expecting.  There is no table schema to go by, no cast in the query, etc.  You might try your example using the odbc interactive sql prompt &#39;isql&#39; and see what type it gets from your database.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
Taking a closer look at the HDBC-ODBC implementation it would appear<br>
that data will always be returned as SqlByteString, or as SqlNull.<br></blockquote><div><br></div><div>I can&#39;t really comment here because I&#39;m not familiar with the internals of HDBC, but I&#39;m familiar with the internals of Takusen.  In Takusen, the type of the function you use to fetch data determines if there is a conversion during the SQLFetch.  This is setup with some type classes.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
Is this the intended behaviour, or just a sign of an incomplete<br>
implementation of the ODBC driver? It would certainly seem possible for<br>
the ODBC driver to return more specific types.<br></blockquote><div><br></div><div>I suspect the solution is to correctly tell Haskell what type you expect and then hopefully HDBC will do the conversion.  For example, using fromSql:</div>
<div><a href="http://software.complete.org/static/hdbc/doc/Database-HDBC.html#v%3AfromSql">http://software.complete.org/static/hdbc/doc/Database-HDBC.html#v%3AfromSql</a></div><div><br></div><div>Alternatively, you could try Takusen.  The types are a bit harder to understand at first compared to HDBC, but it seems to really work well once you get the hang of it.  If you&#39;re using the ODBC backend you&#39;ll need the darcs version of Takusen.  The version on hackage has at least a few ODBC bugs that are show stoppers, but are corrected in the darcs version:</div>
<div>  darcs get --lazy <a href="http://darcs.haskell.org/takusen">http://darcs.haskell.org/takusen</a></div><div><br></div><div>I hope that helps,</div><div>Jason</div></div>