SQL server 数据库之ADO操作技术1

  1. 关于SQL server的数据库操作  
  2.   
  3. 1.导入两个文件  
  4.   
  5. 以下是:(DatabaseAccess.h  文件)  
  6.   
  7. // DatabaseAccess.h: interface for the CDatabaseAccess class.  
  8. //  
  9. //  
  10.   
  11. #if !defined(AFX_DATABASEACCESS_H__19163588_441F_4B21_B354_877412B2B46A__INCLUDED_)  
  12. #define AFX_DATABASEACCESS_H__19163588_441F_4B21_B354_877412B2B46A__INCLUDED_  
  13.   
  14. #if _MSC_VER > 1000  
  15. #pragma once  
  16. #endif // _MSC_VER > 1000  
  17. #include <Afxtempl.h>  
  18.   
  19. // 描述_ParameterPtr对象信息的结构  
  20. typedef struct tagParameterInfo{            // 参数信息  
  21.     _bstr_t                     Name;       // 参数名字   
  22.     enum DataTypeEnum           Type;       // 参数类型  
  23.     enum ParameterDirectionEnum Direction;  // 参数方向(输入、输出)  
  24.     long                        Size;       // 参数尺寸  
  25.     _variant_t                  Value;      // 参数值。  
  26. }PARAMETERINFO, *PPARAMETERINFO;  
  27.   
  28. // 使用前在StdAfx.h中加入#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")  
  29. // 访问数据库前先用::CoInitialize(NULL)初始化COM环境。  
  30. // 程序退出时使用::CoUninitialize()释放资源。  
  31.   
  32. class CDatabaseAccess    
  33. {  
  34. private:  
  35.     bool                m_bIsOracle;    //ORACLE与SQLServer切换标志。默认是ORACLE数据库  
  36.     _ConnectionPtr      m_pCon;         //连接对象  
  37. public:  
  38.   
  39.     int GetRecordSetCount(_RecordsetPtr m);  
  40.     //连接本地数据库(无密码)  
  41.     BOOL ConnectDB(char *DatabaseName);  
  42.       
  43.     //连接本地数据库(有密码) 通过ODBC方式连接  
  44.     BOOL ConnectDB(const char *DatabaseName,char *PassWord);  
  45.       
  46.     CDatabaseAccess();  
  47.       
  48.     virtual ~CDatabaseAccess();  
  49.       
  50.     // 连接到数据库服务器,DSN方式 1成功 0失败  
  51.     BOOL ConnectDBSQL(char *pcDSNName,char *pcUserName,char *pcUserPassword);  
  52.       
  53.     // 连接到数据库服务器,需要IP,端口和Oracle全局数据库名或SID的连接方式。1成功 0失败  
  54.     BOOL ConnectDB(const char *pcUserName ,const char *pcUserPassword ,const char *pcServerIP ,const char *pcServerPort="1024" ,const char *pcConnectServiceName = "MFD");  
  55.       
  56.     //关闭与数据库的连接  
  57.     void CloseConnect();  
  58.       
  59.     //设置数据库类型(ORACLE与SQLServer)  
  60.     void SetDatabaseType(bool bIsOracle=true);  
  61.       
  62.     // 执行存储过程(普通存储过程,即非包中的),非零-正确执行;0-参数个数为负数  
  63.     BOOL ExecuteProcedure(const char *pcProcedureName , PARAMETERINFO aPrameterInfo[],BYTE bCount);  
  64.       
  65.     // 执行存储过程返回记录集的地址。在此函数中使用约定包名:mfd_callpkg。字段列表用"逗号"隔开如:"empid,empname"  
  66.     _RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName , PARAMETERINFO aParameterInfo[] , BYTE bParametersCount , const char *pcFieldsList , const char *pcPackageName = "mfd_callpkg");  
  67.       
  68.     // 无参数的存储过程(普通存储过程,非包中)  
  69.     _RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName);  
  70.       
  71.     // 无参数的存储过程  
  72.     _RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName , const char *pcFieldsList);  
  73.       
  74.     // 执行SQL语句  
  75.     _RecordsetPtr *ExecuteSQLSentence( const char *pcSentence);  
  76.       
  77. };  
  78.   
  79. #endif // !defined(AFX_DATABASEACCESS_H__19163588_441F_4B21_B354_877412B2B46A__INCLUDED_)  
  80.   
  81. 以下是(DatabaseAccess.cpp  文件)  
  82. // DatabaseAccess.cpp: implementation of the CDatabaseAccess class.  
  83. //  
  84. //  
  85.   
  86. #include "stdAfx.h"  
  87. #include "DatabaseAccess.h"  
  88. #ifdef _DEBUG  
  89. #undef THIS_FILE  
  90. static char THIS_FILE[]=__FILE__;  
  91. #define new DEBUG_NEW  
  92. #endif  
  93.   
  94. //  
  95. // Construction/Destruction  
  96. //  
  97.   
  98. CDatabaseAccess::CDatabaseAccess()  
  99. {  
  100.     CoInitialize(NULL);  
  101.     m_bIsOracle=true;       //默认是使用ORACLE数据库  
  102.   
  103.     try  
  104.     {  
  105.         m_pCon.CreateInstance(_uuidof(Connection));  
  106.     }  
  107.     catch(_com_error &e)  
  108.     {  
  109.         TRACE("--CDatabaseAccess::CDatabaseAccess()-- 创建COM实例失败%s,%s\n",(char *)e.Description(),(char *)e.ErrorMessage());  
  110.         return;  
  111.     }  
  112.     catch (...) {  
  113.         TRACE("--CDatabaseAccess::CDatabaseAccess()-- 未知错误,创建COM实例失败\n");  
  114.         return;  
  115.     }  
  116. }  
  117.   
  118. CDatabaseAccess::~CDatabaseAccess()  
  119. {  
  120.     CloseConnect();  
  121. }  
  122.   
  123. // 关闭与数据库的连接  
  124. void CDatabaseAccess::CloseConnect()  
  125. {     
  126.     try  
  127.     {  
  128.         if(m_pCon ->State)  
  129.             m_pCon ->Close();  
  130.     }  
  131.     catch(_com_error &e)  
  132.     {  
  133.         TRACE("--CDatabaseAccess::CloseConnect()-- %s,%s\n",(char *)e.Description(),(char *)e.ErrorMessage());  
  134.         return;  
  135.     }  
  136.     catch (...) {  
  137.         TRACE("--CDatabaseAccess::CloseConnect()-- 不明错误\n");  
  138.         return;  
  139.     }  
  140. }  
  141.   
  142. // 设置数据库类型  
  143. void CDatabaseAccess::SetDatabaseType(bool bIsOracle/*=true*/)  
  144. {  
  145.     m_bIsOracle=bIsOracle;  
  146. }  
  147.   
  148. //连接到数据库服务器,采用系统DSN方式 1成功 0失败  
  149. BOOL CDatabaseAccess::ConnectDBSQL(char *pcDSNName,char *pcUserName,char *pcUserPassword)  
  150. {    
  151.     //连接Sql Server数据库  
  152.     if (!m_bIsOracle)  
  153.     {  
  154.     try  
  155.     {  
  156.         CString     strConnection;  //连接字符串  
  157.         strConnection.Format("DSN=%s;UID=%s;PWD=%s" ,pcDSNName ,  
  158.                               pcUserName ,pcUserPassword);  
  159.         HRESULT     hResult=m_pCon->Open(strConnection.GetBuffer(0) ,"" ,"" ,adModeUnknown);  
  160.         strConnection.ReleaseBuffer();  
  161.   
  162.         if(SUCCEEDED(hResult))  
  163.             return 1;               //连接成功!  
  164.         else  
  165.             return 0;               //连接失败!  
  166.   
  167.     }  
  168.     catch(_com_error &e)  
  169.     {  
  170.         TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());  
  171.         return 0;               //连接失败  
  172.     }  
  173.     catch (...) {  
  174.         TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");  
  175.         return 0;  
  176.     }  
  177.     }  
  178. }  
  179.   
  180. // 连接到数据库服务器,需要IP,端口和Oracle全局数据库名或SID的连接方式。1成功 0失败.  
  181. BOOL CDatabaseAccess::ConnectDB(const char *pcUserName ,const char *pcUserPassword ,const char *pcServerIP ,const char *pcServerPort ,const char *pcGlobalDatabaseName/* = "MFD"*/)  
  182. {     
  183.     if(!m_bIsOracle)  
  184.     {  
  185.         try  
  186.         {  
  187.             CString     strConnection;  //连接字符串  
  188.             strConnection.Format("Provider=SQLOLEDB.1;Password=%s;Persist Security Info=True;User ID=%s;Initial Catalog=%s;Data Source=%s" ,  
  189.                  pcUserPassword,pcUserName,pcGlobalDatabaseName,pcServerIP);  
  190.             TRACE("%s\n" , strConnection.GetBuffer(0));  
  191.             HRESULT     hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);  
  192.             strConnection.ReleaseBuffer();  
  193.             if(SUCCEEDED(hResult))  
  194.                 return 1;               //连接成功!  
  195.             else  
  196.                 return 0;               //连接失败!  
  197.         }  
  198.         catch(_com_error &e)  
  199.         {  
  200.             TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());  
  201.             return 0;               //连接失败  
  202.         }  
  203.         catch (...) {  
  204.             TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");  
  205.             return 0;  
  206.         }  
  207.           
  208.     }  
  209.     else  
  210.     {  
  211.     try  
  212.     {  
  213.         CString     strConnection;  //连接字符串  
  214.         strConnection.Format("Provider=MSDAORA.1;Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = %s)(PORT = %s)))(CONNECT_DATA =(SERVICE_NAME = %s)));User ID=%s;Password=%s" ,  
  215.             pcServerIP ,pcServerPort ,pcGlobalDatabaseName ,pcUserName , pcUserPassword);  
  216.         TRACE("%s\n" , strConnection.GetBuffer(0));  
  217.         HRESULT     hResult=m_pCon->Open(strConnection.GetBuffer(0),"","",adModeUnknown);  
  218.         strConnection.ReleaseBuffer();  
  219.         if(SUCCEEDED(hResult))  
  220.             return 1;               //连接成功!  
  221.         else  
  222.             return 0;               //连接失败!  
  223.     }  
  224.     catch(_com_error &e)  
  225.     {  
  226.         TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());  
  227.         return 0;               //连接失败  
  228.     }  
  229.     catch (...) {  
  230.         TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");  
  231.         return 0;  
  232.     }  
  233. }  
  234. }  
  235.   
  236. // 执行存储过程(普通存储过程,即非包中的),非零-正确执行;0-失败(参数个数为负数)。  
  237. BOOL CDatabaseAccess::ExecuteProcedure(const char *pcProcedureName , PARAMETERINFO aParameterInfo[] , BYTE bCount)  
  238. {  
  239.     _CommandPtr         pCmd;  
  240.     HRESULT hRet = pCmd.CreateInstance(_uuidof(Command));  
  241.     if(FAILED(hRet))  
  242.     {  
  243.         TRACE("--CDatabaseAccess::ExecuteProcedure()-- 创建COMMAND对象失败!");  
  244.         return 0;  
  245.     }  
  246.   
  247.     _ParameterPtr *aParameterPtr = NULL;  
  248.     if(bCount > 0)  
  249.     {  
  250.         // 动态创建参数对象  
  251.         aParameterPtr = new _ParameterPtr[bCount];  
  252.         memset(aParameterPtr , 0 ,sizeof(_ParameterPtr) * bCount);  
  253.     }  
  254.       
  255.     try  
  256.     {  
  257.         _bstr_t    bstrSPName(pcProcedureName);     // 存储过程名  
  258.         if(bCount<=0)                                // 无参数  
  259.         {  
  260.             if(bCount<0)  
  261.             {  
  262.                 return 0;                           // 出错  
  263.             }  
  264.               
  265.             pCmd->ActiveConnection = m_pCon;     // 设置COMMAND对象的属性  
  266.             pCmd->CommandText = bstrSPName;  
  267.             pCmd->CommandType = adCmdStoredProc;  
  268.             // 动态创建记录集对象。  
  269.             _RecordsetPtr  *ppRs = new _RecordsetPtr();       
  270.             (*ppRs) = pCmd->Execute(NULL ,NULL ,NULL);       // 执行存储过程  
  271.               
  272.             return (BOOL)ppRs;  
  273.         }  
  274.           
  275.         pCmd->ActiveConnection = m_pCon;         // 设置COMMAND对象的属性  
  276.         pCmd->CommandText = bstrSPName;  
  277.         pCmd->CommandType = adCmdStoredProc;  
  278.   
  279.   
  280.         //创建参数实例并添加之  
  281.         for(int i=0; i < bCount; i++)  
  282.         {  
  283.             aParameterPtr[i] = pCmd->CreateParameter(aParameterInfo[i].Name , aParameterInfo[i].Type , aParameterInfo[i].Direction , aParameterInfo[i].Size);  
  284.             pCmd->Parameters->Append(aParameterPtr[i]);  
  285.         }  
  286.         if(!m_bIsOracle)                                    // SQLServer中需要!  
  287.             pCmd->Parameters->Refresh();                  // 资源集中的操作  
  288.           
  289.           
  290.         // 对输入参数的处理  
  291.         for(i=0; i < bCount; i++)  
  292.         {             
  293.             if(aParameterInfo[i].Direction==adParamInput || aParameterInfo[i].Direction == adParamInputOutput)    
  294.             {  
  295.                 if(m_bIsOracle)                             //oracle数据库  
  296.                 {  
  297.                     pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value = aParameterInfo[i].Value;   
  298.                 }  
  299.                 else                                        //SQLserver数据库  
  300.                 {  
  301.                     CString str;  
  302.                     str.Format("@%s",((char *)aParameterInfo[i].Name));  
  303.                     pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value = aParameterInfo[i].Value;   
  304.                 }  
  305.             }  
  306.         }  
  307.           
  308.         pCmd->Execute(NULL ,NULL ,NULL);                 //通过COMMAND对象来执行存储过程。  
  309.               
  310.         // 对输出参数的处理  
  311.         for(i=0; i < bCount; i++)  
  312.         {         
  313.             if(aParameterInfo[i].Direction==adParamOutput || aParameterInfo[i].Direction == adParamInputOutput)   
  314.             {  
  315.                 if(m_bIsOracle)                             //oracle数据库  
  316.                 {  
  317.                     aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value;  
  318.                 }  
  319.                 else                                        //SQLserver数据库  
  320.                 {  
  321.                     CString str;  
  322.                     str.Format("@%s",((char *)aParameterInfo[i].Name));  
  323.                     aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value;  
  324.                 }  
  325.             }    
  326.         }  
  327.         if(bCount > 0)  
  328.             delete []aParameterPtr;  
  329.         return 1;                                                 
  330.     }  
  331.     catch(_com_error &e)  
  332.     {  
  333.         TRACE("--CDatabaseAccess::ExecuteProcedure()-- %s,%s\n",(char *)e.Description(),(char *)e.ErrorMessage());  
  334.         if(bCount > 0)  
  335.             delete []aParameterPtr;  
  336.         return 0;  
  337.     }  
  338.     catch (...) {  
  339.         TRACE("--CDatabaseAccess::ExecuteProcedure()-- 不明错误\n");  
  340.         if(bCount > 0)  
  341.             delete []aParameterPtr;  
  342.         return 0;  
  343.     }     
  344. }  
  345.   
  346. // 执行存储过程返回记录集的地址。在此函数中使用约定包名:mfd_callpkg。字段列表用"逗号"隔开如:"empid,empname"。  
  347. // 存储过程格式约定:包名.存储过程名(输入参数 , 输入参数 , 输出参数 , 结果集)。  
  348. _RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName , PARAMETERINFO aParameterInfo[] , BYTE bParametersCount ,   
  349.     const char *pcFieldsList , const char *pcPackageName/* = "mfd_callpkg"*/)  
  350. {  
  351.     _RecordsetPtr  *ppRs = new _RecordsetPtr;                           // 动态创建记录集对象  
  352.     HRESULT hpRecordset = (*ppRs).CreateInstance(_uuidof(Recordset));  
  353.     if(FAILED(hpRecordset))  
  354.     {  
  355.         TRACE("--CDatabaseAccess::ExecProGetRecordset()-- 创建RECORDSET对象失败!");  
  356.         return NULL;  
  357.     }  
  358.       
  359.     _CommandPtr         pCmd;  
  360.     HRESULT hRet = pCmd.CreateInstance(_uuidof(Command));  
  361.     if(FAILED(hRet))  
  362.     {  
  363.         TRACE("--CDatabaseAccess::ExecProGetRecordset()-- 创建COMMAND对象失败!");  
  364.         return NULL;  
  365.     }  
  366.   
  367.     const CString strResultsetNumber = "1000";                      // 结果集中记录的个数.好像是上限  
  368.     CString       strCallScript;                                    // 调用格式.  
  369.     strCallScript = "{call ";  
  370.     if(strlen(pcPackageName))                                       // 如果在包中。则连入包名。  
  371.     {  
  372.         strCallScript += pcPackageName;  
  373.         strCallScript += ".";                             
  374.     }  
  375.     strCallScript += pcProcedureName;  
  376.     strCallScript += "(";  
  377.     for(int i=1 ; i<=bParametersCount ; i++)  
  378.     {  
  379.         strCallScript += "?,";  
  380.     }  
  381.     strCallScript += "{resultset ";  
  382.     strCallScript += strResultsetNumber;  
  383.     strCallScript += ",";  
  384.     strCallScript += pcFieldsList;  
  385.     strCallScript += "})}";  
  386.       
  387.     TRACE("%s\n" , strCallScript.GetBuffer(0));  
  388.     _ParameterPtr *aParameterPtr = NULL;  
  389.     if(bParametersCount > 0)  
  390.     {   // 动态创建参数对象  
  391.         aParameterPtr=new _ParameterPtr[bParametersCount];  
  392.         memset(aParameterPtr , 0 ,sizeof(_ParameterPtr) * bParametersCount);  
  393.     }  
  394.       
  395.     try  
  396.     {  
  397.         if(bParametersCount <= 0)                    // 无参数  
  398.         {  
  399.             if(bParametersCount < 0)  
  400.             {  
  401.                 delete ppRs;  
  402.                 return (_RecordsetPtr*)NULL;        // 出错  
  403.             }  
  404.               
  405.             pCmd->ActiveConnection = m_pCon;     // 设置COMMAND对象的属性  
  406.             pCmd->CommandText = strCallScript.AllocSysString();  
  407.             pCmd->CommandType = adCmdText;  
  408.               
  409.             _variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);       //变体类型空值  
  410.               
  411.             (*ppRs)->CursorLocation = adUseClient;  
  412.             (*ppRs)->Open((IDispatch*)pCmd , vtEmpty, adOpenKeyset, adLockOptimistic,adOpenRecordUnspecified);  
  413.               
  414.             return ppRs;  
  415.         }  
  416.   
  417.         pCmd->ActiveConnection = m_pCon;         // 设置COMMAND对象的属性  
  418.         pCmd->CommandText = strCallScript.AllocSysString();  
  419.         pCmd->CommandType = adCmdText;  
  420.   
  421.   
  422.         //创建参数实例并添加之  
  423.         for(int i=0; i < bParametersCount; i++)  
  424.         {  
  425.             aParameterPtr[i] = pCmd->CreateParameter(aParameterInfo[i].Name , aParameterInfo[i].Type , aParameterInfo[i].Direction , aParameterInfo[i].Size);  
  426.             pCmd->Parameters->Append(aParameterPtr[i]);  
  427.         }  
  428.   
  429.         if(!m_bIsOracle)                                    // SQLServer中需要!  
  430.             pCmd->Parameters->Refresh();                  // 资源集中的操作  
  431.           
  432.           
  433.         // 对输入参数的处理  
  434.         for(i=0; i < bParametersCount; i++)  
  435.         {             
  436.             if(aParameterInfo[i].Direction==adParamInput || aParameterInfo[i].Direction == adParamInputOutput)    
  437.             {  
  438.                 if(m_bIsOracle)                             //oracle数据库  
  439.                 {  
  440.                     pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value = aParameterInfo[i].Value;   
  441.                 }  
  442.                 else                                        //SQLserver数据库  
  443.                 {  
  444.                     CString str;  
  445.                     str.Format("@%s",((char *)aParameterInfo[i].Name));  
  446.                     pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value = aParameterInfo[i].Value;   
  447.                 }  
  448.             }  
  449.         }  
  450.           
  451.         _variant_t  vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR);       //变体类型空值  
  452.           
  453.         (*ppRs)->CursorLocation = adUseClient;  
  454.         (*ppRs)->Open((IDispatch*)pCmd , vtEmpty, adOpenKeyset/*adOpenForwardOnly*/, adLockOptimistic,adOpenRecordUnspecified);  
  455.               
  456.         // 对输出参数的处理  
  457.         for(i=0; i < bParametersCount; i++)  
  458.         {         
  459.             if(aParameterInfo[i].Direction==adParamOutput || aParameterInfo[i].Direction == adParamInputOutput)   
  460.             {  
  461.                 if(m_bIsOracle)                             //oracle数据库  
  462.                 {  
  463.                     aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value;  
  464.                 }  
  465.                 else                                        //SQLserver数据库  
  466.                 {  
  467.                     CString str;  
  468.                     str.Format("@%s",((char *)aParameterInfo[i].Name));  
  469.                     aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value;  
  470.                 }  
  471.             }    
  472.         }  
  473.         if(bParametersCount > 0)  
  474.             delete []aParameterPtr;  
  475.         return ppRs;                                                //返回记录集对象的指针.  
  476.     }  
  477.     catch(_com_error &e)  
  478.     {  
  479.         TRACE("--CDatabaseAccess::ExecProGetRecordset()-- %s,%s    %x\n",(char *)e.Description(),(char *)e.ErrorMessage(),e.Error());  
  480.         if(e.Error() == 0x80004005)  
  481.         {  
  482.             TRACE("到数据库的网络连接可能已经断开。\n");  
  483.         }  
  484.         if(bParametersCount > 0)  
  485.             delete []aParameterPtr;  
  486.         delete ppRs;  
  487.         return NULL;  
  488.     }  
  489.     catch (...) {  
  490.         TRACE("--ExecProGetRecordset()-- 不明错误\n");  
  491.         if(bParametersCount > 0)  
  492.             delete []aParameterPtr;  
  493.         delete ppRs;  
  494.         return NULL;  
  495.     }     
  496. }  
  497.   
  498. // 无参数的存储过程(普通存储过程,非包中)。  
  499. _RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName)  
  500. {  
  501.     return (_RecordsetPtr *)ExecuteProcedure(pcProcedureName, (PARAMETERINFO *)NULL , 0);  
  502. }  
  503.   
  504. // 无参数的存储过程  
  505. _RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName , const char *pcFieldsList)  
  506. {  
  507.     return ExecProGetRecordset(pcProcedureName, (PARAMETERINFO *)NULL , 0 , pcFieldsList);  
  508. }  
  509.   
  510. // 执行SQL语句  
  511. _RecordsetPtr *CDatabaseAccess::ExecuteSQLSentence( const char *pcSentence)  
  512. {  
  513.     _RecordsetPtr  *ppRs=new _RecordsetPtr;         // 动态创建记录集对象。  
  514.   
  515.     try  
  516.     {  
  517.         (*ppRs).CreateInstance(_uuidof(Recordset));  
  518.         (*ppRs)->Open(_variant_t(pcSentence) , m_pCon.GetInterfacePtr() , adOpenKeyset , adLockOptimistic, adCmdText);  
  519.         return ppRs;  
  520.   
  521.     }   
  522.     catch(_com_error &e)  
  523.     {  
  524.         TRACE("--CDatabaseAccess::ExecuteSQLSentence()-- %s,%s\n", (char *)e.Description() ,(char *)e.ErrorMessage());  
  525.         delete ppRs;  
  526.         return NULL;  
  527.     }  
  528.     catch (...) {  
  529.         TRACE("--CDatabaseAccess::ExecuteSQLSentence()-- 不明错误\n");  
  530.         delete ppRs;  
  531.         return NULL;  
  532.     }  
  533. }  
  534. //连接内地数据库方式(无用户名和密码格式)(Access数据库)  
  535. BOOL CDatabaseAccess::ConnectDB(char *DatabaseName)  
  536. {  
  537.     if (!m_bIsOracle)  
  538.     {  
  539.         try  
  540.         {  
  541.             CString     strConnection;  //连接字符串  
  542.             strConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False",DatabaseName);  
  543.             HRESULT     hResult=m_pCon->Open(strConnection.GetBuffer(0) ,"" ,"" ,adModeUnknown);  
  544.             strConnection.ReleaseBuffer();  
  545.             if(SUCCEEDED(hResult))  
  546.                 return 1;               //连接成功!  
  547.             else  
  548.                 return 0;               //连接失败!  
  549.         }  
  550.         catch(_com_error &e)  
  551.         {  
  552.             TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());  
  553.             return 0;               //连接失败  
  554.         }  
  555.         catch (...) {  
  556.             TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");  
  557.             return 0;  
  558.         }  
  559.     }  
  560. }  
  561. BOOL CDatabaseAccess::ConnectDB(const char *DatabaseName,char *PassWord)  
  562. {     
  563.     //连接ACCESS数据库,带密码  
  564.     if (!m_bIsOracle)  
  565.     {  
  566.         try  
  567.         {  
  568.             CString     strConnection;  //连接字符串  
  569.             strConnection.Format("DSN=%s;PWD=%s",DatabaseName,PassWord);  
  570.             HRESULT     hResult=m_pCon->Open(strConnection.GetBuffer(0) ,"" ,"" ,adModeUnknown);  
  571.             strConnection.ReleaseBuffer();  
  572.             if(SUCCEEDED(hResult))  
  573.                 return 1;               //连接成功!  
  574.             else  
  575.                 return 0;               //连接失败!  
  576.         }  
  577.         catch(_com_error &e)  
  578.         {  
  579.             TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());  
  580.             return 0;               //连接失败  
  581.         }  
  582.         catch (...) {  
  583.             TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");  
  584.             return 0;  
  585.         }  
  586.     }  
  587. }  
  588.   
  589. int CDatabaseAccess::GetRecordSetCount(_RecordsetPtr m)  
  590. {  
  591.     int i=0;  
  592.     if(!(m->GetRecordCount()==0))  
  593.     {  
  594.     m->MoveFirst();  
  595.     while (!m->adoEOF) {  
  596.         i++;  
  597.         m->MoveNext();  
  598.     }  
  599.     }  
  600.     return i;  
  601. }  
  602.   
  603. 2.在stfAfx.h文件中导入  
  604. #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")  
