< 返回版块

c5soft 发表于 2019-11-16 21:28

Tags:odbc

用Rust操作sql server数据库,目前能用的组件只有tiberius与odbc,tiberius只能用早期的0.1版的future,标准版的future还不能用。尝试了一下odbc, 发现表名称或字段名中文时无法操作,各位又没有解决方案?


Ext Link: https://crates.io/crates/odbc

评论区

写评论
作者 c5soft 2019-11-19 21:47

如此说来,连接SQL Server数据库,目前最靠谱的方式就是odbc-rs了。

作者 c5soft 2019-11-19 21:45

yuana1说得对,按yuana1的写法,只要是通过create_environment_v3_with_os_db_encoding设置上编码,中文就没问题,不管是使用现成的DSN还是使用连接字符串。字符集设置成GB18030能工作,let env = create_environment_v3_with_os_db_encoding("GB18030", "GB18030").unwrap() 我没能玩转,是直接照搬官方文档的例子出的问题。

驱动也可以用新版的Native Client,这样写: let conn =env.connect_with_connection_string("Driver={SQL Server Native Client 11.0};Server=(local);Database=PayRoll;UID=sa;PWD=1234").unwrap();

yuana1 2019-11-19 20:37

对以下内容的回复:

    let env = create_environment_v3_with_os_db_encoding("gbk", "gbk").unwrap();
    let conn = env.connect_with_connection_string("Driver={SQL Server};Server=10.10.10.10;Address=10.10.10.10,1433;Network=dbmssocn; Database=test1;Uid=sa;Pwd=password").unwrap();

这么写我这也能正常查询,不乱码。

主要是通过create_environment_v3_with_os_db_encoding设置上编码就好了。跟 ODBC dsn或者连接串 没有太大关系。

作者 c5soft 2019-11-19 19:26

感谢yuana1,复制您贴出的代码,中文显示正常,改成: let env = create_environment_v3_with_os_db_encoding("UTF-8", "GB18030").unwrap();也正常。 我的想法是:不使用带名称的odbc数据源,直接通过connection_string来创建数据连接。


    let cn_str = String::from(
        "Driver={SQL Server};Server=(local);Database=PayRoll;User Id=sa;Password=1234",
    );
    // println!("Please enter connection string: ");
    // io::stdin().read_line(&mut buffer).unwrap();

    let cn = env.connect_with_connection_string(&cn_str)?;
    execute_statement(&cn)

这就玩不转了,这个连接字符串应该如何写呢?

yuana1 2019-11-19 09:40

对以下内容的回复:

#[test]
fn exec_direct() {
    let env = create_environment_v3_with_os_db_encoding("gbk", "gbk").unwrap();
    let conn = env.connect("TEST", "sa", "password").unwrap();
    let stmt = Statement::with_parent(&conn).unwrap();

    // select 'hello'
    if let Ok(Data(mut stmt)) = stmt.exec_direct("select top 10 姓名,部门 from 员工信息") {
        while let Some(mut cursor) = stmt.fetch().unwrap()  {
            match cursor.get_data::<String>(1).unwrap() {
                Some(val) => print!("{}  ", val),
                None => panic!(" NULL"),
            }
            match cursor.get_data::<String>(2).unwrap() {
                Some(val) => println!("{}", val),
                None => panic!(" NULL"),
            }
        }
    } else {
        panic!("SELECT did not return result set");
    }
}
返回结果
running 1 test
张三  张三
李四  李四
test exec_direct ... ok
yuana1 2019-11-19 09:39

对以下内容的回复:

数据库sqlserver 2008 10.50.4000

编码 Chinese_PRC_CI_AS

ODBC 数据源都是默认的参数,除了第三步 “更改默认的数据库为”

作者 c5soft 2019-11-18 18:55

一条正常执行的语句:select top 10 姓名,部门 from 员工信息 报:Error: State: 42000, Native error: 102, Message: [Microsoft][ODBC SQL Server Driver][SQL Server]“℃”附近有语法错误。

作者 c5soft 2019-11-18 18:50

let env =create_environment_v3_with_os_db_encoding("GBK", "UTF-8").map_err(|e| e.unwrap())?; ... 仍然不能正常工作

yuana1 2019-11-18 14:39

使用 create_environment_v3_with_os_db_encoding(os_encoding: &str, db_encoding: &str)

例如 create_environment_v3_with_os_db_encoding("gbk", "gbk")

yuana1 2019-11-18 08:53

https://github.com/yuana1/odbc-rs

可以看看我这个, 晚上回去我解决下冲突,再提交下pr。

1 共 10 条评论, 1 页