在vc++中用ado连接access数据库是老显示这样的异常Error message:IDispatch error #3149
在vc++中用ado连接access数据库是老显示这样的错误Error message:IDispatch error #3149?
我是照着书上的例子编写了一段连接数据库的程序:代码如下
hr=m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb ", " ", " ",adModeUnknown); //连接数据库
以为我的数据库是放在d盘根目录下所以稍作修改:Data Source=D:\test.mdb
但是运行时老显示错误:Failed to connect with database!Error message:IDispatch error #3146
我想知道:1,书上说上面字符串中的Provider是针对Access2000的,不知道2003是不是也这样写?
2.不知道路径这样写对不对?
3.上面字符串中的 " ", " ",表示用户名和密码,请问是我登陆计算机时的用户名和密码还是我建的数据库的用户名和密码?
问题可能有点幼稚,不过 ... 我真的是不明白 !!
谢谢高手指点!!
------解决方案--------------------
把数据库文件放到你的工程目录下试试看。
------解决方案--------------------
第一、路径应为 d:\\test.mdb 而不是 d:\test.mdb
第二、连接字符串如果不行,则用用我的:
hr=m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Password=admin;Data Source=d:\\test.mdb;Persist Security Info=True ", " ", " ",adModeUnknown); //连接数据库
------解决方案--------------------
如果是单纯操作ADO.MSSQL
可以参考以下的类
用以下的类试一试:
引用msado15.tlh
.H 文件
class CMyDataBase
{
public:
int GetRecordCount(int& nCount);
bool ExecuteSQL(CString& strSQL);
void InitDBParam(CString sHost, CString sDBName, CString sUID, CString sPWD);
void CloseDB();
bool OpenDB();
bool IsConnectedValid();
CMyDataBase();
virtual ~CMyDataBase();
bool GetMTmsg(CMTMsg& Mtmsg);
bool SetMtmsgFlag(int iId, int iStatus);
bool MoveMtmsgToBak(int iId);
private:
void dmpCOMerr(_com_error &e, int line, char *file, bool traceOnly);
bool m_bConn;
void TrimStr(CString &sStr);
// 数据库参数
CString m_sDBHost; //数据库服务器名
CString m_sDBName; //数据库名
CString m_sUID; //数据库用户名
CString m_sPWD; //数据库密码
CString m_sConn;
_ConnectionPtrm_pConn;
};
cpp文件
#include "stdafx.h "
#include "MyDataBase.h "
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*===========================================================================
*常用的宏
===========================================================================*/
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
//设置存储过程参数
#define PutPARA(pCom, name, value) (pCom)-> Parameters-> GetItem(_variant_t(name))-> PutValue(value)
//取得存储过程参数
#define GetPARA(pCom, name) (pCom)-> Parameters-> GetItem(_variant_t(name))-> Value
//取记录中指定字段参数
#define GetVALUE(mRs ,name) (mRs)-> Fields-> Item[(_variant_t(name))]-> Value
//取记录中指定字段参数,并转换为CString
#define GetSTRVALUE(mRs, name) CString((mRs)-> Fields-> Item[(_variant_t(name))]-> Value.bstrVal).GetBuffer(0)
#define RSGetVALUE(x) (_bstr_t(pRs-> GetCollect(x)))
#define DMPcomERR(e) dmpCOMerr(e,__LINE__,__FILE__, true);
//#define CREATEiNSTANCE(sp, riid) { HRESULT _hr = sp.CreateInstance(__uuidof(riid)); if (FAILED(_hr)) _com_issue_error(_hr); }
//========================================================================
#include "io.h "
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
我是照着书上的例子编写了一段连接数据库的程序:代码如下
hr=m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb ", " ", " ",adModeUnknown); //连接数据库
以为我的数据库是放在d盘根目录下所以稍作修改:Data Source=D:\test.mdb
但是运行时老显示错误:Failed to connect with database!Error message:IDispatch error #3146
我想知道:1,书上说上面字符串中的Provider是针对Access2000的,不知道2003是不是也这样写?
2.不知道路径这样写对不对?
3.上面字符串中的 " ", " ",表示用户名和密码,请问是我登陆计算机时的用户名和密码还是我建的数据库的用户名和密码?
问题可能有点幼稚,不过 ... 我真的是不明白 !!
谢谢高手指点!!
------解决方案--------------------
把数据库文件放到你的工程目录下试试看。
------解决方案--------------------
第一、路径应为 d:\\test.mdb 而不是 d:\test.mdb
第二、连接字符串如果不行,则用用我的:
hr=m_pConnection-> Open( "Provider=Microsoft.Jet.OLEDB.4.0;Password=admin;Data Source=d:\\test.mdb;Persist Security Info=True ", " ", " ",adModeUnknown); //连接数据库
------解决方案--------------------
如果是单纯操作ADO.MSSQL
可以参考以下的类
用以下的类试一试:
引用msado15.tlh
.H 文件
class CMyDataBase
{
public:
int GetRecordCount(int& nCount);
bool ExecuteSQL(CString& strSQL);
void InitDBParam(CString sHost, CString sDBName, CString sUID, CString sPWD);
void CloseDB();
bool OpenDB();
bool IsConnectedValid();
CMyDataBase();
virtual ~CMyDataBase();
bool GetMTmsg(CMTMsg& Mtmsg);
bool SetMtmsgFlag(int iId, int iStatus);
bool MoveMtmsgToBak(int iId);
private:
void dmpCOMerr(_com_error &e, int line, char *file, bool traceOnly);
bool m_bConn;
void TrimStr(CString &sStr);
// 数据库参数
CString m_sDBHost; //数据库服务器名
CString m_sDBName; //数据库名
CString m_sUID; //数据库用户名
CString m_sPWD; //数据库密码
CString m_sConn;
_ConnectionPtrm_pConn;
};
cpp文件
#include "stdafx.h "
#include "MyDataBase.h "
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
/*===========================================================================
*常用的宏
===========================================================================*/
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
//设置存储过程参数
#define PutPARA(pCom, name, value) (pCom)-> Parameters-> GetItem(_variant_t(name))-> PutValue(value)
//取得存储过程参数
#define GetPARA(pCom, name) (pCom)-> Parameters-> GetItem(_variant_t(name))-> Value
//取记录中指定字段参数
#define GetVALUE(mRs ,name) (mRs)-> Fields-> Item[(_variant_t(name))]-> Value
//取记录中指定字段参数,并转换为CString
#define GetSTRVALUE(mRs, name) CString((mRs)-> Fields-> Item[(_variant_t(name))]-> Value.bstrVal).GetBuffer(0)
#define RSGetVALUE(x) (_bstr_t(pRs-> GetCollect(x)))
#define DMPcomERR(e) dmpCOMerr(e,__LINE__,__FILE__, true);
//#define CREATEiNSTANCE(sp, riid) { HRESULT _hr = sp.CreateInstance(__uuidof(riid)); if (FAILED(_hr)) _com_issue_error(_hr); }
//========================================================================
#include "io.h "
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////