2016-12-18 27 views
0

養活用戶輸入作爲參數傳遞給一個SQLite LIKE子句中我的程序有我如何在Haskell

search = do 
    conn <- dbConnect 
    let query = "SELECT * FROM mytables WHERE story LIKE '%engine%'" 
    result <- quickQuery' conn query [] 
    mapM_ print(...) 
    disconnect conn 

這個工程並搜索字符串,並返回在其發生的完整場。我希望能夠從用戶那裏獲得字符串。我遇到的問題是%。我知道我需要的搜索參數,但一旦我修改說,像這樣的

search key = do 
conn <- dbConnect 
    let query = "SELECT * FROM mytables WHERE story LIKE '%key%'" 
    result <- quickQuery' coon query [] 
    mapM_ print(...) 
    disconnect conn 

我無法找到任何通過用戶輸入到它的一種方式。沒有任何錯誤,但與任何事物都不匹配。 我一直在試圖找到這件事,但我沒有運氣。這是我的第一個問題,我希望我已經提供了足夠的細節,如果不讓我知道。感謝您的任何建議。

quickQuery' :: IConnection conn => conn -> String -> [SqlValue] -> IO [[SqlValue]] 

所以quickQuery」需要一個連接字符串(= sql查詢)和參數列表(= [SqlValue]) 在我沒有使用可替換參數我的代碼,所以我在傳球是正確的它[]。 但我現在還使用可替換參數

search key = do 
    conn <- dbConnect 
    let query = "SELECT * FROM mytables WHERE story LIKE (?)" 
    result <- quickQuery' conn query [toSql key] 
    mapM_ print(...) 
    disconnect conn 

它編譯,但我有同樣的問題,因爲我真的需要%鍵%,否則它沒有找到我想要查找的單詞試圖版本。它將接受它的唯一方式是「%key%」,但是然後%成爲一個普通的字符而不是一個普通的字符。

回答

0

我終於解決了我的問題。這是可用的代碼。

search key = do 
    conn <- dbConnect 
    let query = "SELECT * FROM mytables WHERE story LIKE ('%' || ? || '%'?)" 
    result <- quickQuery' conn query [toSql key] 
    mapM_ print(...) 
    disconnect conn 

其中|運算符是SQLite連接。

0

佔位符使用?,例如參見http://book.realworldhaskell.org/read/using-databases.html

如果你看簽字quickQuery :: IConnection conn => conn -> String -> [SqlValue] -> IO [[SqlValue]],你會在那裏看到[SqlValue]

這些是你正在尋找的替代值...

那麼,如何構建一個SqlValue,讓我們來看看(https://hackage.haskell.org/package/HDBC-2.4.0.1/docs/Database-HDBC.html#t:SqlValue):

有很多構造這種類型的,但我猜你想要的是SqlString String,因爲這是你的查詢是應該做的

所以在最後,你需要修改你的代碼看起來像下面:

search key = do conn <- dbConnect let query = "SELECT * FROM mytables WHERE story LIKE '%?%'" result <- quickQuery' coon query [SqlString key] mapM_ print(...) disconnect conn

+0

謝謝,這是有道理的。我剛剛嘗試過,但現在出現錯誤。異常:SqlError {seState =「」,seNativeError = -1,seErrorMsg =「在HDBC執行中,收到[SqlString \」ambassador \「]但期望0 args。」}。 – Anna

+0

我現在正在遲到。我會咀嚼這個,並在早上回到它。 – Anna

+0

以下您的評論我已經嘗試在代碼中使用可替換的參數,我更新了我的問題。 – Anna