sql-server - Qt中如何调用带入参的sql server存储过程

标签 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 = @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;
}

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

在 Qt 中调用带有 2 个输入参数的存储过程的正确方法是什么?

编辑:

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

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 调用这个函数。

最佳答案

问题是这样解决的:

我创建了函数:

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){

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

关于sql-server - Qt中如何调用带入参的sql server存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23960566/

相关文章:

sql - T-SQL |字符串 "Manipulation"和聚合

c++ - 将 Q3DSurface 嵌入到 QQuickItem 中

c++ - Qt 围绕其中心点旋转文本

sql-server - 如何监控和查找 SQL 数据库中未使用的索引

sql-server - 如何将值转换为列并将计数放入其中?

sql-server - 如何从 ASP.NET Core Entity Framework 中的数据库更新 VS 2019 中的模型

c# - GridView 编辑

c++ - 如何在 Qt 中通过 root 权限以编程方式运行打印命令 lpr -p

c++ - QGLWidget中最简单的绘制字符串的方法

c++ - 如何从文本编辑QT中获取整个文本