Последовательность запросов для MS SQL с HDBC-ODBC
Как правильно использовать одно соединение и выполнять несколько запросов при подключении к серверу MS SQL из Haskell?
import qualified Database.HDBC as DB
import qualified Database.HDBC.ODBC as DB
import Data.Time.Calendar (fromGregorian)
import Control.Monad (forM_)
testQueries :: String -> IO ()
testQueries connectionString =
do
conn <- DB.connectODBC connectionString
forM_ [startDate..endDate] $ \date -> do
putStrLn $ "processing date: " ++ show date
putStrLn . show . length <$> DB.quickQuery' conn q []
DB.disconnect conn
where
q :: String
q =
"SELECT TOP 10 * FROM INFORMATION_SCHEMA.COLUMNS"
startDate =
fromGregorian 2016 9 14
endDate =
fromGregorian 2016 11 29
Как с драйверами ODBC, так и с драйверами FreeTDS этот запрос не выполняется после обработки недетерминированного числа дат. Кроме того, он никогда не печатает выходные данные (10 ожидаемых) в стандартный вывод. Образец вывода:
processing date: 2016-09-14
processing date: 2016-09-15
processing date: 2016-09-16
processing date: 2016-09-17
processing date: 2016-09-18
processing date: 2016-09-19
processing date: 2016-09-20
processing date: 2016-09-21
processing date: 2016-09-22
processing date: 2016-09-23
processing date: 2016-09-24
processing date: 2016-09-25
processing date: 2016-09-26
processing date: 2016-09-27
processing date: 2016-09-28
exe: Prelude.chr: bad argument: 5832776
Этот шаблон использования неверен?
Системная информация:
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 17.10
Release: 17.10
Codename: artful
$ cat /etc/odbcinst.ini
[ODBC Driver 17 for SQL Server]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.0.so.1.1
UsageCount=1
[FreeTDS]
Description = FreeTDS
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount = 1
1 ответ
Как с драйверами ODBC, так и с драйверами FreeTDS этот запрос не выполняется после обработки недетерминированного числа дат.
Эта проблема, по-видимому, была зарегистрирована как проблема #28 GitHub для HDBC-OBCD. Предложенный обходной путь заключается в том, чтобы подготовить DSN=
к строке подключения.
Кроме того, он никогда не печатает выходные данные (10 ожидаемых) в стандартный вывод.
Тип putStrLn . show . length <$> DB.quickQuery' conn q []
является IO (IO ())
, Вы создаете IO
вычисление, которое печатает длину, но вы фактически не выполняете ее. Чтобы исправить это, замените (<$>)
с (>>=)
или что-то эквивалентное этому:
DB.quickQuery' conn q [] >>= putStrLn . show . length
putStrLn . show . length =<< DB.quickQuery' conn q []
rows <- DB.quickQuery' conn q []
putStrLn . show . length $ rows
PS: putStrLn . show
может быть более удобно написано как print
,