ODBC wrapper for safe idiomatic Rust

Library for writing ODBC applications in Rust.

If you're looking for raw ODBC FFI bindings check odbc-safe and odbc-sys crate.

https://travis-ci.org/Koka/odbc-rs Build status https://crates.io/crates/odbc Coverage Status Docs Join the chat at https://gitter.im/odbc-rs/odbc

Docs are also available here

```rust extern crate odbc; // Use this crate and set environmet variable RUSTLOG=odbc to see ODBC warnings extern crate envlogger; use odbc::*; use std::io;

fn main() {

env_logger::init();

match connect() {
    Ok(()) => println!("Success"),
    Err(diag) => println!("Error: {}", diag),
}

}

fn connect() -> std::result::Result<(), DiagnosticRecord> {

let env = create_environment_v3().map_err(|e| e.unwrap())?;

let mut buffer = String::new();
println!("Please enter connection string: ");
io::stdin().read_line(&mut buffer).unwrap();

let conn = env.connect_with_connection_string(&buffer)?;
execute_statement(&conn)

}

fn executestatement<'env>(conn: &Connection<'env>) -> Result<()> { let stmt = Statement::withparent(conn)?;

let mut sql_text = String::new();
println!("Please enter SQL statement string: ");
io::stdin().read_line(&mut sql_text).unwrap();

match stmt.exec_direct(&sql_text)? {
    Data(mut stmt) => {
        let cols = stmt.num_result_cols()?;
        while let Some(mut cursor) = stmt.fetch()? {
            for i in 1..(cols + 1) {
                match cursor.get_data::<&str>(i as u16)? {
                    Some(val) => print!(" {}", val),
                    None => print!(" NULL"),
                }
            }
            println!("");
        }
    }
    NoData(_) => println!("Query executed, no data returned"),
}

Ok(())

}

```