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注入呢?