Ошибка F #: неверное количество параметров - PullRequest
1 голос
/ 14 января 2009

Я ломаю голову над кодом, данным мне в предыдущем вопросе, который у меня был. Код здесь

В этой строке я получаю сообщение об ошибке, в котором указано неверное количество параметров. Я не совсем понимаю, в чем ошибка, поскольку все исследования, которые я делаю, показывают, что это правильное применение функции.

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

Ответы [ 2 ]

1 голос
/ 10 марта 2010

Этот пост старый и томный, но вы уверены, что ошибка неверного числа параметров не исходит от команды Oracle?

В основном: вы указываете параметр в запросе SQL? Функция открывания не применяет никаких параметров.

0 голосов
/ 14 января 2009

Следующий тип проверяет меня:

#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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...