初学ADO开发,输入书上一个例子。
执行到hr = m_pConnection.CreateInstance (__uuidof (Connection));时总是失败。程序转向语句AfxMessageBox ("createinstance of Connection fail!");
网上搜了半天资料也找不到解决办法,请大家帮助解答。try {
//建立实例
hr = m_pConnection.CreateInstance (__uuidof (Connection)); if (SUCCEEDED (hr)) {
//设置链接串属性为UDL文件
m_pConnection->ConnectionString = "File Name = my_data1.udl";
//设置等待链接打开的时间为20S
m_pConnection->ConnectionTimeout = 20;
//默认值同步
hr = m_pConnection->Open("", "", "", adConnectUnspecified); if (FAILED (hr)) {
AfxMessageBox ("open fail!");
return true;
}
}
else {
AfxMessageBox ("createinstance of Connection fail!");
return true;
}
}
执行到hr = m_pConnection.CreateInstance (__uuidof (Connection));时总是失败。程序转向语句AfxMessageBox ("createinstance of Connection fail!");
网上搜了半天资料也找不到解决办法,请大家帮助解答。try {
//建立实例
hr = m_pConnection.CreateInstance (__uuidof (Connection)); if (SUCCEEDED (hr)) {
//设置链接串属性为UDL文件
m_pConnection->ConnectionString = "File Name = my_data1.udl";
//设置等待链接打开的时间为20S
m_pConnection->ConnectionTimeout = 20;
//默认值同步
hr = m_pConnection->Open("", "", "", adConnectUnspecified); if (FAILED (hr)) {
AfxMessageBox ("open fail!");
return true;
}
}
else {
AfxMessageBox ("createinstance of Connection fail!");
return true;
}
}
1、导入ADO库文件。 用#import引入ADO库文件
#import "c:\program files\common files\system\ado\msado15.dll"no_namespaces rename("EOF" adoEOF") 这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。现在不需添加另外的头文件,就可以使用ADO接口了。
2、添加类:这个类现对数据库的连接、执行、退出连接等函数据,以便在以后应用。代码如下:#if !defined(AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_)
#define AFX_ADOCONN_H__2BC07DB1_94D0_43A9_8C59_B5E14FBD430B__INCLUDED_//#include "C:\Program Files\Common Files\System\ado\msader15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class ADOConn
{
public:
_RecordsetPtr m_pRecordset;//指向CONNECTION对象的指针
_ConnectionPtr m_pConnection;//返回查询结果
public:
void ExitConnect();//关闭记录集与连接
BOOL ExecuteSQL(_bstr_t bstrSQL);//执行没有返回结果的SQL语句
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);//执行查询语句可以返回结果
void OnInitADOConn();//初始化连接数据库
ADOConn();
virtual ~ADOConn();};
具体的函数据如下:请细细地看这些代码,看代码比看注释好上几倍!
void ADOConn::OnInitADOConn()
{
::CoInitialize(NULL);
// AfxOleInit();
try
{
m_pConnection.CreateInstance(__uuidof(Connection)); //"ADODB.Recordset");//问题就在这了
_bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan;Data Source=BB";
//Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan;Data Source=BB
// m_pConnection->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=HrMan";
// m_pConnection->Open("","","",adConnectUnspecified);
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox("连接有问题");//
AfxMessageBox(e.Description());
}
}_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL)
{
try
{
if(m_pConnection==NULL)
OnInitADOConn();
m_pRecordset.CreateInstance(_uuidof(Recordset));
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
AfxMessageBox("查询有错误");
AfxMessageBox(e.Description());
}
return m_pRecordset;}BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
if(m_pConnection==NULL)
OnInitADOConn();
//OnInitADOConn
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox("插入有问题");
AfxMessageBox(e.Description());
return false;
}}void ADOConn::ExitConnect()
{
if(m_pRecordset!=NULL)
m_pRecordset->Close();
m_pConnection->Close();
::CoUninitialize();
} 3、用2中的函数对数据库操作 (1)定义ADOCONN对象
(2)执行SQL语句
(3)关闭连接 关于这一步可以参照以下代码理解,这是一个INSERT语句的执行过程: ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
_bstr_t vSQL;
vSQL="INSERT INTO Employees(Dep_Name,Sex,Title,Wage,Dep_id)VALUES('"+m_EmpName+"','"+strSex+"','"+m_Title+"','"+strWage+"',1)";
m_AdoConn.ExecuteSQL(vSQL);
m_AdoConn.ExitConnect();有点长,你仔细看了可能会有帮助。