sql >> Databasteknik >  >> RDS >> Mysql

F# Nybörjare:hämta en mängd data från en server

Seq-typen har en snygg funktion för att hantera databasmarkörer som kallas gener_using (se F# Manual och kapitlet Data Access i Foundations of F# ). Detta är en högre ordningsfunktion som kräver en funktion för att öppna markören och en annan (kallas upprepade gånger) för att bearbeta poster från markören. Här är lite kod som använder gener_using för att köra en sql-fråga:

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

För att till exempel lista alla tabeller i en Oracle-databas måste vi definiera en kolumndefinitionstyp och anropa executeSqlReader enligt följande:

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. Skapa databas vid docker-compose-start

  2. Hur man bestämmer den automatiskt genererade primärnyckeln som används som främmande nyckel för en annan tabell

  3. Bästa metoder för skalning av databaser:Del 1

  4. Hur man konverterar tidsstämpel med millisekunder till datum i Oracle