2016-05-16 91 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