tôi đã viết đoạn code sau đây để thực hiện một StoredProc SQLServer trong F #Database Connections và 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
Tôi có nhiều vấn đề với mã này
Trước hết việc sử dụng lặp đi lặp lại của Option.bind rất khó chịu ... và đang thêm tiếng ồn. Tôi cần một cách rõ ràng hơn để kiểm tra xem đầu ra là Không và nếu không thì tiến hành.
Cuối cùng, cần có một chức năng dọn dẹp nơi tôi có thể đóng + hủy bỏ trình đọc, lệnh và kết nối. Nhưng hiện tại ở cuối đường ống tất cả những gì tôi có là người đọc.
Chức năng đang thêm tham số ... có vẻ như nó đang sửa đổi "trạng thái" của tham số lệnh vì kiểu trả về vẫn là lệnh được gửi ... với một số trạng thái được thêm vào. Tôi tự hỏi làm thế nào một lập trình viên chức năng có kinh nghiệm hơn sẽ làm điều này.
Visual Studio cung cấp cho tôi cảnh báo ở từng nơi tôi xử lý ngoại lệ. có gì sai với điều đó" nó nói
thử nghiệm loại này hoặc nhìn xuống sẽ luôn giữ
Con đường tôi muốn mã này nhìn là
let x này: MyRecord seq = getConnection 'con' Quay lại đầu trang | đến mức mong muốn và bất kỳ cấp độ nào khác cải tiến?