首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Qt中使用输入参数调用sql server存储过程

如何在Qt中使用输入参数调用sql server存储过程
EN

Stack Overflow用户
提问于 2014-05-30 17:46:55
回答 2查看 4.3K关注 0票数 3

我有这个存储过程

代码语言:javascript
复制
create proc getVersion(@appCode nvarchar(128), @serialNo nvarchar(128))
as
select v.Version from Version v 
inner join Application a on a.Code = v.AppCode
inner join SerialNumber s on a.Code = s.AppCode
where a.Code = @appCode and s.SerialNo = @serialNo

此过程必须返回结果集。我在qt中这样称呼它:

代码语言:javascript
复制
QStringList DBConnection::getQueryResult(QString code, QString serialNo){

    connect();

    QSqlQuery query;
    QStringList results;

    query.prepare("CALL getVersion(?,?)");
    query.bindValue(1,code);
    query.bindValue(2,serialNo);
    query.exec();
    while(query.next()){
        QString result = query.record().value(1).toString();
        results.append(result);
    }
    for(QString res:results){
        qDebug() << res;
    }

    closeConnection();

    return results;
}

但是我得到了以下错误:“@P1”附近的不正确语法错误。无法准备Server语句。

在Qt中调用具有2个输入参数的存储过程的正确方法是哪一种?

编辑:

我创建了一个函数,它将返回一个具有匹配数据的表。

代码语言:javascript
复制
create function getAppVersions
(
@appCode nvarchar(128),
@serialNo nvarchar(128))
returns table as
return (
select v.Version from Version v 
inner join Application a on a.Code = v.AppCode
inner join SerialNumber s on a.Code = s.AppCode
where a.Code = @appCode and s.SerialNo = @serialNo)

我不知道如何使用QSqlQuery调用这个函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-31 08:32:13

问题就这样解决了:

我创建了函数:

代码语言:javascript
复制
create function getAppVersions
(
   @appCode nvarchar(128),
   @serialNo nvarchar(128))
   returns table as
   return (
   select v.Version from Version v 
   inner join Application a on a.Code = v.AppCode
   inner join SerialNumber s on a.Code = s.AppCode
   where a.Code = @appCode and s.SerialNo = @serialNo
)

然后在Qt中调用这个函数,如下所示:

代码语言:javascript
复制
QStringList DBConnection::getQueryResult(QString code, QString serialNo){

    QSqlQuery query;
    QStringList results;


    QString connectionString = connection.arg(serverName).arg(dbName);
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName(connectionString);

    if (db.open())
    {
        qDebug() << "Opened";
        query = db.exec("Select *from getAppVersions('" + code + "','" + serialNo + "');");

        while(query.next()){
            QString result = query.record().value(0).toString();
            results.append(result);
        }
        db.close();
    }
    else
    {
        qDebug() << "Error = " << db.lastError().text();
    }
    db.close();

    return results;
}
票数 1
EN

Stack Overflow用户

发布于 2014-05-30 18:31:45

首先,QSqlQuery的占位符应该与:code:serialNo类似。

此外,一个过程返回一个空。它只具有处理作用。当您需要返回一个值时,应该使用一个函数。

根据Qt驱动程序的不同,您必须使用QSqlQuery或直接调用来获得结果。

代码语言:javascript
复制
query.prepare("getVersion(:code,:serialNo)");
query.bindValue(":code",code);
query.bindValue(":serialNo",serialNo);
query.exec();

这里,getVesion是一个使用CREATE FUNCTION创建的函数。

直拨电话有时类似于:

代码语言:javascript
复制
QSqlQuery q = db->exec( QString("getVersion(%1,%2) ;").arg(code).arg(serialNo) ) ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23960566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档