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就可以按照你的需求对字符串进行分割处理。
特别注意:目前还未能解决同主机双实例名,然后连接第二个实例名问题。