F#将列表插入SQL Server

Cas*_*dit 4 sql database f# list

我暂时试图找出一种从F#插入SQL Server的方法.

我有一个F#函数,它按照用户定义的模式迭代文件夹中的所有文件.然后我可以使用返回的数据放入列表或(理想情况下)插入数据库.

我已经有一个正常工作的insert-to-sql函数:

let execNonQuery conn s =
let comm = 
    new SqlCeCommand(s, conn)
try 
    comm.ExecuteNonQuery() |> ignore
with e ->
    printf "Error : %A\n" e

let string = "insert into MyTable (MyColumn) values ('test .. again')"
execNonQuery conn string; // works
Run Code Online (Sandbox Code Playgroud)

我正在尝试使此方法正常工作:

let rec getAllFiles dir pattern =
    seq { yield! Directory.EnumerateFiles(dir, pattern)
          for d in Directory.EnumerateDirectories(dir) do
              yield! getAllFiles d pattern }

let getApplications (dir : string) (extension : string) = 
    getAllFiles  dir extension
    //|> Seq.toList // If I need to create a list of returned values
    |> Seq.iter (fun s -> SQLInsertString s) // This does not work as it complains about the function not being of type unit
Run Code Online (Sandbox Code Playgroud)

如果我Seq.toList只使用并按以下方式调用该函数,它的工作原理如下:

getApplications "C:\Admin" "*.txt" // works
Run Code Online (Sandbox Code Playgroud)

我不明白的另一件事是你如何创建一个工作插入命令,它接受Value的字符串.例如:

let SQLInsertString s = "insert into MyTable (MyColumn) values (%s)" //does not work
Run Code Online (Sandbox Code Playgroud)

pad*_*pad 5

你快到了.问题是使用不合法的sqlInsertString退货.stringSeq.iter

你正在做的sqlInsertString是使用字符串格式创建一个字符串.它非常适合sprintf功能:

let sqlInsertString s = 
    sprintf "insert into MyTable (MyColumn) values (%s)" s
Run Code Online (Sandbox Code Playgroud)

现在您可以使用execNonQuery结果sqlInsertString将数据实际插入数据库.自execNonQuery返回以来unit,它可以很容易地用于Seq.iter:

// Assuming conn is a global and already defined variable.
let getApplications (dir : string) (extension : string) = 
    getAllFiles  dir extension
    |> Seq.iter (fun s -> execNonQuery conn (sqlInsertString s))
Run Code Online (Sandbox Code Playgroud)

由于类型注释是多余的,因此可以用更惯用的方式重写代码:

let getApplications dir extension conn = 
    getAllFiles dir extension
    |> Seq.iter (sqlInsertString >> execNonQuery conn)
Run Code Online (Sandbox Code Playgroud)