2013-10-02 91 views
2

我不喜歡依賴位置參數,是否可以這樣做與HDBC確實Database.HDBC支持命名參數?

我可以看到通過[(String, SqlValue)]而不是[SqlValue]作爲this package各種執行功能的參數。

概括地說,我寧願

select 
    t.f1 
    , t.f2 
    , t.f3 
from 
    schema.table t 
where 
t.f1 > @param1 
and t.f2 < @param2 

select 
    t.f1 
    , t.f2 
    , t.f3 
from 
    schema.table t 
where 
t.f1 > ? 
and t.f2 < ? 

回答

1

不與華夏鄧白氏中國直接,但我與莎士比亞文本包的幫助下做到這一點:

quickQuery cn (T.unpack 
       [st|select bar, baz, foo 
         from table1 r 
         inner join location l on r.locat_id = l.location_id 
         where r.record_id = #{pageIdxId page} 
         and foo > #{var1 + var2} 
         order by 1|]) [] 

注意#{}佔位符中的haskell變量和表達式。

雖然要小心字符串拼接。

使用帶字符串值的sql轉義函數。

sqlEscape :: Text -> Text 
sqlEscape = T.replace "'" "''" 

然後

[st|update foo set bar = '#{sqlEscape someString}' where recid = #{myRecId}|] 

或者如果你是能夠勝任工作,可以採取莎士比亞文本庫,並添加一個小的變化,以它來自動逃避所有isString類型。

+0

謝謝,這是我沒有設想的方法;我現在這樣做 declare(at)param1 type declare(at)param2 type set(at)param1 =? set(at)param2 =? ...聲明的其餘部分 字符串插值的問題是處理潛在的sql注入,綁定的參數我知道我很安全(只要沒有在引擎蓋下生成動態sql) – smoothdeveloper

+0

要小心使用hdbc placeholderes用於更新/插入。他們有一個討厭的bug。它們在值的末尾添加額外的空間。我修正了github上的bug https://github.com/hdbc/hdbc-odbc/pull/10,但它仍然不被主要的存儲庫所接受 –