自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

VC調(diào)用SQL Server存儲(chǔ)過(guò)程的通用方法介紹

數(shù)據(jù)庫(kù) SQL Server
本文我們主要介紹了VC調(diào)用SQL Server存儲(chǔ)過(guò)程的通用方法,希望能夠?qū)δ兴鶐椭?/div>

VC調(diào)用SQL Server存儲(chǔ)過(guò)程的通用方法的相關(guān)知識(shí)是本文我們主要要介紹的內(nèi)容,這里討論的是ADO調(diào)用存儲(chǔ)過(guò)程,按MSDN的例子,一般都是下面的調(diào)用方法(節(jié)選自MSDN):

  1. HRESULT hr = S_OK;  
  2. // Define ADO object pointers.  
  3. // Initialize pointers on define.  
  4. // These are in the ADODB:: namespace.  
  5. _RecordsetPtr pRstByRoyalty = NULL;  
  6. _RecordsetPtr pRstAuthors = NULL;   
  7. _CommandPtr pcmdByRoyalty = NULL;  
  8. _ParameterPtr pprmByRoyalty = NULL;  
  9. _ConnectionPtr pConnection = NULL;  
  10. _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"  
  11. "Initial Catalog=Pubs;User Id=sa;Password=;");  
  12. _bstr_t strMessage, strAuthorID;  
  13. int intRoyalty;  
  14. VARIANT vtRoyalty;  
  15. try  
  16. {  
  17. //Open a Connection.  
  18. TESTHR(pConnection.CreateInstance(__uuidof(Connection)));  
  19. hr = pConnection->Open(strCnn,"","",NULL);  
  20. pConnection->CursorLocation = adUseClient;  
  21. //Open Command Object with one Parameter  
  22. TESTHR(pcmdByRoyalty.CreateInstance(__uuidof(Command)));  
  23. pcmdByRoyalty->CommandText = "byroyalty";  
  24. pcmdByRoyalty->CommandType = adCmdStoredProc;  
  25. //Define Integer/variant.  
  26. vtRoyalty.vt = VT_I2;  
  27. vtRoyalty.iVal = intRoyalty;  
  28. pprmByRoyalty = pcmdByRoyalty->CreateParameter(  
  29. "percentage",adInteger,adParamInput,sizeof(int),vtRoyalty);  
  30. pcmdByRoyalty->Parameters->Append(pprmByRoyalty);  
  31. pprmByRoyalty->Value = vtRoyalty;  
  32. //Create Recordset by executing the command  
  33. pcmdByRoyalty->ActiveConnection = pConnection;  
  34. pRstByRoyalty = pcmdByRoyalty->Execute(  
  35. NULL,NULL,adCmdStoredProc);  
  36. //執(zhí)行結(jié)果的處理,省略...  
  37. pRstByRoyalty->Close();  
  38. pRstAuthors->Close();  
  39. pConnection->Close();   
  40. }  
  41. catch(_com_error &e)  
  42. {  
  43. //意外處理...  
  44. }  

 

必須指定執(zhí)行SQL語(yǔ)句的CommandType是adCmdStoredProc,存儲(chǔ)過(guò)程有參數(shù)就必須CreateParameter生成參數(shù),這樣調(diào)用存儲(chǔ)過(guò)程就成了很麻煩的一件事情,必須針對(duì)不同的存儲(chǔ)過(guò)程生成不同的參數(shù)。一個(gè)兩個(gè)還可以接受,如果項(xiàng)目的業(yè)務(wù)邏輯比較復(fù)雜,需要依賴大量的存儲(chǔ)過(guò)程,并且項(xiàng)目的需求或功能可能要經(jīng)常變動(dòng)或擴(kuò)展,那就成了一個(gè)噩夢(mèng)了。有沒(méi)有通用的方法呢?當(dāng)然有,只需要通用的查詢就可以實(shí)現(xiàn)。

  1. _ConnectionPtr pConnection = NULL;  
  2. m_Conn.CreateInstance(__uuidof(Connection));  
  3. m_Conn->ConnectionString = "Provider=sqloledb;Data Source=srv;"Initial Catalog=Pubs;User Id=sa;Password=;";  
  4. m_Conn->Open("","","",NULL);  
  5. _variant_t m_param;  
  6. _bstr_t m_bstr;  
  7. int index = 0,nFieldCount;  
  8. _RecordsetPtr m_Rs;  
  9. m_Rs.CreateInstance(__uuidof(Recordset));  
  10. m_Rs->Open("select * from titles",(IDispatch*)(m_Conn->m_Conn),adOpenStatic,adLockReadOnly,adCmdText);  
  11. nFieldCount = m_Rs->Fields->Count;  
  12. while(!m_Rs->EndOfFile)  
  13. {  
  14. for(index=0;index < nFieldCount;index ++)  
  15. {  
  16. m_param.Clear();  
  17. m_param = (short)index;  
  18. m_param = m_Rs->Fields->GetItem(m_param);  
  19. if(m_param.vt != VT_NULL)  
  20. m_bstr = m_param;  
  21. else  
  22. m_bstr = "";  
  23. printf("%s/n",(char*)m_bstr);  
  24. }  
  25. m_Rs->MoveNext();  
  26. }  
  27. m_Rs->Close();  
  28. m_Conn->Close(); 

 

