Mysql
 sql >> Baza danych >  >> RDS >> Mysql

F# Beginner:pobieranie tablicy danych z serwera

Typ Seq ma schludną funkcję obsługi kursorów bazy danych o nazwie generate_using (patrz Podręcznik języka F# oraz rozdział Dostęp do danych w Podstawy F# ). Jest to funkcja wyższego rzędu, która przyjmuje jedną funkcję do otwierania kursora, a drugą (wywoływaną wielokrotnie) do przetwarzania rekordów z kursora. Oto kod, który używa generate_using do wykonania zapytania sql:

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

Na przykład, aby wyświetlić listę wszystkich tabel w bazie danych Oracle, musimy zdefiniować typ definicji kolumny i wywołać executeSqlReader w następujący sposób:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Na zduplikowanym kluczu zignorować?

  2. Pobierz rekordy z bieżącego miesiąca

  3. Projekt bazy danych:obiekty o różnych atrybutach

  4. PHP, MySQL, PDO Transactions - Czy kod wewnątrz bloku try zatrzymuje się na commit()?

  5. Wybierz dane między dwiema datami?