2009-01-13 99 views
1

我對在前面的SO問題中給予我的一些代碼感到困惑。 Code hereF#錯誤:錯誤的參數數

在這一行,我得到一個錯誤,說我有一個無效的參數數量。我不完全明白錯誤是什麼,因爲我所做的所有研究都提出了這個函數的正確應用。

let result = Seq.to_list(Microsoft.FSharp.Compatibility.Seq.generate_using opener generator) 

這是怎麼回事?爲什麼我會遇到這種錯誤?

編輯:我用的是PowerPack.dll參考和MySQL.Data參考

代碼首戰&發電機下面:

let opener() = 
     let command = connection.CreateCommand(CommandText = sql, CommandType = System.Data.CommandType.Text) 
     command.ExecuteReader() 

和發電機...

let generator<'a> (reader : System.Data.IDataReader) = 
    if reader.Read() then 
     let t = typeof<'a> 
     let props = t.GetProperties() 
     let types = props 
        |> Seq.map (fun x -> x.PropertyType) 
        |> Seq.to_array 
     let cstr = t.GetConstructor(types) 
     let values = Array.create reader.FieldCount (new obj()) 
     reader.GetValues(values) |> ignore 
     let values = values 
        |> Array.map (fun x -> match x with | :? System.DBNull -> null | _ -> x) 
     Some (cstr.Invoke(values) :?> 'a) 
    else 
     None 
+0

這裏發佈開罐器和發生器的類型會有所幫助 - 當你將鼠標懸停在它們上面時,它們有什麼類型? – Brian 2009-01-14 00:19:48

+0

開啓器/發生器在鏈接 – 2009-01-14 00:26:01

回答

0

的以下爲我的檢查類型:

#light 
open System.Data 
open System.Data.SqlClient 
open System.Configuration 


type Employee = 
    { FirstName: string; 
     LastName: string; } 

let generator<'a> (reader: IDataReader) = 
    if reader.Read() then 
     let t = typeof<'a> 
     let props = t.GetProperties() 
     let types = props 
        |> Seq.map (fun x -> x.PropertyType) 
        |> Seq.to_array 
     let cstr = t.GetConstructor(types) 
     let values = Array.create reader.FieldCount (new obj()) 
     reader.GetValues(values) |> ignore 
     let values = values 
        |> Array.map (fun x -> match x with | :? System.DBNull -> null | _ -> x) 
     Some (cstr.Invoke(values) :?> 'a) 
    else 
     None 

let opener() = 
    let sql = "select * from employees" 
    let connection = new SqlConnection(ConfigurationManager.ConnectionStrings.["myConnection"].ConnectionString) 
    let command = connection.CreateCommand(CommandText = sql, CommandType = System.Data.CommandType.Text) 
    command.ExecuteReader() 

let result = Seq.to_list(Microsoft.FSharp.Compatibility.Seq.generate_using opener (generator<Employee>)) 

它看起來像你缺少的類型註釋告訴產生什麼類型的列表中你生成即:generator<Employee>

1

這個職位是舊的和含情脈脈的,但是你確定參數錯誤的無效數量沒有來自哪裏Oracle命令?

基本上:你是在SQL查詢中指定一個參數嗎?開罐器功能沒有應用任何參數。