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 的表,[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 数据 ,y与数据列表 , 结合起来的问题xs。该map函数采用单个函数并将其应用于列表中的每个元素,返回结果列表。如果我们将单曲y放入一个函数中,我们可以map将它放到列表中,并为列表中的每个项目获取结果。例如:

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

将导致:

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

要将您y的 urlId 与xs包含来源的 URLId 结合起来,您可以编写

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 回答