[plain]  view plain  copy
 print ?
  1.    
[plain]  view plain  copy
 print ?
  1. 在APP () 中 定义 CDatabaseAccess ado;  
  2.   
  3. 3.在APP的Initlnstance()  
  4. 中添加  
  5. BOOL CTextApp::InitInstance()  
  6. {  
  7.   
  8.   
  9.     // Standard initialization  
  10.     if (!AfxOleInit())  
  11.     {  
  12.         //AfxMessageBox(IDP_OLE_INIT_FAILED);  
  13.         return FALSE;  
  14.     }  
  15.   
  16.     ado.SetDatabaseType(false);  
  17.     ado.ConnectDB("sa","root","172.20.3.23","1433","student");  
  18.   
  19.         AfxEnableControlContainer();  
  20.   
  21. 4.添加  
  22. void CTextDlg::OnButton1() //添加  
  23. {  
  24.     // TODO: Add your control notification handler code here  
  25.     UpdateData(TRUE);  
  26.     CString strSQL;  
  27.     _variant_t var;  
  28.         _RecordsetPtr ptr;  
  29.   
  30.     int index=0;  
  31.     int age=atoi(m_nAge);  
  32.     int nScore=atoi(m_nScore);  
  33.       
  34.     strSQL.Format("insert into student values('%s','%s',%d,%d)",m_strID,m_strName,age,nScore);// 添加语句  
  35.   
  36.     if (AfxMessageBox("你确定要添加这条记录吗?",MB_OKCANCEL,0)==IDOK)  
  37.     {   //zhongdian   
  38.         ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);//执行语句  
  39.     }  
  40.       
  41. }  
  42. 5.删除记录  
  43. void CTextDlg::OnButton2() //删除  
  44. {  
  45.     // TODO: Add your control notification handler code here  
  46.     UpdateData(true);  
  47.     CString strSQL;  
  48.      _RecordsetPtr ptr;//额外添加  
  49.   
  50.     int nitem;  
  51.       
  52.     strSQL.Format("delete from student where ID=%s",m_strID);  
  53.     if (AfxMessageBox("你确定要添删除这条记录吗?",MB_OKCANCEL,0)==IDOK)  
  54.     {  
  55.         ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);//执行语句  
  56.     }  
  57.       
  58. }  
  59.   
    1. 5.初始化CListCtrl控件  
    2. CString temp[4]={"ID","stuName","age","score"};  
    3.     for (int i=0;i<4;i++)  
    4.     {  
    5.         m_listctrl.InsertColumn(i,temp[i],LVCFMT_LEFT,100);  
    6.   
    7.     }  
    8.   
    9.     CListCtrl *pmyListCtrl=(CListCtrl *)GetDlgItem(IDC_LIST2);  
    10.     DWORD dwStyle =GetWindowLong(pmyListCtrl->m_hWnd,GWL_STYLE);  
    11.     SetWindowLong(pmyListCtrl->m_hWnd,GWL_STYLE,dwStyle|LVS_REPORT);  
    12.     DWORD styles=pmyListCtrl->GetExtendedStyle();  
    13.     pmyListCtrl->SetExtendedStyle(styles|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);  
    14.   
    15. 6.查找后显示  
    16. void CTextDlg::showtable()  
    17. {  
    18.     CString strSQL;  
    19.     CString strID,strName,strAge,strScore;  
    20.     _variant_t var;  
    21.     _RecordsetPtr ptr;//额外添加  
    22.     UpdateData(true);  
    23.   
    24.     int index=0;  
    25.     m_listctrl.DeleteAllItems();  
    26.     strSQL.Format("select * from student");          //格式化SQL语句  
    27.     //zhongdian   
    28.     ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);  
    29. //  
    30.     if(!ptr->BOF)  
    31.     {   
    32.         ptr->MoveFirst();                     
    33.     }  
    34.     else  
    35.         return;  
    36.     while(!ptr->adoEOF)                     //当记录集指针不是指向最后一条的下面时  
    37.     {  
    38.         var=ptr->GetCollect("ID");           //获取字段值ID的值  
    39.         strID="";  
    40.         if (var.vt!=NULL)  
    41.         {  
    42.             strID=(LPCSTR)_bstr_t(var);     // 将获取的值赋给strID  
    43.         }  
    44.   
    45.         var=ptr->GetCollect("stuName");             
    46.         strName="";  
    47.         if (var.vt!=NULL)  
    48.         {  
    49.             strName=(LPCSTR)_bstr_t(var);       
    50.         }  
    51.   
    52.         var=ptr->GetCollect("age");             
    53.         strAge="";  
    54.         if (var.vt!=NULL)  
    55.         {  
    56.             strAge=(LPCSTR)_bstr_t(var);       
    57.         }  
    58.   
    59.         var=ptr->GetCollect("score");             
    60.         strScore="";  
    61.         if (var.vt!=NULL)  
    62.         {  
    63.             strScore=(LPCSTR)_bstr_t(var);       
    64.         }  
    65.   
    66.         m_listctrl.InsertItem(index,strID);  
    67.         m_listctrl.SetItemText(index,1,strName);  
    68.         m_listctrl.SetItemText(index,2,strAge);  
    69.         m_listctrl.SetItemText(index,3,strScore);  
    70.         ptr->MoveNext();  
    71.         index++;  
    72.         UpdateData(false);  
    73.   
    74.     }  
    75.   
    76. }  
    77. 7.修改记录集  
    78.   
    79. void CTextDlg::OnButton4() //改  
    80. {  
    81.     // TODO: Add your control notification handler code here  
    82.   
    83.     CString strSQL;  
    84.     CString strID,strName,strAge,strScore;  
    85.     _variant_t var;  
    86.     _RecordsetPtr ptr;//额外添加  
    87.     UpdateData(true);  
    88.   
    89.     int index=0;  
    90.     strSQL.Format("update student set stuName='%s' where ID='%s'",m_strName,m_strID);          //格式化SQL语句  
    91.     //zhongdian   
    92.     ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);  
    93.   
    94.       
    95. }  
    96. 8.查找记录集  
    97. void CTextDlg::OnButton3() //查找  
    98. {  
    99.     // TODO: Add your control notification handler code here  
    100.     //  showtable();  
    101.     CString strSQL;  
    102.     CString strID,strName,strAge,strScore;  
    103.     _variant_t var;  
    104.     _RecordsetPtr ptr;//额外添加  
    105.     UpdateData(true);  
    106.   
    107.     int index=0;  
    108.     m_listctrl.DeleteAllItems();  
    109.     strSQL.Format("select * from student where ID='%s'",m_strID);          //格式化SQL语句  
    110.     //zhongdian   
    111.     ptr=((CTextApp*)AfxGetApp())->ado.ExecuteSQLSentence(strSQL);  
    112. //  
    113.     if(!ptr->BOF)  
    114.     {   
    115.         ptr->MoveFirst();                     
    116.     }  
    117.     else  
    118.         return;  
    119.     while(!ptr->adoEOF)                     //当记录集指针不是指向最后一条的下面时  
    120.     {  
    121.         var=ptr->GetCollect("stuName");   
    122.         //获取字段值ID的值  
    123.         strName="";  
    124.         if (var.vt!=NULL)  
    125.         {  
    126.             strName=(LPCSTR)_bstr_t(var);     // 将获取的值赋给strID  
    127.         }  
    128.         m_strName=strName;  
    129.         UpdateData(false);  
    130.   
    131.         break;  
    132.     }  
    133.       
    134. }  
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值