数据库编程笔录之二

原创 2004年10月14日 11:11:00
搞定ADO引入后,我尝试用command方式调用存储过程。存储过程主要是根据输入的参数,执行一个复杂的查询语句,因此返回的是个记录集,同时存储过程本身有个返回参数。程序如下:
        {
                _CommandPtr cmmd;
                _ParameterPtr param;  
                HRESULT hr = cmmd.CreateInstance(__uuidof(Command));
                if(FAILED(hr))  
                {   
                        AfxMessageBox("GetShipTrack()中创建_CommandPtr对象失败");  
                        return false;
                }  
                cmmd->ActiveConnection = m_piConnection;//需要使用的ADO连接  
                cmmd->CommandType = adCmdStoredProc;  
                cmmd->CommandText=_bstr_t("GetShipTrack");
                param = cmmd->CreateParameter("",adChar,adParamInput,shipTrackInfo.sMMSIID.GetLength() + 1,_variant_t(shipTrackInfo.sMMSIID));
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adTinyInt, adParamInput, sizeof(BYTE),(BYTE)bShowAIS);
                cmmd->Parameters->Append(param);  
                param = cmmd->CreateParameter("@ret",adChar, adParamReturnValue,1);
                cmmd->Parameters->Append(param);
               
                _Recordset* prec = 0;
                HRESULT hr1;
                hr1 = cmmd->raw_Execute(NULL, NULL, adCmdStoredProc, &prec);               
                if(FAILED(hr1))
                {
                        AfxMessageBox("获取船舶航迹信息失败!");
                        return false;
                }
                _RecordsetPtr piRecordset;
                piRecordset = _RecordsetPtr(prec, false);

问题来了,不管是用raw_Execute还是Execute返回记录集,都不能正确的获取返回参数@ret的值,始终是VT_EMPTY。相信我,存储过程没有错误。肯定给@ret设置了正确的值。
同样的情况,我另一个存储过程是插入一条信息。也有返回值@ret,程序如下:
        {
                _CommandPtr cmmd;
                _ParameterPtr param;  
                HRESULT hr = cmmd.CreateInstance(__uuidof(Command));
                if(FAILED(hr))  
                {   
                        g_ErrLog.WriteErrorInfo("AddAISDynamicInfo","创建_CommandPtr对象失败");
                        return false;
                }  
                cmmd->ActiveConnection = m_piConnection;//需要使用的ADO连接  
                cmmd->CommandType = adCmdStoredProc;  
                cmmd->CommandText = _bstr_t("AddAISDynamicInfo");
                param = cmmd->CreateParameter("",adChar, adParamInput, sMsgData15.sMMSINum.GetLength() + 1,_variant_t(sMsgData15.sMMSINum));
                cmmd->Parameters->Append(param);  
                param = cmmd->CreateParameter("",adTinyInt, adParamInput, sizeof(BYTE), sMsgData15.byNavStatus);  
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adDouble, adParamInput, sizeof(float),sMsgData15.fSOG);
                cmmd->Parameters->Append(param);  
                param = cmmd->CreateParameter("",adDouble, adParamInput, sizeof(float), sMsgData15.fCOG);  
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adDouble, adParamInput, sizeof(float), (float)sMsgData15.chROT);  
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adDouble, adParamInput, sizeof(double), sMsgData15.dLong);  
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adDouble, adParamInput, sizeof(double), sMsgData15.dLat);  
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adTinyInt, adParamInput, sizeof(BYTE), (BYTE)(sMsgData15.bPosAcu));  
                cmmd->Parameters->Append(param);
                param = cmmd->CreateParameter("",adSmallInt, adParamInput, sizeof(WORD), (long)sMsgData15.wTrueHeading);  
                cmmd->Parameters->Append(param);
                long nOK = 0;
                param = cmmd->CreateParameter("cReturnVal",adBigInt, adParamOutput,sizeof(long),_variant_t(nOK));
                cmmd->Parameters->Append(param);

                cmmd->Execute(NULL, NULL, adCmdStoredProc);
                vreturn=cmmd->Parameters->GetItem("cReturnVal")->GetValue();//通过参数返回值
                nOK=(long)vreturn ;