以上一段就是普通的執(zhí)行查詢SQL語(yǔ)句的代碼,簡(jiǎn)單起見(jiàn),去掉了所有防護(hù)和判斷代碼,對(duì)于MS SQLServer,如果是執(zhí)行返回結(jié)果集的存儲(chǔ)過(guò)程,比如Pubs的byroyalty,只需要把上面代碼中的"select * from titles"替換成"byroyalty 100"就可以了,即"過(guò)程名 參數(shù)1,參數(shù)2,..."形式。

這樣一來(lái),不需要生成參數(shù),只需要改變SQL語(yǔ)句,就實(shí)現(xiàn)了MS SQLServer存儲(chǔ)過(guò)程的調(diào)用,可以通用。但是對(duì)于返回參數(shù)的存儲(chǔ)過(guò)程,這段代碼就不行了,不過(guò)還是可以通過(guò)SQL語(yǔ)句解決:“declare @q int exec checkpwd 'user','pwd',@ret = @q OUTPUT select @q”checkpwd是一個(gè)存儲(chǔ)過(guò)程,兩個(gè)輸入?yún)?shù),用戶名和密碼,第三個(gè)是輸出參數(shù)@ret,返回用戶驗(yàn)證的結(jié)果。

通過(guò)執(zhí)行上面的SQL語(yǔ)句,把輸出參數(shù)作為結(jié)果集返回,就可以適應(yīng)上面的VC代碼了。返回值的存儲(chǔ)過(guò)程也是一樣,執(zhí)行“declare @q int,@return intexec @return = checkpwd 'user','pwd',@ret = @q OUTPUT select @q,@return”就可以了。

以上就是VC調(diào)用SQL Server存儲(chǔ)過(guò)程的通用方法的相關(guān)知識(shí),本文我們就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!

【編輯推薦】

  1. SQL Server 2005導(dǎo)入Oracle 10g的C#源碼
  2. SQL Server 2008快速清理日志文件的代碼
  3. SQL Server 2008數(shù)據(jù)庫(kù)中CDC的功能使用及說(shuō)明
  4. SQL Server 2008阻止保存要求重新創(chuàng)建表的更改的問(wèn)題
  5. SQL Server數(shù)據(jù)庫(kù)row_number() over() 來(lái)自動(dòng)產(chǎn)生行號(hào)
責(zé)任編輯:趙鵬 來(lái)源: CSDN博客轉(zhuǎn)載
相關(guān)推薦

2009-08-06 16:44:06

2010-11-12 09:46:55

Sql Server存

2010-11-10 13:03:15

SQL Server存

2009-08-06 18:02:22

存儲(chǔ)過(guò)程

2017-09-04 11:48:56

MybatisOracle存儲(chǔ)過(guò)程

2012-05-10 11:17:23

JavaSQL Server

2009-08-17 18:30:29

C# SQL Serv

2011-08-22 10:15:39

數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程

2010-11-10 15:16:14

Sql Server分

2011-06-17 17:37:16

JavaSQL Server

2010-01-22 16:48:54

VB.NET調(diào)用SQL

2010-07-15 12:38:14

SQL Server存

2015-08-19 14:18:56

SQLasp.net后臺(tái)調(diào)用

2011-03-24 13:38:47

SQL Server 存儲(chǔ)分頁(yè)

2010-10-09 16:26:59

mysql存儲(chǔ)過(guò)程

2010-07-23 14:26:37

SQL Server存

2011-07-22 13:47:23

存儲(chǔ)過(guò)程

2010-09-16 16:23:06

sql server批

2009-08-05 14:45:56

VC中DLL的創(chuàng)建及調(diào)

2011-08-29 15:52:19

SQL ServerMybatis存儲(chǔ)過(guò)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)