Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1706234
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: 嵌入式

2011-04-08 15:35:35

Server SQL中的存储过程如下:

  1. CREATE procedure PINSERTPC
  2.      @pcnum int,
  3.      @pcname varchar(50),
  4.      @pctype int,
  5.      @ipaddress varchar(50),
  6.      @port int,
  7.      @pcid int output
  8.     as

  9.     --declare @pcid int
  10.     if exists (select * from COMPUTERTABLE where PcNum = @pcnum)
  11.      set @pcid = -1
  12.     else
  13.     begin
  14.      insert into COMPUTERTABLE (PcNum, PcName, PcType, IpAddress, Port)
  15.      values (@pcnum, @pcname, @pctype, @ipaddress, @port)
  16.      select @pcid = SCOPE_IDENTITY()
  17.     end
  18.     --return @pcid
  19.     GO

根据网上搜索文章《qt中调用sql server的存储过程》内容如下:

写了个存储过程,准备使用qt调用,数据库是sqlserver 2000按照参考文档
调用是下面这样的

  1. QSqlQuery query;
  2. query.prepare("CALL InsertImgEntity( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
  3. query.bindValue(0,datano);
  4. query.bindValue(1,DataCorner);
  5. query.bindValue(2,DataZD);
  6. query.bindValue(3,DataCommon);
  7. query.bindValue(4,ImgCode);
  8. query.bindValue(5,ImgCodeZ);
  9. query.bindValue(6,"png");
  10. query.bindValue(7,pngImage,QSql::Binary);
  11. query.bindValue(8,"GoldMap Gaoyong Sun");
  12. query.bindValue(9,QDateTime::currentDateTime ());

但是我在windows下却无法调用成功。调试跟踪,发觉我在调试中存储过程是通过exec调用的,故此将代码修改如下,问题解决,造成这种结果的原因可能是数据库的不同吧。

  1. query.prepare("exec InsertImgEntity ?, ?, ?, ?, ?, ?, ?, ?, ?, ?");
  2. query.bindValue(0,datano);
  3. query.bindValue(1,DataCorner);
  4. query.bindValue(2,DataZD);
  5. query.bindValue(3,DataCommon);
  6. query.bindValue(4,ImgCode);
  7. query.bindValue(5,ImgCodeZ);
  8. query.bindValue(6,"png");
  9. query.bindValue(7,pngImage,QSql::Binary);
  10. query.bindValue(8,"GoldMap Gaoyong Sun");
  11. query.bindValue(9,QDateTime::currentDateTime ());


可是工作需要,存储过程中要有返回值,或者输出参数,返回当前插入的ID号。通过测试得到解决方法。以最上方存储过程为例Qt中代码如下:

  1. bool QtSqlServer::SqlInsertPcData(QtPcData* pcData)
  2.     {
  3.         bool bFlag = false;
  4.      
  5.         QSqlQuery query;
  6.         query.prepare("exec PINSERTPC ?, ?, ?, ?, ?, ? output");
  7.         query.bindValue(0, pcData->GetPcNum());
  8.         query.bindValue(1, pcData->GetPcName());
  9.         query.bindValue(2, pcData->GetPcType());
  10.         query.bindValue(3, pcData->GetIpAddress());
  11.         query.bindValue(4, pcData->GetPort());
  12.         query.bindValue(5, 0, QSql::Out);
  13.         bFlag = query.exec();
  14.         if (bFlag)
  15.         {
  16.             int pcID = query.boundValue(5).toInt();
  17.             if (pcID < 0)
  18.             {
  19.                 bFlag = false;
  20.             }
  21.             else
  22.             {
  23.                 pcData->SetPcID(pcID);
  24.                 bFlag = true;
  25.             }
  26.         }
  27.         else
  28.         {
  29.             QString str = query.lastError().text();
  30.             QMessageBox::critical(0, QObject::tr("Error"),QObject::tr("%1").arg(str));
  31.         }

  32.         return bFlag;
  33.     }

也存在一些未知的疑问……这里的输出参数必须设置在存储过程的最后一个参数中返回,而且根据Server SQL中的要求必须有output的修饰,这样才可确保成功。

疑问1:如果存储过程想以返回值的形式返回,使用Qt如何调用。
疑问2:为何存储过程的输出参数必须设置才最后一个参数才可获取到正确的输出值,譬如想在第一个参数中返回,如何解决。
疑问3:有些存储过程有多个输出参数,但本人测试Qt只能以一个输出参数形式(设置为最后一个参数)调用……这事让我着实头疼!整的我其他的输出参数是在执着SQL语句查出来……

阅读(4617) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~