yo escribimos el siguiente código para ejecutar un StoredProc SQLServer en Fa #Conexiones de base de datos y 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
tengo varios problemas con este código
En primer lugar el uso repetido de Option.bind es muy irritante ... y está agregando ruido. Necesito una forma más clara de verificar si la salida fue None y si no, proceder.
Al final debería haber una función de limpieza en la que debería ser capaz de cerrar + desechar el lector, el comando y la conexión. Pero actualmente, al final de la tubería, todo lo que tengo es el lector.
La función que agrega parámetros ... parece que está modificando el "estado" del parámetro de comando porque el tipo de devolución sigue siendo el mismo comando que se le envió ... con algún estado agregado. Me pregunto cómo un programador funcional más experimentado hubiera hecho esto.
Visual Studio me avisa en cada uno de los lugares donde realizo el manejo de excepciones. lo que hay de malo en eso" dice
Este ensayo de tipo o abatido siempre tendrá
La forma que yo quiero este código para buscar es esta
Sea X: MyRecord ss = getConnection 'con' |> GetCommand "cmd" |> addParameter "@ name" SqlDbType.NVarchar 50 |> addParameter "@policyname" SqlDbType.NVarchar 50 |> ExecuteReader |> FunctionToReadAndGenerateSeq |> CleanEverything
me puede recomendar cómo puedo llevar a mi código al nivel deseado y también cualquier otro ¿mejora?