`
阿尔萨斯
  • 浏览: 4206030 次
社区版块
存档分类
最新评论

ADO编程总结

 
阅读更多

1)引入ADO库定义文件

# import “c:/program files/common files/system/ado/msado15.dll” no_namespace

rename (“EOF”,”adoEOF”)

使得编译的时候,为我们的工程文件生成两个头文件:

msado15.tlhado15.tli

注意,msado15.dll的路径可能有所区别,请核对自己的电脑所在的路径

2)初始化COM

在工程的App类的InitInstance ( )函数里面加上

AfxOleInit ( );//MFC用法

C++的常规方法是--------

:::CoInitialize(NULL);

.

::CoUninitialize();

3)使用记录集对象得到一个纪录集的基本步骤

//生成一个Connection对象,并连结上数据库

_ConnectionPtr m_pConnection;

HRESULT hr;

try

{

hr=m_pConnection.CreateInstance(__uuidof(Connection));

if(SUCCEEDED(hr))

{

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=小学.mdb","","",adModeUnknown);

}

}

catch(_com_error e)

{

CString errormessage;

errormessage.Format("连接数据库失败!/r/n/错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

}

//生成RecordSet对象,并得到纪录集

_RecordsetPtr m_pRecordset;

m_pRecordset.CreateInstance("ADODB.Recordset");

CString temp="SELECT * FROM "+tablename;//tablename假设是一个CString类型的表名

_variant_t sql;

sql.SetString(temp);

m_pRecordset->Open(sql,

m_pConnection.GetInterfacePtr( ),

adOpenDynamic,adLockOptimistic,adCmdText );

4)动态查询

CString tablename;

tablename=_T("学籍");

CString temp=_T("SELECT * FROM ")+tablename+_T(" WHERE NAME='")+

dlg.m_name+_T("'");

_variant_t sql;

sql.SetString(temp);

m_pRecordset->Open(sql,m_pConnection.GetInterfacePtr(),

adOpenDynamic,adLockOptimistic,adCmdText);

5)遍历纪录集

int line=0;

while(!m_pRecordset->adoEOF)//遍历记录集,并将所有纪录显示在列表视图中

{

。。。。。。

line++;

m_pRecordset->MoveNext();

}

其余操作都很简单,可以参见其他文章,最关键的是,不要忘了关闭纪录集,因为这通常会造成异常

6)使用ADO连接不同的数据库的方式:

根据不同的数据提供者可以分为ODBCOLEDB等若干种方式,ODBC兼容性更好,支持OLEDB的数据库相对少一点;

连接SQL Server数据库:

1) Microsoft OLE DB Provider for ODBC

m_pConnection->Open(Provider=SQLOLEDB.1;DRIVER=SQLServer;SERVER=lzhm;DATABASE=haitang,"sa","sa",adModeUnknown);

2)未知方法,但是可行,注意Initial Catalog用空格分开

m_pConnection->Open(“Provider=SQLOLEDB.1;Data Source=lzhm;Initial Catalog=haitang”,"sa","sa",adModeUnknown);

m_pConnection->Open ("Provider=SQLOLEDB;Data Source=172.20.2.97;Network Library=DBMSSOCN;Initial Catalog=haitang",”sa”,”sa”,adModeUnknown);

m_pConnection->Open ("Provider=SQLOLEDB;Network Address=172.20.2.97;Initial Catalog=haitang",”sa”,”sa”,adModeUnknown);

m_pConnection->Open ("Provider=SQLOLEDB;Network Address=172.20.2.97; Network Library=DBMSSOCN;Initial Catalog=haitang",”sa”,”sa”,adModeUnknown);

3Microsoft OLE DB Provider for SQL Server

m_pConnection->Open(“Provider=SQLOLEDB.1;Data Source=lzhm;Initial Catalog=haitang”,"sa","sa",adModeUnknown);

4)不使用DSN进行连接

m_pConnection->Open("driver={SQL Server};server=lzhm;database=haitang”,"sa","sa",adModeUnknown);

连接ACCESS 2000数据库的方式:

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=小学.mdb","","",adModeUnknown);

连接ACCESS 97数据库的方式:

m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.3.51;Data Source=小学.mdb","","",adModeUnknown);

7)一个常用的函数,传递一句SQL语句,然后打开一个记录集,假设记录集对象m_pRecordset存在:

BOOL CHaiTangView::GetRecordSet(CString sql)

{//如果生成的记录集不为空,就返回TRUE

if(m_pRecordset->GetState()==1)//如果记录集对象已经打开,则先关闭

m_pRecordset->Close();

HRESULT hr;

_variant_t v_sql;

v_sql.SetString(sql);

try

{

hr=m_pRecordset->Open(v_sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);

if(SUCCEEDED(hr))

{

}

}

catch(_com_error e)

{

CString errormessage;

errormessage.Format("查询数据表失败!/r/n错误信息:%s",e.ErrorMessage());

AfxMessageBox(errormessage);

return 0;

}

m_pRecordset->MoveFirst();

if(!m_pRecordset->adoEOF)//SUCCEEDED(hr)无法判断记录集的生成是否为空

{ //所以要用生成后的纪录集的最大纪录数是否为0来判别

return TRUE; //SUCCEEDED(hr)应该是来判别异常的,纪录集为空不属于异常

}

else

{

MessageBox("对不起,找不到符合条件的纪录,请联系系统管理员");

return FALSE;

}

}

8)调用Recordset::PutCollect出现的问题:

select 岸线属性表.序号,s1.NAME,岸线属性表.岸线性质,岸线属性表.起点桩号,岸线属性表.终点桩号,岸线属性表.岸线长度,岸线属性表.堤顶高程,岸线属性表.结构形式小类,岸线属性表.结构形式大类,岸线属性表.达标标准,岸线属性表.地域位置,岸线属性表.备注 from 岸线属性表,数据字典表 AS s1 where s1.ID=岸线属性表.岸线名 ORDER BY 岸线属性表.序号

select * from 海塘绿化表 ORDER BY 序号

select 岸线属性表.序号,s1.NAME,s2.NAME from 岸线属性表,数据字典表 AS s1,数据字典表 AS s2 where s1.ID=岸线属性表.岸线名 AND s2.ID=岸线属性表.责任单位 ORDER BY 岸线属性表.序号

在海塘开发的过程中,发现如果使用了RecordSet::Open的方法调用SQL语句打开记录集,如果SQL语句中使用了ORDER BY语句,在使用Recordset::PutCollect方法将数据写入就会出错,至少这是使用VCADO

SQL Server7.0或者2000的情况。

9)调用存储过程,在ATL里面的存储过程

STDMETHODIMP CFBGET::GetDataByProc(BSTR bstrProcName, BSTR bstrParam, BSTR* plPower)

{

// TODO: Add your implementation code here

*plPower = NULL;

USES_CONVERSION;

////////////////////////////////////////////////////////////////////////////

///建立和数据库的连接

_ConnectionPtr m_pCon;

m_pCon.CreateInstance(_uuidof(Connection));

char array[200];

GetWindowsDirectory(array,200);

strcat(array,"//FB_DATA.INI");

char servername[100];

GetPrivateProfileString("ServerName","NAME","",servername,100,array);

char str_con[1024];

wsprintf(str_con,"Provider=SQLOLEDB.1;Data Source=%s;Initial Catalog=haitang;User ID=haitang;PWD=haitang",servername);

m_pCon->Open(str_con,"","",adModeUnknown);

///////////////////////////////////////////////////////////////////////////////

///建立命令对象

_CommandPtr m_pCommand;

m_pCommand.CreateInstance("ADODB.Command");

m_pCommand->ActiveConnection = m_pCon;

_variant_t name="proc_user";

BSTR bname=SysAllocString(OLESTR("proc_user"));

m_pCommand->CommandText=bname;

m_pCommand->CommandType=adCmdStoredProc;

///将参数转换成char*类型,提取出两个char*参数

char *p=W2A(bstrParam);

char* temp=p;

char* p1=temp;

while(*temp!='T')

{

temp++;

}

*temp='/0';

temp++;

char* p2=temp;

while(*temp!='T')

{

temp++;

}

*temp='/0';

//将两个参数转换成BSTR类型

BSTR bstrP1=A2W(p1);

BSTR bstrP2=A2W(p2);

///建立参数对象1

_ParameterPtr p_Param1;

p_Param1.CreateInstance("ADODB.Parameter");

p_Param1->Name="name";

p_Param1->Type=adVarChar;

p_Param1->Size=50;

p_Param1->Direction=adParamInput;

p_Param1->Value=bstrP1;

m_pCommand->Parameters->Append(p_Param1);

///建立参数对象2

_ParameterPtr p_Param2;

p_Param2.CreateInstance("ADODB.Parameter");

p_Param2->Name="key";

p_Param2->Type=adVarChar;

p_Param2->Size=50;

p_Param2->Direction=adParamInput;

p_Param2->Value=bstrP2;

m_pCommand->Parameters->Append(p_Param2);

///建立参数对象3

_bstr_t bstrP3;

_ParameterPtr p_Param3;

p_Param3.CreateInstance("ADODB.Parameter");

p_Param3->Name="power";

p_Param3->Type=adInteger;

p_Param3->Size=10;

p_Param3->Direction=adParamOutput;

// p_Param3->Value=bstrP3; //由于是输出参数,所以千万不能指定Value

m_pCommand->Parameters->Append(p_Param3);

///执行存储过程,并获得输出参数

m_pCommand->Execute(NULL,NULL,adCmdStoredProc);

_bstr_t value=p_Param3->GetValue();

const char* ppp = value;

*plPower = SysAllocString(A2W(ppp));

return S_OK;

}

注意,如果存储过程里面只写了一个select语句,执行后将返回一个记录集对象,ADO可以通过

m_pRecordet=m_pCommand->Execute (….)来接受,

但是如果存储过程中包含了多个select语句,ADO接受到的记录集对象是不可一使用的。

10)使用命令对象执行SQL语句

_CommandPtr m_pCommand;

m_pCommand.CreateInstance("ADODB.Command");

m_pCommand->ActiveConnection = m_pCon;//m_pCon为数据库连接对象

m_pCommand->CommandText="UPDATE TABLE1 set num_id = '2' WHERE value = '44'";

m_pCommand->CommandType=adCmdText;

m_pCommand->Parameters->Refresh();

///执行存储过程,并获得输出参数

m_pCommand->Execute(NULL,NULL,adCmdUnknown);

11) 得到记录集中字段的数目

m_pRecordset->Fields->GetCount();

也可以通过类似的方式获得字段类型

FieldsPtr fields=m_Rec->GetFields();

* pcActualColSize=fields->GetCount();

VARIANT varIndex;

VariantInit(&varIndex);

varIndex.vt=VT_I4;

FieldPtr field;

DataTypeEnum adoType;

for(long i=0;i<* pcActualColSize;i++)

{

varIndex.lVal=i;

field=fields->GetItem(varIndex);

adoType=field->GetType();

}

下面是类型对应表

enum DataTypeEnum

{ adEmpty = 0,

adTinyInt = 16,

adSmallInt = 2,

adInteger = 3,

adBigInt = 20,

adUnsignedTinyInt = 17,

adUnsignedSmallInt = 18,

adUnsignedInt = 19,

adUnsignedBigInt = 21,

adSingle = 4,

adDouble = 5,

adCurrency = 6,

adDecimal = 14,

adNumeric = 131,

adBoolean = 11,

adError = 10,

adUserDefined = 132,

adVariant = 12,

adIDispatch = 9,

adIUnknown = 13,

adGUID = 72,

adDate = 7,

adDBDate = 133,

adDBTime = 134,

adDBTimeStamp = 135,

adBSTR = 8,

adChar = 129,

adVarChar = 200,

adLongVarChar = 201,

adWChar = 130,

adVarWChar = 202,

adLongVarWChar = 203,

adBinary = 128,

adVarBinary = 204,

adLongVarBinary = 205,

adChapter = 136,

adFileTime = 64,

adPropVariant = 138,

adVarNumeric = 139

} DataTypeEnum;

typedef enum ParameterDirectionEnum

{ dbParamInput = 1,

dbParamOutput = 2,

dbParamInputOutput = 3,

dbParamReturnValue = 4

} ParameterDirectionEnum;

分享到:
评论

相关推荐

    ADO.NET 总结(原创)

    汇总ADO.NET的用法,对比sql和oracle的数据读取、数据添加、修改删除和GridView填充的用法

    数据库编程技术总结ODBC API、ADO、ADO.NET、OCI、OTL

    数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。数据库编程需要掌握一些访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、...

    ado.net的总结

    这是一个关于ado。net的总结,助你数据库编程入门。

    ADO技术总结

    ADO 总结 ADO(ActiveX Data Object,AxtiveX数据对象)是目前在Windows环境中比较流行的客户端数据库编程技术。 ADO主要有三个对象。 1, Connection对象 连接对象表示到数据源的连接,同时也表示与数据源的惟一...

    asp教程

    ADO 的新增内容 ADO 入门 本地数据访问的解决方案 基本的 ADO 编程模型 ADO 编程模型详细资料 使用对象的 ADO 编程模型 ADO 对象模型总结 远程数据访问的解决方案 基本的 RDS 编程...

    Cascading Style Sheet 2.0 中文手册.chm

    基本的 ADO 编程模型 ADO 编程模型详细资料 使用对象的 ADO 编程模型 ADO 对象模型总结 远程数据访问的解决方案 基本的 RDS 编程模型 RDS 编程模型详细资料 使用对象的 RDS 编程模型 RDS 对象模型总结 ...

    数据库编程ADO

    ADO是操作数据库的技术之一,文档中总结了一段时间内学习ADO的心得,文档有待继续修改和添加。

    数据库编程总结

    数据库客户端编程主要使用ODBCAPI、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLEDB等方法。数据库编程需要掌握一些访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、...

    MFC ADO Database programming(30多页的ppt )

    MFC ADO Database 编程,自己总结的用于内部讲授, 现show出同大家分享一下。希望对大家有帮助

    C++ Builder_5 编程实例与技巧(源代码)

    第四部分 数据库编程数据库编程部分包括:关系数据库、数据库组件、InterBase服务器、OLE DB/ADO和Web与数据库等。 第五部分 组件对象模型(COM) 组件对象模型(COM)包括:COM和OLE自动化等内容。 第六部分 分布式程序...

    精通Visual C++实效编程280例 源码

    280个编程实例,覆盖Visual C++编程的方方面面,操作步骤详细,读者按照步骤操作即可得到书中结果,提供书中全部实例源代码,全面总结一线编程人员的多年开发经验。 内容简介  本书通过280个精选的例子从各个方面...

    C++ Builder 5 编程实例与技巧

    第四部分 数据库编程数据库编程部分包括:关系数据库、数据库组件、InterBase服务器、OLE DB/ADO和Web与数据库等。 第五部分 组件对象模型(COM) 组件对象模型(COM)包括:COM和OLE自动化等内容。 第六部分 分布式程序...

    ADO.NET实用技巧两则

    要想充分发挥ADO.NET的优势,不仅需要全面、深入理解ADO.NET编程模型,及时总结经验、技巧也十分重要。ADO已经有多年的实践经验,ADO.NET以此为基础,提供了更加丰富、强大的工具;尽管如此,ADO.NET的设计目标毕竟...

    《ASP高级编程及其项目应用开发》[PDF]

    基础篇结合示例论述了ASP的编程技术,为ASP概述、ASP基础知识、ASP对象、ASP内置组件、ADO在ASP中的应用、ASP应用程序的优化。应用篇结合人事管理系统项目应用开发技术和经验详细阐述了采用ASP实现一般管理信息系统...

    Visual C++数据库实用编程100例 源码

    本书由浅入深介绍了强大的开发工具Visual C++6.0与数据库技术。编者精选、设计了100个实用经典的实例,以实例...本书内容翔实,是编者多年编程经验的总结,既适合初、中级读者入门与提高又适合高级用户作为参考用书。

    2.ASP.NET.2.0.高级编程(第4版) [1/7]

    10.8 集合和列表总结 303 10.9 小结 306 第11章 ASP.NET 2.0中的数据绑定 307 11.1 数据源控件 307 11.1.1 SqlDataSource控件 310 11.1.2 XmlDataSource控件 316 11.1.3 ObjectDataSource控件 316 11.1.4 ...

    VB编程大全笔记,主要为VB数据库及报表应用

    本资料为笔者从入门到开发数套应用后的总结,可以作为VB速查,也可以让VB数据库开发者少走很多弯路,相信大家能在其中找到些许惊喜! VB及ADO常见错误及处理方法 VB数据精度及bug(目前市面上基本没有哪个书有...

    ASP.NET编程之道.part1.rar

    细节31 分析路径字符串函数总结 细节32 重载一元、二元运算符 细节33 对象也能排序 细节34 实现IDisposable接口清除对象 细节35 将字符串转为字符数组 细节36 将字符数组写入到字符串 细节37 使用var创建隐型局部...

    C#实训教程

    18 ADO.NET编程 322 18.1 简介 322 18.2 ADO.NET 的优点 322 18.3 ADO.NET 结构 324 18.4 ADO.NET 的基本组件 325 18.5 DataReader 328 18.6 获取单个值 328 18.7 修改数据库中的数据 329 18.8 从SQL Server...

Global site tag (gtag.js) - Google Analytics