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

Sql server 如何在Qt中使用输入参数调用sqlserver存储过程,sql-server,qt,Sql Server,Qt,我有这个存储过程 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

我有这个存储过程

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中这样称呼它:

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;
}
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;
}

我不知道如何使用QSqlQuery调用此函数

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

另外,一个过程返回一个void。它只有一个处理角色。当需要返回值时,应该使用函数

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

query.prepare("getVersion(:code,:serialNo)");
query.bindValue(":code",code);
query.bindValue(":serialNo",serialNo);
query.exec();
这里的getVesion是一个使用
CREATE function
创建的函数

直拨电话有点像:

QSqlQuery q = db->exec( QString("getVersion(%1,%2) ;").arg(code).arg(serialNo) ) ;

问题是这样解决的:

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;
}
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;
}
我创建了一个函数:

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中调用该函数,如下所示:

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;
}
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;
}
QStringList数据库连接::getQueryResult(QString代码,QString序列号){
QSqlQuery查询;
QStringList结果;
QString connectionString=connection.arg(服务器名).arg(数据库名);
QSQLDABASE=QSQLDABASE::addDatabase(“QODBC”);
db.setDatabaseName(connectionString);
if(db.open())
{

qDebug()Nejat,你能说得更具体一点吗!关于sql存储过程和函数调用的Qt文档没有太大帮助。谢谢!我还没有尝试过答案中的方法。你可以试试看是否有帮助。你能从sql server manager成功调用函数吗?我创建了一个函数,它返回一个带有为了匹配数据,我在问题中添加了它,但我不知道如何在qt中调用它。在sql中,我从getAppVersions('33fdcf3c-e24b-11e3-a375-82687f4fc15c','33fd-cf3c-24b1-c1e3')执行类似这样的函数。
这是一个成功的调用。我得到了应用程序的可用版本。即使在qt中,如果我正在编写
query=db.exec(“从getAppVersions('33fdcf3c-e24b-11e3-a375-82687f4fc15c'、'33fd-cf3c-24b1-c1e3')中选择*);
它工作得很好。问题是我如何传递这两个参数?SQL注入呢?