44 releases

Uses old Rust 2015

0.17.0 May 9, 2020
0.16.1 Dec 18, 2019
0.16.0 Nov 27, 2019
0.14.0 Jul 11, 2019
0.1.0 Feb 19, 2016

#128 in #sql-database

Download history 273/week @ 2024-03-13 382/week @ 2024-03-20 594/week @ 2024-03-27 796/week @ 2024-04-03 283/week @ 2024-04-10 124/week @ 2024-04-17 173/week @ 2024-04-24 222/week @ 2024-05-01 162/week @ 2024-05-08 154/week @ 2024-05-15 147/week @ 2024-05-22 158/week @ 2024-05-29 141/week @ 2024-06-05 164/week @ 2024-06-12 161/week @ 2024-06-19 81/week @ 2024-06-26

574 downloads per month
Used in 6 crates (3 directly)

MIT license

90KB
2K SLoC

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 Coverage Status Docs Join the chat at https://gitter.im/odbc-rs/odbc

Docs are also available here

extern crate odbc;
// Use this crate and set environmet variable RUST_LOG=odbc to see ODBC warnings
extern crate env_logger;
use odbc::*;
use std::io;
use odbc_safe::AutocommitOn;

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 execute_statement<'env>(conn: &Connection<'env, AutocommitOn>) -> Result<()> {
    let stmt = Statement::with_parent(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(())
}

Dependencies

~3.5MB
~122K SLoC