0
saveX :: [String] -> Int->IO ()
saveX [] y= return ()
sav xs y=
     do conn <- connectSqlite3 "cw.db"
        stmt <- prepare conn "INSERT INTO pic (src,urlId) VALUES (?,?)"
        executeMany stmt <what to add here>
        commit conn

src と urlId の 2 つの列を持つテーブルがあり、[String] には src のリストが含まれ、Int は urlID です。urlId を使用して、すべての src をテーブルに挿入したいと考えています。タプルを変換するいくつかの方法を試しましたが、toSql は機能しません。これで私を助けてください

4

1 に答える 1

2

Real World Haskellにほぼ同じ例があります:

ghci> conn <- connectSqlite3 "test1.db"
ghci> stmt <- prepare conn "INSERT INTO test VALUES (?, ?)"
ghci> executeMany stmt [[toSql 5, toSql "five's nice"], [toSql 6, SqlNull]]
ghci> commit conn
ghci> disconnect conn

編集

あなたの特定のケースでは、これは HDBC の使用方法に関する質問ではなく、通常の Haskell データの 1 つyをデータのリスト と組み合わせる方法に関する質問xsです。このmap関数は単一の関数を取り、それをリスト内のすべての要素に適用して、結果のリストを返します。シングルyを関数に入れるmapと、それをリストに追加して、リスト内のすべてのアイテムの結果を取得できます。例えば:

map (\x -> (x, "One Thing")) [1, 2, 3]

結果は次のとおりです。

[(1, "One Thing"), (2, "One Thing"), (3, "One Thing")]

yurlId をソースを含むものと組み合わせるには、次のxsように記述できます。

map (\x -> [toSql x, toSql y]) xs

これにより、次のコード全体が得られます。

saveX :: [String] -> Int->IO ()
saveX [] y= return ()
sav xs y=
     do conn <- connectSqlite3 "cw.db"
        stmt <- prepare conn "INSERT INTO pic (src,urlId) VALUES (?,?)"
        executeMany stmt (map (\x -> [toSql x, toSql y]) xs)
        commit conn
于 2014-01-06T23:49:39.423 に答える