Server SQL中的存储过程如下:

CREATE procedure PINSERTPC
 @pcnum int,
 @pcname varchar(50),
 @pctype int,
 @ipaddress varchar(50),
 @port  int,
 @pcid  int output
as

--declare @pcid int
if exists (select * from COMPUTERTABLE where PcNum = @pcnum)
 set @pcid = -1
else
begin
 insert into COMPUTERTABLE (PcNum, PcName, PcType, IpAddress, Port) 
 values (@pcnum, @pcname, @pctype, @ipaddress, @port)
 select @pcid = SCOPE_IDENTITY()
end
--return @pcid
GO

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

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

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

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

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

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

bool QtSqlServer::SqlInsertPcData(QtPcData* pcData)
{
    bool bFlag = false;
 
    QSqlQuery query;
    query.prepare("exec PINSERTPC ?, ?, ?, ?, ?, ? output");
    query.bindValue(0, pcData->GetPcNum());
    query.bindValue(1, pcData->GetPcName());
    query.bindValue(2, pcData->GetPcType());
    query.bindValue(3, pcData->GetIpAddress());
    query.bindValue(4, pcData->GetPort());
    query.bindValue(5, 0, QSql::Out);
    bFlag = query.exec();
    if (bFlag)
    {
        int pcID = query.boundValue(5).toInt();
        if (pcID < 0)
        {
            bFlag = false;
        }
        else
        {
            pcData->SetPcID(pcID);
            bFlag = true;
        }
    }
    else
    {
        QString str = query.lastError().text();
        QMessageBox::critical(0, QObject::tr("Error"),QObject::tr("%1").arg(str));
    }

return bFlag;
}

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

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

最近貌似挺贪玩....要收敛收敛了!嘿嘿!上述问题如果有人可以解答,小的十分感激,彼此交流,相互学习!

http://cool.worm.blog.163.com/blog/static/6433900620091018103220702/

Qt调用Server SQL中的存储过程的更多相关文章

  1. C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

      C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: ...

  2. 在SQL Server数据库中执行存储过程很快,在c#中调用很慢的问题

    记录工作中遇到的问题,分享出来: 原博客地址:https://blog.csdn.net/weixin_40782680/article/details/85038281 今天遇到一个比较郁闷的问题, ...

  3. SQL中的存储过程和函数

                                        存储过程和函数 简单的说,存储过程就是一条或者多条SQL语句的集合.可以视为批文件,但是其作用不仅仅局限于批处理.本文主要介绍如 ...

  4. SQL 中常用存储过程xp_cmdshell运行cmd命令

    目的: 使用SQL语句,在D盘创建一个文件夹myfile 首先查询系统配置 SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR n ...

  5. SQL 中常用存储过程xp_cmdshell运行cmd命令 (转载)

    目的:使用SQL语句,在D盘创建一个文件夹myfile 首先查询系统配置 SELECT * FROM sys.configurations WHERE name='xp_cmdshell' OR na ...

  6. qt调用sql server存储过程并获取output参数

    最近新做的一个项目需要使用qt5连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章: <Q ...

  7. 面试问题 - SQL 中存储过程与函数的区别

    SQL 中的存储过程与函数没有本质上的区别 函数 -> 只能返回一个变量. 函数可以嵌入到sql中使用, 可以在select 中调用, 而存储过程不行.  但函数也有着更多的限制,比如不能使用临 ...

  8. 在易语言中调用MS SQL SERVER数据库存储过程方法总结

    Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...

  9. PL/Sql 中创建、调试、调用存储过程

    存储过程的详细建立方法 1.先建存储过程 左边的浏览窗口选择 procedures ,会列出所有的存储过程,右击文件夹procedures单击菜单"new",弹出 template ...

随机推荐

  1. SU Demos-02Filtering-07Sumedian

    不足之处,欢迎批评指正. 先看脚本内容: 脚本中用到的4个参数文件,是一系列x,t数据对,数组(x,t) 运行结果,

  2. 实践1-qq邮箱主页

    纯html的网页 采用table分割板块进行布局 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  3. Tri Tiling[HDU1143]

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. POJ 2342 Label:树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6955   Accepted: 4003 ...

  5. Chromium的GPU进程启动流程

    转载请注明出处:http://www.cnblogs.com/fangkm/p/3960327.html 硬件渲染依赖计算机的GPU,GPU种类繁多,兼容这么多种类的硬件,稳定性是个大问题,虽然Chr ...

  6. POJ 2104 K-th Number(划分树)

    题目链接 参考HH大神的模版.对其中一些转移,还没想清楚,大体明白上是怎么回事了,划分树就是类似快排,但有点点区别的.多做几个题,慢慢理解. #include <cstdio> #incl ...

  7. linux 好用的程序

    来自   http://www.cnblogs.com/skyseraph/archive/2010/10/30/1865280.html * Shell: bash.我使用 bash 的 vi 命令 ...

  8. ejabberd 的框架

    最近看源码,总结ejabberd的大致框架如下

  9. SSh结合Easyui实现Datagrid的分页显示

    近日学习Easyui,发现非常好用,界面很美观.将学习的心得在此写下,这篇博客写SSh结合Easyui实现Datagrid的分页显示,其他的例如添加.修改.删除.批量删除等功能将在后面的博客一一写来. ...

  10. 字符串中的一些基本操作函数(c语言)

    其中很多函数返回的都是首地址,程序中只是将该地址后的内容全部输出来了...并没有作特殊处理输出地址...还有几个函数有点小bug. #include"iostream" #incl ...