sql >> Database teknologi >  >> RDS >> Mysql

F# Begynder:Hentning af en række data fra en server

Seq-typen har en pæn funktion til håndtering af databasemarkører kaldet gener_using (se F# Manual og kapitlet Dataadgang i Foundations of F# ). Dette er en højere ordensfunktion, der kræver en funktion for at åbne markøren og en anden (kaldes gentagne gange) for at behandle poster fra markøren. Her er noget kode, der bruger gener_using til at udføre en sql-forespørgsel:

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

For at angive alle tabellerne i en Oracle-database for eksempel, skal vi definere en kolonnedefinitionstype og starte executeSqlReader som følger:

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. How to_char() virker i PostgreSQL

  2. Sådan udføres en Oracle-lagret procedure via et databaselink

  3. Sådan installeres den seneste MySQL 8 på Debian 10

  4. Rediger en SQL Server Agent Schedule (T-SQL)