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就可以按照你的需求对字符串进行分割处理。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值