使用ATL中的ATL::CDataSource连接Access数据库不成功?

King_hhuang 2011-08-18 10:47:25
这段代码连接SQL2000是成功的

bool Connect(ATL::CDataSource* pDataSource,CSession* pSession)
{
ASSERT(pDataSource);

CComBSTR bstrServer(m_strServerName);
CComBSTR bstrUser(m_strLoginName);
CComBSTR bstrPassword(m_strPassword);
CComBSTR bstrDatabase(m_strDatabaseName);


if (pSession && pSession->m_spOpenRowset != NULL)
pSession->m_spOpenRowset.Release();

CDBPropSet dbinit(DBPROPSET_DBINIT);

dbinit.AddProperty(DBPROP_AUTH_PASSWORD, bstrPassword);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
dbinit.AddProperty(DBPROP_AUTH_USERID, bstrUser);
dbinit.AddProperty(DBPROP_INIT_CATALOG, bstrDatabase);
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, bstrServer);
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1049);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);

if(FAILED(pDataSource->Open(_T("SQLOLEDB.1"), &dbinit)))
{
CString strMsg = "Cannot connect to data source";
strMsg += "\nServer\t= " + m_strServerName;
strMsg += "\nDatabase\t= " + m_strDatabaseName;
strMsg += "\nLogin\t= " + m_strLoginName;

AfxMessageBox(strMsg);
if(pDataSource)
{
pDataSource->Close();
}
goto ErrorExit;
}
else
{
if (pSession && pSession->Open(*pDataSource) != S_OK)
{
AfxMessageBox(_T("Couldn't create session on data source"));
goto ErrorExit;
}
}
return true;

ErrorExit:
CloseConnection();
return false;
}


改成这样连接Access却不成功,请问应该怎么改

bool Connect(ATL::CDataSource* pDataSource,CSession* pSession)
{
ASSERT(pDataSource);

CComBSTR bstrServer(m_strServerName);
CComBSTR bstrUser(m_strLoginName);
CComBSTR bstrPassword(m_strPassword);
CComBSTR bstrDatabase(m_strDatabaseName);


if (pSession && pSession->m_spOpenRowset != NULL)
pSession->m_spOpenRowset.Release();

CDBPropSet dbinit(DBPROPSET_DBINIT);

//Setting
dbinit.AddProperty(DBPROP_AUTH_CACHE_AUTHINFO, true);
dbinit.AddProperty(DBPROP_AUTH_ENCRYPT_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_MASK_PASSWORD, false);
dbinit.AddProperty(DBPROP_AUTH_PASSWORD, bstrPassword);
dbinit.AddProperty(DBPROP_AUTH_USERID, bstrUser);
dbinit.AddProperty(DBPROP_INIT_DATASOURCE, bstrDatabase);
dbinit.AddProperty(DBPROP_INIT_MODE, (long)3);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_PROVIDERSTRING, OLESTR(""));
dbinit.AddProperty(DBPROP_INIT_LCID, (long)1033);
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);

if(FAILED(pDataSource->Open(_T("Microsoft.Jet.OLEDB.4.0"), &dbinit)))
{
CString strMsg = "Cannot connect to data source";
strMsg += "\nServer\t= " + m_strServerName;
strMsg += "\nDatabase\t= " + m_strDatabaseName;
strMsg += "\nLogin\t= " + m_strLoginName;

AfxMessageBox(strMsg);
if(pDataSource)
{
pDataSource->Close();
}
goto ErrorExit;
}
else
{
if (pSession && pSession->Open(*pDataSource) != S_OK)
{
AfxMessageBox(_T("Couldn't create session on data source"));
goto ErrorExit;
}
}
return true;

ErrorExit:
CloseConnection();
return false;
}


另外说明一下,其他的连接数据库的方法和代码我有所了解,就不麻烦大家啦
请直接关注我的问题
...全文
161 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
King_hhuang 2011-08-18
  • 打赏
  • 举报
回复
谢谢,代码不错

但是Access无密码的时候ok,有密码的时候还是出错
King_hhuang 2011-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyq5945 的回复:]
我只会用ADO,换ADO的话置顶帖子有详细例子,还是挺简单的。
可以这样试试

C/C++ code

HRESULT hr = pDataSource->Open(_T("Microsoft.Jet.OLEDB.4.0"), &dbinit));
if (FAILED(hr))
{
_com_error e(hr);
AfxMessageBox(e.ErrorMessa……
[/Quote]

呵呵,谢谢,一般的ADO操作数据库我也会一点
我不想代码改动太大,另外也想了解一下CDataSource类的用法
King_hhuang 2011-08-18
  • 打赏
  • 举报
回复
谢谢
捕捉的错误是

IDispatch error #3105

感觉还是dbinit设置的不对
zyq5945 2011-08-18
  • 打赏
  • 举报
回复
我只会用ADO,换ADO的话置顶帖子有详细例子,还是挺简单的。
可以这样试试
HRESULT hr = pDataSource->Open(_T("Microsoft.Jet.OLEDB.4.0"), &dbinit));
if (FAILED(hr))
{
_com_error e(hr);
AfxMessageBox(e.ErrorMessage());
AfxMessageBox(e.Description());
return;
}

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