

Cargo.toml
toml
[package]
name = "dameng_rust_demo"
version = "0.1.0"
edition = "2024"
[dependencies]
odbc-api = { version = "8.1.4", features = ["derive"] }
env_logger = "0.11"
anyhow = "1.0.100"
encoding_rs = "0.8"
main.rs
rust
use anyhow::Result;
use odbc_api::{
ConnectionOptions, Environment,
parameter::VarCharArray,
};
use encoding_rs::GBK;
fn main() -> Result<()> {
// Initialize logging
env_logger::init();
// Create ODBC environment
let env = Environment::new()?;
// DaMeng database connection string
let connection_string = "
Driver={DM8 ODBC DRIVER};
Server=localhost;
Port=5236;
UID=SYSDBA;
PWD=my_passowrd;
";
// Establish connection with proper error handling
let conn = env
.connect_with_connection_string(connection_string, ConnectionOptions::default())
.map_err(|e| anyhow::anyhow!("Failed to connect: {:?}", e))?;
println!("✓ Successfully connected to DaMeng database");
// Get database info
let dbms_name = conn.database_management_system_name()?;
println!("Database Management System Name: {}", dbms_name);
// Execute query and process results
let max_rows_in_batch = 250;
// Define row type as a tuple (even for single columns)
type Row = (VarCharArray<255>, VarCharArray<255>);
let mut buffer = odbc_api::buffers::RowVec::<Row>::new(max_rows_in_batch);
// 将中文字符串转换为GBK编码
let (gbk_bytes, _, had_errors) = GBK.encode("张三");
if had_errors {
eprintln!("Warning: Some characters could not be encoded to GBK");
}
// 使用GBK编码的字节数组创建参数
let name_param = odbc_api::parameter::VarCharArray::<255>::new(&gbk_bytes);
let cursor = conn
.execute("SELECT * FROM SYSDBA.CHAR_TEST WHERE name=?", (&name_param,))?
.ok_or_else(|| anyhow::anyhow!("SELECT query did not yield a result set"))?;
use odbc_api::Cursor;
let mut block_cursor = cursor.bind_buffer(&mut buffer)?;
while let Some(batch) = block_cursor.fetch()? {
// Iterate over rows in the batch
for row in batch.iter() {
let (name, age) = row;
// 处理name字段
match name.as_bytes() {
Some(bytes) if !bytes.is_empty() => {
// 尝试解码为UTF-8,如果失败则尝试GBK
match std::str::from_utf8(bytes) {
Ok(utf8_str) => println!("Name (UTF-8): {}", utf8_str),
Err(_) => {
let (decoded, _, _) = GBK.decode(bytes);
println!("Name (GBK): {}", decoded);
}
}
}
Some(_) => println!("Name: NULL"),
None => println!("Name: NULL"),
}
// 处理age字段
match age.as_bytes() {
Some(bytes) if !bytes.is_empty() => {
match std::str::from_utf8(bytes) {
Ok(utf8_str) => println!("Age (UTF-8): {}", utf8_str),
Err(_) => {
let (decoded, _, _) = GBK.decode(bytes);
println!("Age (GBK): {}", decoded);
}
}
}
Some(_) => println!("Age: NULL"),
None => println!("Age: NULL"),
}
println!("---");
}
}
Ok(())
}
sh
✓ Successfully connected to DaMeng database
Database Management System Name: 达梦数据库管理系统
Name (GBK): 张三
Age (UTF-8): 29
---