当前位置: 首页 > news >正文

地图设计网站百度关键词在线优化

地图设计网站,百度关键词在线优化,盐田网站设计,静态网页设计心得体会ADO技术简介(完全攻略) ADO技术简介 ADO是为MS的强大的数据访问接口 OLE DB 设计的,上一个便于使用的应用程序层。 OLE DB 为任何数据源都提供了高性能的访问,包括: 关系型数据库、非关系型数据库、电子邮件、文件系统、文本和图形以及自定义业务对象等…

ADO技术简介(完全攻略)


ADO技术简介
ADO是为MS的强大的数据访问接口 OLE DB 设计的,上一个便于使用的应用程序层。
OLE DB 为任何数据源都提供了高性能的访问,包括:
关系型数据库非关系型数据库电子邮件文件系统文本和图形以及自定义业务对象等。

     ADO 2.0 实际上是基于 MSADO15.DLL 这个动态链接库的,
这个库文件的名字虽然和 ADO 1.5 的一样,但是它实现了更新的接口。

    ADO 2.0 里的新技术有:
        1、异步操作事件模型
        2、数据集的持续性
        3、层次化的数据传输

ADO特点概述

用ADO访问数据元的特点可概括如下:

  1. 易于使用,可以说这是ADO最重要的特点之一。
    ADO 是高层数据库访问技术,相对与ODBC来说,具有面性对象的特点。
    同时,在 ADO 对象结构中,对象与 对象之间 的层次结构不适非常明显
    这会给编写数据库程序带来更多的便利。
    比如,在应用程序中如果要使用记录集对象,不一定要先建立连接、会话对象,
    如果需要就可以直接构造记录集对象。总是,已经 没有必要去关心对象的构造层次和构造顺序了。
  2. 可以访问多种数据源。和 OLE DB 一样,使应用程序具有很好的通用性和灵活性。
  3. 访问数据源效率高。
  4. 方便的Web应用。 ADO 可以以 ActiveX 控件的形式出现,这就大大方便了Web应用程序的编制。
  5. 技术编程接口丰富。 ADO 支持 Visual C++、Visual Basic、VBS、JS等。

ADO 的对象

  1. Connection
    用于表示和数据源的 连接,以及处理一些 命令事务
  2. Command
    用于 执行某些 命令来进行诸如 查询、修改数据库结构的操作。
  3. Recordset
    用于处理数据源的 表格集,它是在表中修改、检索数据的最主要的方法。
  4. Field
    描述数据集中的列信息。
  5. Parameter
    用于对传递给数据源的命令赋参数值。
  6. Error
    用于承载所产生所无的详细信息。
  7. Property
    通过属性,每个ADO对象借此来让用户描述和控制自身的行为。
  8. Set
    集合是一种可以方便的包含其他特殊类型对象的对象类型。 ADO 提供4种类型的集合:
    ●Connection 对象具有Error集合。
    ●Command 对象具有Parameter集合。
    ●Recordset 对象具有Fields集合。
    ●Connection、Command、Recordset、Field 对象都具有Property集合。
  9. Event
    事件模型是异步操作的基础,这是 ADO 2.0 引进的新特性。

在 Visual C++ 中使用 ADO

1、引入ADO库文件
   使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,
以使编译器能正确编译。代码如下所示:

用#import引入ADO库文件

基本流程

(1)初始化COM库,引入ADO库定义文件(2)用Connection对象连接数据库(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。(4)使用完毕后关闭连接释放对象。        
使用_ConnectionPtr接口
_ConnectionPtr主要是一个连接接口,取得与数据库的连接。它的连接字符串可以是自己直接写,也可以指向一个ODBC DSN。  
HRESULT Connection15::Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )
ConnectionString 为连接字串,
UserID     是用户名, 
Password    是登陆密码,
Options     是连接选项,用于指定Connection对象对数据的更新许可权, Options可以是如下几个常量: adModeUnknown:    缺省。当前的许可权未设置adModeRead:     只读adModeWrite:    只写adModeReadWrite:   可以读写adModeShareDenyRead: 阻止其它Connection对象以读权限打开连接adModeShareDenyWrite: 阻止其它Connection对象以写权限打开连接adModeShareExclusive: 阻止其它Connection对象打开连接adModeShareDenyNone: 允许其它程序或对象以任何权限建立连接
◆常用的数据库连接方法:

(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); //m_pConnection->Open("DSN=test;","","",0);    //连接叫作test的ODBC数据源

