Haskell の簡潔さと優雅さに感銘を受けました。しかし、私は .Net ハウスで働いているので、F# を使いこなせるときは F# を使用しています。全国で F# を使用しているのは、おそらく私だけです。
ADO.NET または F# は、HDBC のように簡潔でエレガントなものを提供しますexecuteMany
か? 私はReal World Haskellを通り抜けています。第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 インジェクション攻撃を回避するためにパラメーター化されたクエリを使用するという誇大宣伝をたくさん見てきました。この場合、次の 3 つの理由でそれらを使用していません。
- .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 してエスケープし、値を引用することができます。
2 つのテーブルのそれぞれに 1 日あたり 9,000 から 10,000 レコードをインポートするので、これをできるだけ効率的に行いたいと考えています。したがって、executeMany
Haskell に興味があります。とはいえ、パラメーター化されたクエリの背後にあるアイデアも好きですし、Hasell がそれらを実装する方法も気に入っています。F# の簡潔さと優雅さに相当するものはありますか?