青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

Blog @ Blog

當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

常用鏈接

統計

積分與排名

BBS

Blog

Web

最新評論

VC中使用ADO調用存儲過程實現方法

開發環境是VS2005  ,數據庫是SQL Sever 2000

1. 在進入正題之前,先講點別的,如何在VC中連接Sybase數據庫,

   連接字符竄為,

  _bstr_t strCnn(\"Driver={Sybase System 11};Srvr=RRRRR;Uid=RRR_Mao_bb1;Pwd=user2\");

這里,RRRRR是數據庫的名稱,已經在Sybase->sdedit中設定好了

 RRR_Mao_bb1 和 user2分別是用戶名和密碼

 不過使用這種基于ODBC的連接使用一段時間以后,就出現問題了,出現了“Catastrophic failure”的錯誤,微軟的解釋是  http://support.microsoft.com/kb/243349/en-us

 

2. 為了使我們的調用存儲過程的例子有更多的通用性,我建了有輸入參數,有輸出參數,有一個返回記錄集,有一個返回值的存儲過程,如下

  
CREATE  PROCEDURE sp_1  (
                         @pin1  int ,
                         @pin2  CHAR(10),
                         @pout1 int OUTPUT,
                         @pout2 CHAR(10)  OUTPUT
                       )
AS                      
BEGIN
  declare  @retval  int
 
  select @pout1 = @pin1 + 100
 
  select @pout2 =  left( ltrim(rtrim(@pin2)) + \'123\' , 10)
 
  select Num,Name,Date
    from TABLE1
   
  select @retval =  1236
 
  return @retval
END

對于這個SP來說,他這些個參數是

@RETURN_VALUE(int ,返回值)  

@pin1 ( int  ,輸入 )  

@pin2 ( char(10)  ,輸入 ) 

@pout1 (int ,輸入/輸出) 

@pout1 ( char(10)  , 輸入/輸出)  

@RETURN_VALUE是第0個參數,@pin1是第1個,依此類推

以上信息可以在SQL 的查詢分析器中看到,注意,這些參數的順序很重要

 

3.調用的前期準備

  這就不多說了,什么import 庫阿,建立連接阿,什么的,不多說了,

 這些在 VC中使用ADO進行數據庫開發的一些資料的整理 中有了闡述

假定連接是pConn

注意,這里要把pConn設定成adUseClient型[Page]

pConn->CursorLocation =adUseClient;

下面我要貼具體的代碼了,為了精簡所貼的代碼,我把所有的捕獲異常都沒貼出來(try catch)

 

4.使用Refresh的方法來調用

先定義一些變量

 _CommandPtr     pCmd = NULL;
 _RecordsetPtr   pRecordset = NULL;

初試化他們,

 pCmd.CreateInstance(__uuidof(Command));
  pRecordset.CreateInstance(_uuidof(Recordset));
  pCmd->ActiveConnection = pConn;
  pCmd->CommandType = adCmdStoredProc;
  pCmd->CommandText=_bstr_t(_T(\"sp_1\"));  //SP Name

然后給那些input參數賦值

 pCmd->Parameters->Refresh();  
 
pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin1\") )]->Value=_variant_t(3);  

 pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin2\") )]->Value=_variant_t(\"DD\");  

這個refresh一定要有,

調SP

pRecordset =  pCmd->Execute(NULL,NULL,adCmdStoredProc);

int   retVal = -1;
 _variant_t   VretVal ;

//GetRetVal
  VretVal = pCmd->Parameters->GetItem(short(0))->Value;
 
  retVal = VretVal.lVal;
  
  Info.Format(_T(\"The Return Value is : %d\"),retVal);
  MessageBox(Info);


  //output1
  VretVal = pCmd->Parameters->GetItem(short(3))->Value;
  retVal = VretVal.lVal;
  
  Info.Format(_T(\"The output1 Value is : %d\"),retVal);
  MessageBox(Info);
 

  //@pout2
  VretVal = pCmd->Parameters->GetItem(short(4))->Value;
 
  Info= (LPCTSTR)_bstr_t(VretVal);
  CString info1;
  info1.Format(_T(\"The output2 Value is : %s\"),Info);
 
  MessageBox(info1);

 //取記錄集里面的內容


  if (pRecordset->adoBOF && pRecordset->adoEOF)
  {
   MessageBox(\"沒有符合條件的記錄存在!\",\"提示\");

   if(pRecordset != NULL && pRecordset->State)
   {
    pRecordset->Close();
    pRecordset = NULL; 

}

 

   pCmd.Detach();
   return;
  }
 
  pRecordset->MoveFirst();
 
  for(;!pRecordset->adoEOF;pRecordset->MoveNext())
  {
   VRectVal = pRecordset->GetCollect(_T(\"Name\"));
   StrVal = (LPCTSTR)_bstr_t(VRectVal);
   m_list.AddString(StrVal);
  }
 

  if(pRecordset != NULL && pRecordset->State)
  {
   pRecordset->Close();
   pRecordset = NULL;  [Page]
  }

最后pCmd.Detach();

 在這里,有一點要注意的是

VretVal = pCmd->Parameters->GetItem(short(4))->Value;
這里的4,就是哪個output參數的index,就是我在2中說的參數的順序

這里使用了Refresh,這是一個很重要的函數,我將在下面介紹一下它,我要先貼出另一種,不使用Refresh的辦法,

5 .使用非Refresh的方法來調用

先定義變量

_CommandPtr     pCmd = NULL;
 _RecordsetPtr   pRecordset = NULL;


 _ParameterPtr   retParam = NULL;  
    _ParameterPtr   inParam1 = NULL; 
 _ParameterPtr   inParam2 = NULL; 
 _ParameterPtr   outParam1 = NULL;
 _ParameterPtr   outParam2 = NULL; 

初試化


        pCmd.CreateInstance(__uuidof(Command));
  pRecordset.CreateInstance(_uuidof(Recordset));

retParam.CreateInstance(__uuidof(Parameter));

//其他的ParameterPtr   也初試化
  pCmd->ActiveConnection = pConn;
  pCmd->CommandType = adCmdStoredProc;
   pCmd->CommandText=_bstr_t(_T(\"sp_1\"));  //SP Name

 retParam = pCmd ->CreateParameter(_bstr_t(\"Return\"),
                                 adInteger,
            adParamReturnValue,
            sizeof(int));
  pCmd->Parameters->Append(retParam);

 
 
        inParam1  = pCmd ->CreateParameter(_bstr_t(\"InParam1\"),
                                 adInteger,
            adParamInput,
            sizeof(int));

  inParam1->Value = _variant_t(3);

  pCmd->Parameters->Append(inParam1);


  inParam2  = pCmd ->CreateParameter(_bstr_t(\"InParam2\"),
                                 adChar,
            adParamInput,[Page]
            10);
 
  inParam2->Value = _variant_t(_T(\"DD1\"));

  pCmd->Parameters->Append(inParam2);


  outParam1 = pCmd ->CreateParameter(_bstr_t(\"OutParam1\"),
                                 adInteger,
            adParamOutput,
            sizeof(int));
  pCmd->Parameters->Append(outParam1);


  outParam2 = pCmd ->CreateParameter(_bstr_t(\"OutParam2\"),
                                 adChar,
            adParamOutput,
            10);
  pCmd->Parameters->Append(outParam2);

 

這里不用refresh的辦法,是用Parameter來,這里要注意的是,這個add的順序要和參數的index順序要一致

下面就是調用了

pRecordset =  pCmd->Execute(NULL,NULL,adCmdStoredProc);

然后取那些return值阿,output值阿什么的

這里有一個區別,就是用這種辦法

可以有三種辦法來取這些返回值和output參數

VretVal = pCmd->Parameters->GetItem(_bstr_t(\"Return\"))->Value;
VretVal = pCmd->Parameters->GetItem(short(0))->Value;
 VretVal = retParam->Value;

都是一樣的

6. 關于Refresh

關于這個函數,作用是

Command   對象去重新索取要操作的存儲過程所有有關參數的信息,并且清空在refresh之前獲取的參數信息。  

所以一但調用它以后,就可以獲取SP的那些信息,那些參數的信息,可以通過pCmd->Parameters->Item[_variant_t(_bstr_t(\"@pin1\") )]->Value=_variant_t(3);   這樣的方式來設置參數

如果要使用Parameter的辦法的話,就不要用refresh了,事實上,如果先把這些參數的值設置好了,如  inParam2->Value = _variant_t(_T(\"DD1\"));,一旦refresh后,這些參數就沒有意義了。

7.關于pConn->CursorLocation =adUseClient;

 設置這個東西,如果不設置游標為adUseClient,那么我在取return和output參數的時候,必須在我把記錄集關閉以后才能取,就是說,必須先取記錄集,然后關閉它,最后再取return和output參數,如果我在關閉記錄集之前就取return和output的值,那么就不能取到正確的值,設成adUseClient就ok了,

另外有一點就是,Execute 方法返回的游標繼承該設置。Recordset 將自動從與之關聯的連接中繼承該設置。我把pConn設成adUseClient,那么最后,我的記錄集也是adUseClient的了[Page]

posted on 2008-06-17 23:39 isabc 閱讀(4292) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫

廣告信息(免費廣告聯系)

中文版MSDN:
歡迎體驗

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久亚洲国产美女国产盗摄| 欧美日韩国产丝袜另类| 母乳一区在线观看| 亚洲国产欧美一区二区三区久久| 国产精品v欧美精品∨日韩| 久久久成人精品| 亚洲欧美日韩系列| 亚洲一区二区精品在线| 亚洲黄一区二区三区| 久久一区二区精品| 久久精品99久久香蕉国产色戒| 国产日韩在线一区二区三区| 欧美喷潮久久久xxxxx| 久久综合色播五月| 久久久久久电影| 亚洲一区图片| 一区二区三区四区五区视频| 91久久久久久久久久久久久| 亚洲一区二区三区四区五区午夜| 99精品热视频| 亚洲一区日韩在线| 亚洲欧美日韩爽爽影院| 亚洲欧美国产视频| 久久精品九九| 男同欧美伦乱| 一区二区三区四区蜜桃| 久久久久免费视频| 欧美日韩在线视频一区二区| 国产一区二区高清视频| 99精品视频一区二区三区| 欧美在线观看视频| 亚洲人成精品久久久久| 欧美在线观看视频一区二区| 欧美精品一级| 在线观看亚洲a| 午夜国产精品视频| 亚洲激情自拍| 久久免费的精品国产v∧| 欧美吻胸吃奶大尺度电影| 亚洲高清不卡| 久久精品一区四区| 制服丝袜激情欧洲亚洲| 欧美成人午夜视频| 红桃视频一区| 久久精品成人欧美大片古装| 正在播放欧美一区| 欧美精品免费看| 亚洲国产精品www| 久久久久久网站| 亚洲一区二区三区视频播放| 欧美国产日韩精品| 亚洲激情电影在线| 蜜桃久久av| 久久精品女人| 狠狠色综合网站久久久久久久| 欧美在线观看你懂的| 亚洲午夜精品国产| 国产精品va在线| 亚洲中字在线| 欧美一区二区视频免费观看| 欧美人与性动交α欧美精品济南到| 韩国在线一区| 久久亚洲综合色| 欧美专区在线| 一区二区视频免费在线观看| 久久夜色精品国产| 久久五月天婷婷| 亚洲欧洲偷拍精品| 亚洲国产网站| 欧美日韩在线播放一区| 亚洲手机在线| 亚洲一区二区在线| 国产欧美亚洲日本| 久久亚洲图片| 久久亚洲综合网| 亚洲国产中文字幕在线观看| 亚洲第一精品夜夜躁人人爽 | 欧美在线你懂的| 国产亚洲欧美日韩日本| 欧美一区二区三区另类| 欧美一级二区| 亚洲日本aⅴ片在线观看香蕉| 欧美激情小视频| 欧美日韩在线视频首页| 欧美一区二区三区电影在线观看| 欧美在线free| 亚洲人成绝费网站色www| 亚洲精品女人| 欧美日韩在线另类| 午夜影视日本亚洲欧洲精品| 欧美在线观看天堂一区二区三区 | 欧美啪啪成人vr| 翔田千里一区二区| 久久综合九色综合欧美就去吻| 一区二区三区高清| 久久成人免费网| 亚洲另类在线视频| 欧美亚洲在线视频| 一本色道久久综合亚洲精品不卡| 亚洲欧美成人网| 1024欧美极品| 亚洲小少妇裸体bbw| 亚洲第一视频| 亚洲无线视频| 亚洲欧洲日韩在线| 午夜亚洲伦理| 亚洲精品在线观| 午夜久久福利| 一区二区三区免费网站| 久久久久久久激情视频| 在线亚洲高清视频| 久久国产精品久久久久久久久久| 一区二区久久| 欧美1区3d| 久久亚洲二区| 国产欧美精品一区二区三区介绍| 亚洲电影下载| 久久国产天堂福利天堂| 久久久高清一区二区三区| 亚洲一区3d动漫同人无遮挡| 免费影视亚洲| 欧美1区2区| 狠狠色狠狠色综合日日五| 亚洲综合国产| 亚洲欧美激情一区| 欧美日韩亚洲视频| 亚洲精华国产欧美| 亚洲国产一成人久久精品| 久久精品91久久香蕉加勒比 | 一区二区三区蜜桃网| 免费不卡中文字幕视频| 玖玖在线精品| 黑人操亚洲美女惩罚| 午夜精彩视频在线观看不卡| 亚洲午夜精品福利| 欧美日韩一级片在线观看| 亚洲精品乱码久久久久久久久| 亚洲精品国产精品国产自| 噜噜噜躁狠狠躁狠狠精品视频 | 欧美成人黑人xx视频免费观看| 国产欧美日韩不卡免费| 亚洲专区一区二区三区| 午夜精品久久久久久99热软件| 国产精品久久久久久av下载红粉 | 麻豆精品精品国产自在97香蕉| 国产日韩亚洲欧美| 欧美影院久久久| 欧美va日韩va| 亚洲麻豆一区| 欧美视频在线观看一区| 亚洲视频中文| 久久国产色av| 在线精品国精品国产尤物884a| 狂野欧美一区| 91久久久久久久久久久久久| 在线亚洲欧美视频| 国产精品亚洲精品| 久久久国产精品一区二区中文| 女仆av观看一区| 一区二区免费在线视频| 国产精品国产精品| 久久久久成人精品免费播放动漫| 美脚丝袜一区二区三区在线观看 | 女同一区二区| 一本久久a久久精品亚洲| 午夜精品一区二区三区电影天堂| 国产精品视频免费在线观看| 欧美在线视频免费播放| 免费在线观看精品| 一本色道久久88亚洲综合88| 欧美日韩视频在线第一区| 亚洲午夜极品| 嫩草影视亚洲| 午夜精品福利电影| 亚洲国产91色在线| 国产精品草草| 久久天堂成人| 亚洲一区二区三区四区五区黄 | 欧美在线关看| 欧美福利小视频| av成人免费在线观看| 亚洲国产欧美不卡在线观看| 欧美日韩国产黄| 亚洲欧美日韩专区| 久久精品一区蜜桃臀影院| 日韩视频在线一区二区| 亚洲视频一二| 亚洲美女视频网| 久久人体大胆视频| 午夜天堂精品久久久久| 欧美电影在线播放| 免费在线看一区| 狠狠入ady亚洲精品经典电影| 99视频一区| 99精品福利视频| 欧美福利精品| 亚洲一区久久久| 亚洲性av在线| 国产精品成人v| 亚洲欧美中文另类|