2016-05-16 6 views
1

最近、私はhaskellでsqlite3の作業を開始しました。オフセットのパラメータを使ってテーブル内の変数をどのように変更することができますか?Saskite3 Update in Haskell

私はこのような何かをしたいと思います:

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 

ありがとうございました。

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

おそらく、接続がすでにクローズされていますErrorMisuseエラーについての情報はここで

+0

エラーメッセージは何ですか?それはコンパイラエラーかランタイムエラーですか? – ErikR

+0

実行時エラーです:SQLite3は、準備 "UPDATE test SET v =?"を実行しようとしているときにErrorMisuseを返しました:ライブラリルーチンがシーケンス外で呼び出されました – Relu

答えて

0

のですか?または、2つの異なるスレッドで同じ接続を使用していますか?ここで

がある作品いくつかのサンプルコード:

{-# 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

たとえば、 - このSOの答えを参照してください:http://stackoverflow.com/questions/4060772/sqlite3-concurrent-access – ErikR

関連する問題