但这时的返回值却是正确的。nOK为1
至今我也没有明白为什么会这样。难道有记录集返回的情况下,就无法获得返回参数了么???

数据库编程笔录之二

搞定ADO引入后,我尝试用command方式调用存储过程。存储过程主要是根据输入的参数,执行一个复杂的查询语句,因此返回的是个记录集,同时存储过程本身有个返回参数。程序如下:        {  ...
  • liguiyuan
  • liguiyuan
  • 2008年04月09日 01:44
  • 149

数据库编程笔录之四

本篇想说一下如何获取记录集中各种类型的数值。比如数据库中定义的是varchar类型等,我们获取数据时该怎么写呢?这里我提供一些宏定义,大家只要在stdafx.h或者其它需要使用这些宏的地方插入这些语句...
  • happyparrot
  • happyparrot
  • 2004年10月14日 11:13
  • 1562

数据库编程笔录之一

最近使用ADO+SQLSERVER编程。作为一个数据库编程的新手,在使用过程中碰到一些现象和问题。有的解决了,有的还没有解决。在此以笔录的方式和大家交流一下。对于ADO的使用,大家都知道要引入msad...
  • happyparrot
  • happyparrot
  • 2004年10月14日 11:10
  • 1932

数据库编程笔录之一

最近使用ADO+SQLSERVER编程。作为一个数据库编程的新手,在使用过程中碰到一些现象和问题。有的解决了,有的还没有解决。在此以笔录的方式和大家交流一下。对于ADO的使用,大家都知道要引入ms...
  • liguiyuan
  • liguiyuan
  • 2008年04月09日 01:45
  • 173

数据库编程笔录之四

本篇想说一下如何获取记录集中各种类型的数值。比如数据库中定义的是varchar类型等,我们获取数据时该怎么写呢?这里我提供一些宏定义,大家只要在stdafx.h或者其它需要使用这些宏的地方插入这些...
  • liguiyuan
  • liguiyuan
  • 2008年04月09日 01:44
  • 155

数据库编程笔录之三

将就一下,程序能够运行再说吧。添加了错误日志后,发现有很多条记录无法插入。错误报告为传入的数据类型不一致。仔细看了程序,好像没有任何破绽啊。经过分析,可疑的语句为:                pa...
  • happyparrot
  • happyparrot
  • 2004年10月14日 11:12
  • 1298

数据库编程笔录之三

将就一下,程序能够运行再说吧。添加了错误日志后,发现有很多条记录无法插入。错误报告为传入的数据类型不一致。仔细看了程序,好像没有任何破绽啊。经过分析,可疑的语句为:                ...
  • liguiyuan
  • liguiyuan
  • 2008年04月09日 01:44
  • 127

java2核心技术之数据库编程笔录(一)

1.例子:rs.getString(1);与rs.getString("Price"); 1.使用数字参数效率更高一些,但是使用字符串参数可以使代码易于阅读和维护。 2.注意:与数组的索引不同,数据库...
  • aqszhuaihuai
  • aqszhuaihuai
  • 2008年04月27日 08:51
  • 632

VB.net数据库编程pdf

下载地址:网盘下载  全书分成3部分共12章。第一部分包括3章,是基础部分,介绍VB.NET调用sQL语句操作Access、SQL Server数据的方法,每章后面都配有一个短小而综合的例子,在此基础...
  • cf406061841
  • cf406061841
  • 2018年02月01日 17:01
  • 31

Retrofit 2.3使用随文笔录

首先创建一个接接口 public interface RetrofitInterface { // https://api.douban.com/v2/movie/coming_soon?cou...
  • qq_34501274
  • qq_34501274
  • 2017年08月12日 11:54
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库编程笔录之二
举报原因:
原因补充:

(最多只允许输入30个字)