哈斯克尔的简洁和优雅让我印象深刻。但是我在一个.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