2016-05-16 16 views
1

最近我開始使用haskell中的sqlite3工作,我想知道如何使用參數作爲偏移量修改表中的變量?用Haskell中的參數更新Sqlite3

我願做這樣的事情:

execute_ conn "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, v INTEGER)" 

execute conn "INSERT INTO test (v) VALUES (?)" (Only ("1" :: String)) 

execute conn "UPDATE test SET v = v + ?" (Only modifyingValue) <--- this is not working 

謝謝。

+0

什麼是錯誤訊息?它是編譯器錯誤還是運行時錯誤? – ErikR

+0

這是一個運行時錯誤:SQLite3在嘗試執行準備時返回了ErrorMisuse「UPDATE測試SET v =?」:調用序列外的庫例程 – Relu

回答

0

這裏是關於ErrorMisuse錯誤信息:

https://www.sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence

也許連接已經關閉?或者你在兩個不同的線程中使用相同的連接?

下面是一些示例代碼的工作原理:

{-# LANGUAGE OverloadedStrings #-} 

import   Control.Applicative 
import qualified Data.Text as T 
import   Database.SQLite.Simple 
import   Database.SQLite.Simple.FromRow 

dumpTable conn table = do 
    r <- query_ conn "SELECT * from test" :: IO [(Int,String,Int)] 
    mapM_ print r 

main :: IO() 
main = do 
    conn <- open "test.db" 
    execute_ conn "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, firstname TEXT, pets INTEGER)" 
    execute conn "INSERT INTO test (firstname, pets) VALUES (?,?)" 
       ("Alice" :: String, 2 :: Int) 
    execute conn "INSERT INTO test (firstname, pets) VALUES (?,?)" 
       ("Bob" :: String, 3 :: Int) 
    putStrLn "before:" 
    dumpTable conn "test" 
    execute conn "UPDATE TEST SET pets = pets + ?" (Only (4 :: Int)) 
    putStrLn "after:" 
    dumpTable conn "test" 
    close conn 
+0

是的,我在3個線程中使用連接,因爲我的程序的目的是來測試sqlite是否是單線程的。如果這是錯誤的原因,那麼我的測試似乎證明sqlite不是多線程的。謝謝:D – Relu

+0

每個連接都是單線程的,但sqlite允許併發訪問和更新,所以只需爲每個線程打開一個新的連接。 – ErikR

+0

例如 - 看到這個答案:http://stackoverflow.com/questions/4060772/sqlite3-concurrent-access – ErikR