我写了下面的代码在F#中执行一个SQLServer StoredProc数据库连接和F#
module SqlUtility =
open System
open System.Data
open System.Data.SqlClient
SqlUtility.GetSqlConnection "MyDB"
|> Option.bind (fun con -> SqlUtility.GetSqlCommand "dbo.usp_MyStordProc" con)
|> Option.bind (fun cmd ->
let param1 = new SqlParameter("@User", SqlDbType.NVarChar, 50)
param1.Value <- user
cmd.Parameters.Add(param1) |> ignore
let param2 = new SqlParameter("@PolicyName", SqlDbType.NVarChar, 10)
param2.Value <- policyName
cmd.Parameters.Add(param2) |> ignore
Some(cmd)
)
|> Option.bind (fun cmd -> SqlUtility.ExecuteReader cmd)
|> Option.bind (fun rdr -> ExtractValue rdr)
let GetSqlConnection (conName : string) =
let conStr = ConfigHandler.GetConnectionString conName
try
let con = new SqlConnection(conStr)
con.Open()
Some(con)
with
| :? System.Exception as ex -> printfn "Failed to connect to DB %s with Error %s " conName ex.Message; None
| _ -> printfn "Failed to connect to DB %s" conName; None
let GetSqlCommand (spName : string) (con : SqlConnection) =
let cmd = new SqlCommand()
cmd.Connection <- con
cmd.CommandText <- spName
cmd.CommandType <- CommandType.StoredProcedure
Some(cmd)
let AddParameters (cmd : SqlCommand) (paramList : SqlParameter list) =
paramList |> List.iter (fun p -> cmd.Parameters.Add p |> ignore)
let ExecuteReader (cmd : SqlCommand) =
try
Some(cmd.ExecuteReader())
with
| :? System.Exception as ex -> printfn "Failed to execute reader with error %s" ex.Message; None
我有这个代码
首先重复使用Option.bind的多重问题非常刺激......并且增加了噪音。我需要一个更清晰的方法来检查输出是否为None,如果不是则继续。
最后应该有一个清理功能,我应该能够关闭+配置阅读器,命令和连接。但是现在在管道的尽头,我只有读者。
正在添加参数的函数...它看起来像修改了命令参数的“状态”,因为返回类型仍然是发送给它的同一个命令......并带有一些添加状态。我不知道一个更有经验的功能程序员是如何做到这一点的。
Visual Studio在我做异常处理的每个地方给我一个警告。这有什么错,”它说
这种类型的测试或沮丧的总是拥有
我想这段代码的方式看是这样的
设X:MyRecord序列=的getConnection‘CON’ |> GetCommand “CMD” |> AddParameter “@name” SqlDbType.NVarchar 50 |> AddParameter “@policyname” SqlDbType.NVarchar 50 |>的ExecuteReader |> FunctionToReadAndGenerateSeq |> CleanEverything
你能推荐我怎么才能把我的代码达到所需的水平,也是其他任何改进?