达梦 数据库 Rust 实战

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
---
相关推荐
剩下了什么5 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥6 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉6 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变6 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
山岚的运维笔记8 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里9 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科9 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦9 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
晚霞的不甘10 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位10 小时前
JAVA开发常见安全问题:纵向越权
java·数据库·安全