(3)不通过DSN对SQL SERVER数据库进行连接: m_pConnection->Open("driver={SQL Server};Server=127.0.0.1;DATABASE=vckbase;UID=sa;PWD=139","","",adModeUnknown); 其中Server是SQL服务器的名称,DATABASE是库的名称

◆先介绍Connection对象中两个有用的属性ConnectionTimeOutState ConnectionTimeOut用来设置连接的超时时间,需要在Open之前调用,例如:m_pConnection->ConnectionTimeout = 5; //设置超时时间为5秒m_pConnection->Open("Data Source=adotest;","","",adModeUnknown);

State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过 读取这个属性来作相应的处理,例如: if(m_pConnection->State)m_pConnection->Close(); //如果已经打开了连接则关闭它

_ConnectionPtr pConn;

if (FAILED(pConn.CreateInstance("ADODB.Connection")))
{
     AfxMessageBox("Create Instance failed!");
     return;
}


CString strSRC;
strSRC="Driver=SQL Server;Server=";
strSRC+="suppersoft";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=SA;PWD=";

CString strSQL = "Insert into student(no,name,sex,address) values(3,'aaa','male','beijing')";

_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
_bstr_t bstrSRC(strSRC);

if (FAILED(pConn->Open(bstrSRC,"","",-1)))
{
     AfxMessageBox("Can not open Database!");
     pConn.Release();
     return;
}

COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);

pConn.Release();

AfxMessageBox("ok!");

使用_RecordsetPtr接口(以连接SQL Server为例)



_RecordsetPtr pPtr;
if (FAILED(pPtr.CreateInstance("ADODB.Recordset")))
{
AfxMessageBox("Create Instance failed!");
return FALSE;
}

CString strSRC;
strSRC="Driver=SQL Server;Server=";
strSRC+="210.46.141.145";
strSRC+=";Database=";
strSRC+="mydb";
strSRC+=";UID=sa;PWD=";
strSRC+="sa";

CString strSQL = "select id,name,gender,address from personal";

_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);

if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))
{
AfxMessageBox("Open table failed!");
pPtr.Release();
return FALSE;
}

while(!pPtr->GetadoEOF())
{
_variant_t varNo;
_variant_t varName;
_variant_t varSex;
_variant_t varAddress;

varNo = pPtr->GetCollect ("id");
varName = pPtr->GetCollect ("name");
varSex = pPtr->GetCollect ("gender");
varAddress = pPtr->GetCollect ("address");

CString strNo =(char *)_bstr_t(varNo);
CString strName =(char *)_bstr_t(varName);
CString strSex =(char *)_bstr_t(varSex);
CString strAddress =(char *)_bstr_t(varAddress);

strNo.TrimRight();
strName.TrimRight();
strSex.TrimRight();
strAddress.TrimRight();

int nCount = m_list.GetItemCount();
int nItem = m_list.InsertItem (nCount,_T(""));
m_list.SetItemText (nItem,0,strNo);
m_list.SetItemText (nItem,1,strName);
m_list.SetItemText (nItem,2,strSex);
m_list.SetItemText (nItem,3,strAddress);

pPtr->MoveNext();
}

pPtr->Close();
pPtr.Release();

使用_CommandPtr接口

_CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:
代码11:使用_CommandPtr接口获取数据

_CommandPtr pCommand;
_RecordsetPtr pRs;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=pConn;
pCommand->CommandText="select * from student";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
pRs=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_t varValue = pRs->GetCollect("name");
Cstring strValue=(char*)_bstr_t(varValue);

关于数据类型转换

由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据,
因此Cstring 类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据

_vatiant_t
_bstr_t就是这样两种对象。它们提供了通用的方法转换COM对象和C++类型的数据。

执行SQL命令并取得结果记录集

为了取得结果记录集,我们定义一个指向Recordset对象的指针:
         _RecordsetPtr m_pRecordset;
并为其创建Recordset对象的实例:  
         m_pRecordset.CreateInstance("ADODB.Recordset");

SQL命令的执行可以采用多种形式,下面我们一进行阐述。

◆(1)利用Connection对象的Execute方法执行SQL命令
Execute方法的原型如下所示:

_RecordsetPtr Connection15::Execute (_bstr_t CommandText, VARIANT * RecordsAffected, long Options )
其中
   CommandText    是命令字串,通常是SQL命令。
   RecordsAffected   是操作完成后所影响的行数,
   Options     表示CommandText中内容的类型,Options可以取如下值之一:
        adCmdText:   表明CommandText是文本命令
        adCmdTable:   表明CommandText是一个表名
        adCmdProc:   表明CommandText是一个存储过程
        adCmdUnknown: 未知

Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。  
try
{
_variant_t ra;

m_pConnection->Execute("CREATE TABLE 学生信息(学号 INTEGER,姓名 TEXT,年龄 INTEGER,生日 DATETIME)",&ra,adCmdText);
m_pConnection->Execute("INSERT INTO 学生信息(学号,姓名,年龄,生日) VALUES (112105, '程红秀',22,'1982-08-16')",&ra,adCmdText);//往表格里面添加记录
m_pRecordset = m_pConnection->Execute("SELECT COUNT(*) FROM 学生信息",&ra,adCmdText);    //执行SQL统计命令得到包含记录条数的记录集

_variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)(0)); //取得第一个字段的值放入vCount变量

m_pRecordset->Close();
CString message;
message.Format("共有%d条记录",vCount.lVal);
AfxMessageBox(message);   
}

catch (_com_error e)
{ ...}

◆(2)利用 Command对象 来执行SQL命令
try
{
   _CommandPtr m_pCommand;
   m_pCommand.CreateInstance("ADODB.Command");
  
   m_pCommand->ActiveConnection = m_pConnection; //关键的一句,将建立的连接赋值给它

   m_pCommand->CommandText="INSERT INTO 学生信息(学号,姓名,年龄,生日) VALUES (112105, '程红秀',22,'1982-08-16')";
   m_pCommand->Execute(NULL,NULL,adCmdText);

   m_pCommand->CommandText="SELECT COUNT(*) FROM 学生信息";
   m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdText);

   _variant_t vCount = m_pRecordset->GetCollect((_variant_t)(long)0); //取得第一个字段的值
  
   CString str;
   str.Format("共有%d条记录",vCount.lVal);
   AfxMessageBox(str);   

   m_pRecordset->Close();

}
catch (_com_error e) {...}

在这段代码中我们只是用Command对象来执行了SELECT查询语句,
Command对象在进行存储过程的调用中能真正体现它的作用。下次我们将详细介绍。


◆(3)直接用Recordset对象进行查询取得记录集
例如
   m_pRecordset->Open("SELECT * FROM 学生信息",_variant_t((IDispatch *)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);

Open方法的原型是这样的:
HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )
其中:
①Source是数据查询字符串
②ActiveConnection是已经建立好的连接(我们需要用Connection对象指针来构造一个_variant_t对象)
③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, //乐观分批更新。编辑时记录不会锁定,更改、插入及删除是在批处理模式下完成。
    };
⑤Options请参考本文中对Connection对象的Execute方法的介绍


记录集的遍历、更新

根据我们刚才通过执行SQL命令建立好的 学生信息 表,它包含四个字段:学号,姓名,年龄,生日
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条
记录,更改其年龄,保存到数据库。

