vc(ado编程小结)

来源:互联网 发布:redis mysql完美结合 编辑:程序博客网 时间:2024/05/18 14:13
首先,在stdax中添加: #import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace rename("EOF","adoEOF")




然后,初始化COM库,在程序的初始化代码中添加CoInitialize(NULL);  如果是在
MFC环境中也可以用AfxOleInit();函数




第三步,创建Connection连接

     HRESULT hr;

     try
     {
          //创建Connection对象
          hr = m_pConnection.CreateInstance("ADODB.Connection");


          if(SUCCEEDED(hr))
          {
               //连接到数据库
               hr = m_pConnection->Open("Data Source=labname;UID=sa;PWD=maxiao0419;","","",adModeUnknown);//连接数据库
          }
     }
     catch (_com_error* e)//捕捉异常
     {
             //打印e.ErrorMessage();
     }


//注意:连接到数据中的字符串要根据实际需求来填写,连接不同的数据库需要不同的字符串,
而且连接方法也多种多样(例如可以连接到数据源,也可以不通过数据源),这里我连接到的是一个
名为labname的access数据库,这一部分可以Google


Open函数原型
HRESULT Connection :: Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options);

其中Option代表许可权

adModeUnknown:缺省。当前的许可权未设置

adModeRead:只读

adModeWrite:只写

adModeReadWrite:可以读写

adModeShareDenyRead:阻止其它Connection对象以读权限打开连接

adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接

adModeShareExclusive:阻止其它Connection对象以读写权限打开连接

adModeShareDenyNone:阻止其它Connection对象以任何权限打开连接



这里再给出一些常见的连接字符串:

(1)通过JET数据库引擎对ACCESS2000数据库的连接:

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:\\test.mdb","","",adModeUnknown);

(2)通过DSN数据源对任何支持ODBC的数据库进行连接:

m_pConnection->Open("Data Source=adotest;UID=sa;PWD=;","","",adModeUnknown);

(3)不通过DSN对SQL SERVER数据库进行连接:

m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;
UID=sa;PWD=139","","",adModeUnknown);






第四步,执行SQL命令获得结果集:

