私は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を繰り返し使用すると、複数の問題を抱えています非常に刺激的です...とノイズを追加しています。出力が「なし」であるかどうかを確認するために、より明確な方法が必要です。
最後に、読者、コマンド、接続をクローズ+ディスパッチできるクリーンアップ機能が必要です。しかし現在、パイプラインの終わりには私が持っているものはすべて読者です。
パラメータを追加している関数...戻り値の型がまだ送信されたコマンドと同じであるため、コマンドパラメータの "状態"が変更されているようです。私は経験豊富な機能プログラマがこれをどのようにしたのだろうと思います。
Visual Studioでは、例外処理を行う場所ごとに警告が表示されます。 CON 『:それと間違っているものを」MyRecord SEQ =のgetConnectionそれは
このタイプのテストやダウンキャストは常に
私はこのコードを見てみたい道はこの
レットxが保持すると言います』 |> GetCommand "CMD" |> AddParameter "@name" SqlDbType.NVarchar 50 |> AddParameter "@policyname" SqlDbType.NVarchar 50 |>のExecuteReader |> FunctionToReadAndGenerateSeq |> CleanEverything
あなたは、私は私のコードを取ることができますどのようにお勧めします所望のレベルに、また他の改善?