मैं एफ # में एक SQLServer StoredProc निष्पादित करने के लिए निम्नलिखित कोड लिखाडाटाबेस कनेक्शन और एफ #
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 का बार-बार इस्तेमाल के साथ कई समस्याएं हैं बहुत परेशान है ... और शोर जोड़ रहा है। मुझे यह जांचने के लिए एक और स्पष्ट तरीका चाहिए कि आउटपुट कोई नहीं था और यदि नहीं तो आगे बढ़ें।
अंत में एक क्लीनअपफंक्शन होना चाहिए जहां मुझे पाठक, कमांड और कनेक्शन को बंद करने में सक्षम होना चाहिए। लेकिन वर्तमान में पाइपलाइन के अंत में मेरे पास पाठक है।
फ़ंक्शन जो पैरामीटर जोड़ रहा है ... ऐसा लगता है कि यह कमांड पैरामीटर के "स्थिति" को संशोधित कर रहा है क्योंकि रिटर्न प्रकार अभी भी वही कमांड है जिसे इसे भेजा गया था ... कुछ अतिरिक्त राज्य के साथ। मुझे आश्चर्य है कि एक और अनुभवी कार्यात्मक प्रोग्रामर ने यह कैसे किया होगा।
विजुअल स्टूडियो मुझे उस स्थान पर एक चेतावनी देता है जहां मैं अपवाद हैंडलिंग करता हूं। क्या उस के साथ गलत क्या है "यह कहता है
इस प्रकार का परीक्षण या खिन्न हमेशा का आयोजन करेगा
तरह से मैं इस कोड को देखने के लिए चाहते हैं तो इस
देना एक्स है: MyRecord seq = GetConnection" चोर " |> GetCommand "cmd" |> AddParameter "@name" SqlDbType.NVarchar 50 |> AddParameter "@policyname" SqlDbType.NVarchar 50 |> ExecuteReader |> FunctionToReadAndGenerateSeq |> CleanEverything
आप की सिफारिश कर सकते हैं कि मैं अपने कोड ले जा सकते हैं वांछित स्तर और किसी भी अन्य के लिए सुधार की?