有三种常见方法:
     (1) 直接利用上面得到的Connection对象调用Execute()方法
     
     Execute方法原型
     _RecordsetPtr Connection :: Execute(_bstr_t CommandText,VARIANT *RecordsAffected,long Options)

     参数介绍:
          CommandText:一般是SQL语句
          RecordAffected:是所影响的行数
          Options表示CommandText中的内容类型:
                    adCmdText:表明CommandText为文本命令(最常用)
                    adCmdTable:表明为表名
                    adCmdProc:表名为存储过程
                    adCmdUnknown:表名内容未知

     
          例如在数据库中创建一个名为users的表
                    _variant_t RecordsAffected;
               m_pConnection->Execute("CREATE TABLE users(ID INTEGER,username \
               TEXT,old INTEGER,birthday DATETIME)",&RecordsAffected,adCmdText);
          
          向表users中插入一条记录
               ///往表格里面添加记录
               m_pConnection->Execute("INSERT INTO users(ID,username,old,birthday) \
               VALUES (1, 'Washington',25,'1970/1/1')",&RecordsAffected,adCmdText);

          
          获取表中每个字段的值
                TCHAR result[256];
               _variant_t vUsername;
               _variant_t vID;
               _variant_t vOld;
               _variant_t vBirthday;
               while(!m_pRecordset->adoEOF)//判断是否到达表末尾
               {
                    vUsername = m_pRecordset->GetCollect("username");///取得第一个字段的值放入vCount变量
                    vID = m_pRecordset->GetCollect("ID");
                    vOld = m_pRecordset->GetCollect("Old");
                    vBirthday = m_pRecordset->GetCollect("birthday");
                    //注意GetCollect()中的值也可以是列索引
                 

                    wsprintf(result,"id:%d,姓名:%s,年龄:%d,生日:%s\r\n",vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);
                    MessageBox(hwnd,result,TEXT("test"),MB_OK);
                    m_pRecordset->MoveNext();///移到下一条记录
               }

          要注意的就是字符串和整形在从_variant_t类型转化时的方法
          _variant_t--->字符串  要使用前缀  (LPCTSTR)(_bstr_t)
          _variant_t--->整形   直接调用_variant_t  的成员lVal



         (2)第二种方法是利用Command对象来执行SQL命令
         _CommandPtr m_pCommand;
               m_pCommand.CreateInstance("ADODB.Command");
              
               //这三个变量是定式,记住就行
               _variant_t vNULL;
               vNULL.vt = VT_ERROR;
               vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数

               m_pCommand->ActiveConnection = m_pConnection;//将连接赋值给Command对象
               m_pCommand->CommandText = "select * from users";//sql语句
               _RecordsetPtr m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
           


         (3)第三种方法是直接用Recordset对对象进行查询获取结果集
          这时直接定义Recordset对象调用Open()方法然后将Connection对象和SQL
          语句传入就行
          
          Open()原型
          HRESULT Recordset::Open(const _variant_t &Source,const _variant_t & ActiveConnection,
          enum CursorTypeEnum CursorType,enum LockTypeEnum LockType,long Options);
          
          参数介绍 SQL语句
          参数二是连接对象指针
          参数CursorType是光标类型:
               取值范围:
                    enum CursorTypeEnum
{
adOpenUnspecified = -1,///不作特别指定
adOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark, RecordCount,AbsolutePosition,AbsolutePage都不能使用
adOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。
adOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。
adOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。
};
          参数LockType表示数据库锁类型
               取值范围:
                    enum LockTypeEnum
{
adLockUnspecified = -1,///未指定
adLockReadOnly = 1,///只读记录集
adLockPessimistic = 2,悲观锁定方式。数据在更新时锁定其它所有动作,这是最安全的锁定机制
adLockOptimistic = 3,乐观锁定方式。只有在你调用Update方法时才锁定记录。在此之前仍然可以做数据的更新、插入、删除等动作
adLockBatchOptimistic = 4,乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
};

              模板:
                      _RecordsetPtr m_pRecordset;

               m_pRecordset.CreateInstance("ADODB.Recordset");
               m_pRecordset->Open("SELECT * FROM users",_variant_t((IDispatch *)m_pConnection,true),
               adOpenUnspecified,adLockUnspecified ,adCmdText);






             其他,记录的更新遍历:
                      1.例如要删除第一条记录
                         (1)首先移动到第一条记录处
                         m_pRecordset->MoveFirst();
                         (2)调用Delete函数进行删除
                         m_pRecordset->Delete(adAffectCurrent);
                         
                      2.采用非Sql语句方法添加记录
                          
for(int i=0;i<3;i++)
{
m_pRecordset->AddNew();///添加新记录,
m_pRecordset->PutCollect("ID",_variant_t((long)(i+10)));
m_pRecordset->PutCollect("username",_variant_t("叶利钦"));
m_pRecordset->PutCollect("old",_variant_t((long)71));
m_pRecordset->PutCollect("birthday",_variant_t("1930-3-15"));
                                                       }
                      
                      3.更新某条记录
                             (1) 移动到某条记录的
                             m_pRecordset->Move(3,_variant_t((long)adBookmarkFirst));///移动到第三条记录
                              adBookmarkFirst表示相对于第一条记录
                              3表示相对于第一条记录向下三个位置
               
                              计算方法:  位置 = 相对位置(这里是3) + 起始位置(这里是adBookmarkFirst=1)  = 4
                              
                              (2)将这条记录的old字段修改为45
                               m_pRecordset->PutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
                                                      m_pRecordset->Update();///保存到库中

              最后,当你操作完完毕之后一定要记住关闭数据库
                         m_pRecordset->Close();//关闭记录集
                         m_pConnection->Close();//关闭连接