• <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>

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

            Blog @ Blog

            當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見。 -- 聶魯達(dá)

            常用鏈接

            統(tǒng)計(jì)

            積分與排名

            BBS

            Blog

            Web

            最新評(píng)論

            VC執(zhí)行存儲(chǔ)過程

            最近由于工作之需,要利用VC進(jìn)行一些高級(jí)的數(shù)據(jù)庫操作,如執(zhí)行存儲(chǔ)過程等。遍尋網(wǎng)絡(luò)資源發(fā)現(xiàn)好使的不多(經(jīng)常#30XX錯(cuò)誤,大部分應(yīng)該是COM的VARIANT數(shù)據(jù)類型所致,其實(shí)有個(gè)討巧的方法,請(qǐng)看下文),在自己的實(shí)驗(yàn)下小有所得。記下學(xué)習(xí)筆記以備參考:

            1 進(jìn)行ADO編程的必備步驟:引入msado15.dll

             #import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")//避免與文件的結(jié)束符號(hào)混淆,將EOF改為adoEOF

             當(dāng)然要記得在所有#include之后加入啊


            2 也是必備的:初始化Com庫

             ::CoInitialize(NULL);///初始化COM庫

            3 建立數(shù)據(jù)庫連接

             _ConnectionPtr m_pConnection;//連接數(shù)據(jù)庫的Com智能指針,可以自動(dòng)Release ^_^
             m_pConnection.CreateInstance("ADODB.Connection");//建立實(shí)例返回HRESULT 所以最好if一下看看成功否

            4 連接數(shù)據(jù)庫

             m_pConnection->Open("Driver={SQL Server};Server=localhost;Database=Northwind;UID=sa;PWD=wxy","","",adModeUnknown);
             
             最好用Try的,可以捕獲錯(cuò)誤啊,例如

             try
             {
             m_pConnection->Open("Driver={SQL Server};Server=localhost;Database=Northwind;UID=sa;PWD=wxy","","",adModeUnknown);

              .........//其他數(shù)據(jù)庫操作
             }
             catch(_com_error e)
             {
              //處理錯(cuò)誤吧
             }

            5 創(chuàng)建執(zhí)行存儲(chǔ)過程的命令對(duì)象

             _CommandPtr m_pCommand;//還是智能指針
             m_pCommand.CreateInstance("ADODB.Command");//實(shí)例
             m_pCommand->ActiveConnection = m_pConnection;//設(shè)置連接,別忘了啊
             m_pCommand->CommandText = "Test";//存儲(chǔ)過程為Test

             假設(shè)我的存儲(chǔ)過程如下:
              CREATE PROCEDURE Test
              @id int,
              @Name varchar(20),
              @sdate datetime,
              @ret char(1) output
               AS
              insert into VCStorproc values(@id,@Name,@sdate)
              if @@error=0
               set @ret=1
              else
               set @ret=0
              go

              

            6 建立傳入存儲(chǔ)過程的參數(shù)

             存儲(chǔ)過程Test中輸入?yún)?shù)id,name,sdate 輸出參數(shù)ret  記住他們的類型和大小啊

             下面就來創(chuàng)建4個(gè)參數(shù)

             VC中用_ParameterPtr智能指針來建立參數(shù),具體如下:

             _ParameterPtr m_pParam;
             m_pParam.CreateInstance("ADODB.Parameter");

             _ParameterPtr m_pParam1;//附加數(shù)字的命名習(xí)慣不好別學(xué)我啊
             m_pParam1.CreateInstance("ADODB.Parameter");

             _ParameterPtr m_pParam2;
             m_pParam2.CreateInstance("ADODB.Parameter"); 

             _ParameterPtr m_pParamRet;
             m_pParamRet.CreateInstance("ADODB.Parameter");

             別高興還沒有真正的建立好參數(shù)

             m_pParam = m_pCommand->CreateParameter("id",adInteger,adParamInput,-1,(_variant_t)"10");//給參數(shù)設(shè)置各屬性
             m_pCommand->Parameters->Append(m_pParam);//加入到Command對(duì)象的參數(shù)集屬性中

             m_pParam1 = m_pCommand->CreateParameter("Name",adVarChar,adParamInput,20,(_variant_t)"songwenfeng");
             m_pCommand->Parameters->Append(m_pParam1);

             m_pParam2 = m_pCommand->CreateParameter("sdate",adVarChar,adParamInput,32,(_variant_t)"2004-6-8");
             m_pCommand->Parameters->Append(m_pParam2);
             
             //**************
              這里有個(gè)問題:就是DateTime數(shù)據(jù)類型要用adVarChar來傳遞,由于我們的時(shí)間格式為XXXX-XX-XX XX:XX:XX所以32位足夠了,有時(shí)我們會(huì)用adDate或adDBDate類型來傳遞DateTime,這就是導(dǎo)致error #3015的原因之一,當(dāng)然用它來傳遞應(yīng)該是可以的,但是小弟至今沒有成功過,哪位大蝦知道告訴小弟一聲啊
            *******//


             m_pParamRet=m_pCommand->CreateParameter("ret",adChar,adParamOutput,1);
             m_pCommand->Parameters->Append(m_pParamRet);


             大功告成,執(zhí)行吧

             m_pCommand->Execute(NULL,NULL,adCmdStoredProc); 
             //***
             第一個(gè)參數(shù)是被影響的記錄數(shù)是一個(gè)VARIANT的指針變量,需要的話設(shè)個(gè)變量取過來就是了 但是MSDN說
             The RecordsAffected parameter applies only for action queries or stored procedures. RecordsAffected does not return the number of records returned by a result-returning query or stored procedure. To return this information, use the RecordCount property。就是說有返回值的存儲(chǔ)過程是不會(huì)返回影響的記錄數(shù)的,要使用RecordCount屬性

             第二個(gè)參數(shù)是指向Parameters的VARIANT指針,是可選的,既然設(shè)置好了參數(shù)指針就把它設(shè)為NULL吧。MSDN說
            A Variant array of parameter values passed with an SQL statement. (Output parameters will not return correct values when passed in this argument.)用這個(gè)參數(shù)的話輸出參數(shù)將不會(huì)返回正確的值。微軟是不是挺有意思
            *************//


             數(shù)據(jù)庫里已經(jīng)有了一條新記錄了,看看

             id name  sdate
             10 songwenfeng 2004-6-8

            7 最后一步,關(guān)閉連接,釋放Com,走人!!

             m_pConnection->Close();
             CoUninitialize();


             VC操作數(shù)據(jù)庫真是麻煩帶氣人,不過微軟在.net中做的十分不錯(cuò),畢竟現(xiàn)在VC在數(shù)據(jù)庫工程中已經(jīng)很少用了(除非要求很高的效率),可是對(duì)一些老程序還得更新不是。

            posted on 2008-07-03 10:42 isabc 閱讀(3464) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫

            廣告信息(免費(fèi)廣告聯(lián)系)

            中文版MSDN:
            歡迎體驗(yàn)

            久久久噜噜噜久久中文字幕色伊伊 | 国产精品乱码久久久久久软件| 日本高清无卡码一区二区久久 | 久久精品免费网站网| 久久无码AV一区二区三区| 久久夜色精品国产噜噜噜亚洲AV| 久久久精品免费国产四虎| 日本精品久久久久影院日本| 狠狠88综合久久久久综合网| 久久久久久A亚洲欧洲AV冫 | 亚洲午夜精品久久久久久浪潮 | 久久ZYZ资源站无码中文动漫| 大蕉久久伊人中文字幕| 麻豆成人久久精品二区三区免费| 久久99精品国产麻豆蜜芽| 97精品伊人久久大香线蕉app| 噜噜噜色噜噜噜久久| 国内精品伊人久久久久影院对白| 浪潮AV色综合久久天堂| 久久久久国产精品三级网| 99re这里只有精品热久久| 久久久久亚洲精品无码蜜桃| 欧美亚洲国产精品久久高清| 久久久久国产精品嫩草影院| 91精品国产91久久久久久| 国内精品九九久久久精品| 久久热这里只有精品在线观看| 久久人搡人人玩人妻精品首页| 色成年激情久久综合| 青青草国产精品久久久久| 久久青青草原综合伊人| 7777久久亚洲中文字幕| 国产精品久久久久影视不卡| 国产精品久久久久久久久| 久久r热这里有精品视频| 久久精品国产免费一区| 国产日韩久久久精品影院首页 | 99久久99久久久精品齐齐| 久久久久国产精品| 久久这里只有精品视频99| 久久只有这精品99|