sql >> Database >  >> RDS >> Mysql

F# Beginner:een reeks gegevens ophalen van een server

Het Seq-type heeft een handige functie voor het verwerken van databasecursors genaamd generation_using (zie F# Handleiding en het hoofdstuk Gegevenstoegang in Foundations of F# ). Dit is een functie van hogere orde die één functie nodig heeft om de cursor te openen en een andere (herhaaldelijk genoemd) om records van de cursor te verwerken. Hier is wat code die gebruikmaakt van generation_using om een ​​sql-query uit te voeren:

let openConnection (connectionName : string) =
    let connectionSetting = ConfigurationManager.ConnectionStrings.Item(connectionName)
    let connectionString = connectionSetting.ConnectionString
    let connection = new OracleConnection(connectionString)
    connection.Open()
    connection

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 | :? DBNull -> null | _ -> x)
        Some (cstr.Invoke(values) :?> 'a)
    else
        None

let executeSqlReader<'a> (connectionName : string) (sql : string) : 'a list =        
    let connection = openConnection connectionName

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

    let result = Seq.to_list(Seq.generate_using opener generator)        

    connection.Close()
    connection.Dispose()
    result

Om bijvoorbeeld alle tabellen in een Oracle-database weer te geven, moeten we een kolomdefinitietype definiëren en executeSqlReader als volgt aanroepen:

type ColumnDefinition = {
    TableName : string;
    ColumnName : string;
    DataType : string;
    DataLength : decimal;                
}

let tableList = executeSqlReader<ColumnDefinition>
    "MyDatabase"
    "SELECT t.table_name, column_name, data_type, data_length FROM USER_TABLES t, USER_TAB_COLUMNS c where t.TABLE_NAME = c.table_name order by t.table_name, c.COLUMN_NAME"


  1. PostgreSql:Json Array naar rijen met behulp van Lateral Join

  2. org.hibernate.exception.JDBCConnectionException ophalen:kon query niet uitvoeren, zelfs niet via JNDI

  3. Postgres-functie NULL-waarde voor rij die verwijst naar NEW

  4. php:SQLSTATE [HY000] [2002] Er kon geen verbinding worden gemaakt omdat de doelmachine dit actief weigerde