我有这个存储过程
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”附近的不正确语法错误。无法准备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调用这个函数。
发布于 2014-05-31 08:32:13
问题就这样解决了:
我创建了函数:
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;
}发布于 2014-05-30 18:31:45
首先,QSqlQuery的占位符应该与:code或:serialNo类似。
此外,一个过程返回一个空。它只具有处理作用。当您需要返回一个值时,应该使用一个函数。
根据Qt驱动程序的不同,您必须使用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) ) ;https://stackoverflow.com/questions/23960566
复制相似问题