try
{
   _variant_t vUsername,vBirthday,vID,vOld;
   _RecordsetPtr m_pRecordset;
  
   m_pRecordset.CreateInstance("ADODB.Recordset");
   m_pRecordset->Open("SELECT * FROM 学生信息",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
  
   while(!m_pRecordset->adoEOF)
   {
    vID = m_pRecordset->GetCollect(_variant_t((long)0));     //取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行
    vUsername = m_pRecordset->GetCollect("姓名");   //取得姓名字段的值
    vOld = m_pRecordset->GetCollect("年龄");
    vBirthday = m_pRecordset->GetCollect("生日");
   
    TRACE("id:%d,姓名:%s,年龄:%d,生日:%s/r/n",
     vID.lVal,
     (LPCTSTR)(_bstr_t)vUsername,
     vOld.lVal,
     (LPCTSTR)(_bstr_t)vBirthday);   //在DEBUG方式下的OUTPUT窗口输出记录集中的记录

    m_pRecordset->MoveNext();     //移到下一条记录
   }
  
   m_pRecordset->MoveFirst();     //移到首条记录
   m_pRecordset->Delete(adAffectCurrent);     //删除当前记录
  
  
   for(int i=0;i<3;i++)     //添加三条新记录并赋值
   {
    m_pRecordset->AddNew();     //添加新记录
    m_pRecordset->PutCollect("学号",_variant_t((long)(i+10)));
    m_pRecordset->PutCollect("姓名",_variant_t("王斌年"));
    m_pRecordset->PutCollect("年龄",_variant_t((long)21));
    m_pRecordset->PutCollect("生日",_variant_t("1930-3-15"));

   }
  
   m_pRecordset->Move(1,_variant_t((long)adBookmarkFirst));     //从第一条记录往下移动一条记录,即移动到第二条记录处
   m_pRecordset->PutCollect(_variant_t("年龄"),_variant_t((long)45));     //修改其年龄
  m_pRecordset->Update();     //保存到库中
  
} catch (_com_error e){}

关闭记录集与连接


记录集或连接都可以用Close方法来关闭       
m_pRecordset->Close(); //关闭记录集  
m_pConnection->Close(); //关闭连接

在stdafx.h中进行宏定义:
#if !defined CATCH_ERROR
#define CATCH_ERROR            /
   {              /
    CString strComError;        /
    strComError.Format("错误编号: %08lx/n错误信息: %s/n错误源: %s/n错误描述: %s", /
         e.Error(),                   /
         e.ErrorMessage(),            /
         (LPCSTR) e.Source(),         /
         (LPCSTR) e.Description());   /
    ::MessageBox(NULL,strComError,"错误",MB_ICONEXCLAMATION); /
   }
#endif

使用方法:
try
{   ...}
catch(_com_error e)
{
CATCH_ERROR;
}

 

#import "c:/program files/common files/system/ado/msado15.dll"no_namespaces rename("EOF" adoEOF")

这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。
现在不需添加另外的头文件,就可以使用ADO接口了。
其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库.

2、初始化OLE/COM库环境
必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。
在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

 

BOOL CMyAdoTestApp::InitInstance()
{
if(!AfxOleInit())//这就是初始化COM库
{
AfxMessageBox(“OLE初始化出错!”);
return FALSE;
}

……

}

3、ADO接口简介

ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

_ConnectionPtr接口返回一个记录集或一个空指针。
通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,
如一个存储过程。使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。
对于要返回记录的操作通常用_RecordserPtr来实现。
用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。

_CommandPtr接口返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。
如果你只执行一次或几次数据访问操作,后者是比较好的选择。
但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,
然后使用_CommandPtr接口执行存储过程和SQL语句。

_RecordsetPtr是一个记录集对象。
与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。
同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,
可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,
让它自己创建数据连接。
如果你要使用多个记录集,
最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口,
然后使用_RecordsetPtr执行存储过程和SQL语句。
 
 


转载自:http://blog.csdn.net/sgdgoodboy/article/details/1780722#comments


http://www.yidumall.com/news/89730.html

相关文章:

  • 贵州省建设项目验收备案网站站长工具友链检测
  • 淘客怎么做网站市场营销试题库(带答案)
  • 南昌网站建设业务seo推广技术培训
  • 店铺外卖网站怎么做seoaoo
  • 郑州营销型网站公司电话优秀网站设计案例
  • 网站做广告的好处2024年3月份病毒会爆发吗
  • 无锡网站制作网站建设无锡seo网站管理
  • 西安做网站-西安网站建设-西安网站制作-西安网络公司_千秋网络官方网站怎么查询
  • 做地方生活网站网络营销的基本方法有哪些
  • 企业网站开发 外文文献最近10条重大新闻
  • 自己做的网站怎么接入微信elo机制
  • 乡土文化网站怎么做湖南疫情最新消息
  • 遵义网站开发电影站的seo
  • 如何做木工雕刻机网站南昌seo排名优化
  • 淘客网站怎么做返利站长工具seo综合查询5g
  • 官方网站建设有限公司宁波做seo推广企业
  • 个人网站模板王百度推广价格
  • 门户网站模板下载上海发布微信公众号
  • 临湘做网站小熊代刷推广网站
  • 建设摩托官方网站u爽网络推广都有哪些平台
  • 有没有兼职做设计的网站seo课程培训班
  • 大连模板网站制作电话网络推广引流方式
  • 垂直行业b2b网站做的好的建设网站
  • 设计投稿网站太原网站建设方案优化
  • 关于科技的名言安卓aso优化
  • 带着做计算机项目的网站合肥seo推广外包
  • 千灯做网站如何建立免费公司网站
  • 上海网站建设上海网站制作太原网站建设开发
  • 网站建设制作包括哪些百度统计app
  • 外贸做网站公司近期的时事热点或新闻事件