哈斯克爾的簡潔和優雅讓我印象深刻。但是我在一個.Net的房子裏工作,所以我用F#的時候,我可以逃避它 - 我可能是全國數百人中唯一使用它的人。F#中的Haskell HDBC優雅?
ADO.NET或F#提供的內容與HDBC的executeMany
一樣簡潔而優雅嗎?我正在通過Real World Haskell。在chapter 21它提供了這個例子:
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
我希望得到這個優雅和簡潔性在我的F#。我已經看到很多關於使用參數化查詢來避免SQL注入攻擊的炒作。我沒有在這種情況下使用它們,原因有三:
- 我在.Net中發現了參數化查詢的難度和繁瑣。
- 我的數據來自公司辦公室,所以它(大部分)都很乾淨。
- 我的表格有34列。我鄙視使用34列參數化查詢的想法。
這裏是我的F#代碼:
module Data
open System
open System.Data
open System.Data.OleDb
open System.Text.RegularExpressions
type Period = Prior | Current
let Import period records db =
use conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + db + ";Persist Security Info=False;")
let execNonQuery s =
let comm = new OleDbCommand(s, conn) in
comm.ExecuteNonQuery() |> ignore
let enquote = sprintf "\"%s\""
let escapeQuotes s = Regex.Replace(s, "\"", "\"\"")
let join (ss:string[]) = String.Join(",", ss)
let table = match period with
| Prior -> "tblPrior"
| Current -> "tblCurrent"
let statements =
[| for r in records do
let vs = r |> Array.map (escapeQuotes >> enquote) |> join
let vs' = vs + sprintf ",\"14\",#%s#" (DateTime.Now.ToString "yyyy-MM-dd") in
yield sprintf "INSERT INTO %s ([Field01], [Field02], [Field03] [Field04], [Field05], [Field06], [Field07], [Field08], [Field09], [Field10], [Field11], [Field12], [Field13], [Field14], [Field15], [Field16], [Field17], [Field18], [Field19], [Field20], [Field21], [Field22], [Field23], [Field24], [Field25], [Field26], [Field27], [Field28], [Field29], [Field30], [Field31], [Field32], [Field33], [Field34]) VALUES (%s)" table vs' |] in
do conn.Open()
execNonQuery (sprintf "DELETE FROM %s" table)
statements |> Array.iter execNonQuery
我已經改名爲桌,出於安全原因的領域。
因爲桌子上的所有字段都是文本,所以我可以輕鬆地Array.map它們來轉義並引用值。
每天要在9,000到10,000條記錄之間導入到兩個表中的每一個,我希望儘可能高效地完成此操作。因此我對Haskell的executeMany
感興趣。但是,我喜歡參數化查詢背後的想法,我喜歡Hasekll實現它們的方式。 F#中的簡潔和優雅有什麼相同之處?
我不知道它是否像Hasekll一樣優雅,但F#3.0中的類型提供程序比構建插入語句更優雅。 – JonnyBoats 2013-05-01 16:04:28
「*我可能是全國數百人中唯一使用它的人。*」呃,不。 – ildjarn 2013-05-01 16:53:07
@ildjarn讓你誤解他所指的是什麼。我很確定這些「數百人」是他公司裏的人。 – mydogisbox 2013-05-01 16:57:55