• Qt调用sqlserver的存储过程


    QSqlDatabase db;

    db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName("SQLSERVER");
    db.setUserName("test");
    db.setPassword("test");

    db.open();

    QSqlQuery query(db);

    query.setForwardOnly(true);
    query.prepare("{call CCGC (?,?,?,?)}");  //CCGC为存储过程名称
    query.bindValue(0, "980000123");//对应第一个参数
    query.bindValue(1, "1");//对应第二个参数
    query.bindValue(2, "11111111111111111111", QSql::Out); //varchar(20)//对应第三个参数
    query.bindValue(3, "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", QSql::Out);//varchar(200)//对应第四个参数

    bool isok = query.exec();//执行语句

    QString strResult = query.boundValue(2).toString();//获取sqlserver返回的第一参数
    QString msg = query.boundValue(3).toString();//获取sqlserver返回的第二个参数

    备份:如果sqlserver给的返回数据中加入了打印或者其他字符串会导致我们或者返回值的时候出错,也就是获取不到对应的值。

    如果sqlserver服务器端不改的话,我们这边就只能听过脚本方式进行处理,脚本如下:

    shell.sh

    #!/bin/sh

    tsql -S TS -U user -P 'pwd' -D SQLDB << EOF

    DECLARE @result VARCHAR(20), @msg VARCHAR(200)
    EXEC p_bcrobot_config_new
            @barcode = "$1",
            @operator = "$2",
            @result = @result OUTPUT,
            @msg = @msg OUTPUT
    go
    exit
    EOF

    调用脚本如下:

    QString path = "./shell.sh ";
    path.append("980000123"); 
    path.append(" 1");
    cmd1.start(path);
    cmd1.waitForFinished(250);//这里的时间单位为毫秒,时间跟网速和返回值大小而定。
    QByteArray out = cmd1.readAllStandardOutput();//获取命令行的返回值
    QString outstr = QString(out);//获取到outstr就可以按照你的需求对字符串进行分割处理。

    特别注意:目前还未能解决同主机双实例名,然后连接第二个实例名问题。

  • 相关阅读:
    01 三角形的绘制
    【C++】泛型编程之模板初阶
    出海季,互联网出海锦囊之本地化
    1225. 报告系统状态的连续日期
    【Python基础篇】字符串的拼接
    猿创征文|docker 系列: 具名、匿名挂载介绍
    实现字符串反转函数
    【微信小程序】数字化会议OA系统之投票模块(附源码)
    Python蒙特卡洛树搜索算法实现的黑白棋AI系统
    VUE UI组件ui-libs.vercel.app 花了太长时间进行响应怎么解决?
  • 原文地址:https://blog.csdn.net/sinat_33419023/article/details/125498176