参考链接:
http://blog.csdn.net/AlbertBright/archive/2010/01/26/5258051.aspx
出现IDispatch error #3092错误的原因之一是在SQL语句中使用了保留关键字。
如建立的表User,用来访问就会出现此类错误!Authorization也是保留关键字。
COM Error, 80040e37, IDispatch error
#3127
ADO连接数据库表错误!
经验总结:
1.在使用Access数据库时,建立表作为登录用户的表时,用到了User和Authorization两个表,这两个表的关键字是保留关键字。故总是提示IDispatch
error#3092错误!修改表名称。
2.在使用Access数据库时,要再调用ADO处理前前用CoInitialize(NULL),Windows以单线程的方式创建com对象,初始化Com库,
调用完后调用CoUninitialize(),卸载初始化的Com库。在建立连接指针,用HRESULT来判断执行结果,并对执行结果进行判断,然后操作打开数据库。
如:
_ConnectionPtr m_Conn;
CString m_strConnec;
m_strConnec.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data
Source= %s", strPath);
strPath为数据库的路径
HRESULT hRes =
m_Conn.CreateInstance("ADODB.CONNECTION");
m_Conn->ConnectionTimeOut =
3;//超时时间3秒,默认30秒
if(SUCCEEDED(hRes))
{
m_Conn->Open(m_strConnec, "", "",
adModeUnkown);
}
3.当打开数据库集的错误经验。
RecordSet数据记录集,其有个属性Recordcount是记录的结果中的记录集。其使用需要关联到对应的游标类型,在Open函数中打开时,设置游标类型时,adOpenStatic标识是可以获取其Recordcount的属性的。而adOpenDynamic是貌似不可以的,官网的解释是其需要关联到对应的数据源。用的最多的是adOpenDynamic,其可以实时反映对记录集的更新、删除。而adOpenStatic是对其记录集的静态备份,其记录集的修改并不会对其有影响。
看别人用的adOpenDynamic动态游标来获取记录集数。做法如下。
CString strSql("Select count(*) AS nCount from
CarUser");执行其sql语句,记录集
RecordSetPtr类型变量m_RecordPtr来记录它,然后用m_RecordPtr->GetCollect("nCount")来获取其值,就可以获取记录集记录的条目数了。
4.关于记录集GetCollect返回值的处理
GetCollect返回的是_variant_t类型的变量。可用Switch来判断返回类型并做处理
如:_variant_t var =
m_RecordPtr->GetCollect("Role");
switch(var.vt)
{
case VT_BSTR:
{
str=var.bstrVal;
break;
}
case VT_I2: //var is short
int type
{
str.Format("%d",(int)var.iVal);
break;
}
case VT_I4: //var is long
int type
{
str.Format("%d", var.lVal);
break;
}
case VT_R4: //var is float
type
{
str.Format(".6f", (double)var.fltVal);
break;
}
case VT_R8: //var is
double type
{
str.Format(".6f", var.dblVal);
break;
}
case VT_CY: //var is CY
type
{
str=COleCurrency(var).Format();
break;
}
case VT_DATE: //var is
DATE type
{
str=COleDateTime(var).Format();
break;
}
case VT_BOOL: //var is
VARIANT_BOOL
{
str= (var.boolVal==0) ?"FALSE": "TRUE";
break;
}
default:
{
str.Format("Unk type %d\n",var.vt);
TRACE("Unknown type %d\n",var.vt);
break;
}
_variant_t 是个联合具体如下:可参考对应的类型。
typedef struct tagVARIANT
{
VARTYPE vt;
//存储数据类型
unsigned short wReserved1;
unsigned short wReserved2;
unsigned short wReserved3;
union
{
Byte bVal;
// VT_UI1.
Short iVal;
// VT_I2.
long lVal;
// VT_I4.
float fltVal;
// VT_R4.
double dblVal;
// VT_R8.
VARIANT_BOOL boolVal;
//
VT_BOOL.
SCODE scode;
// VT_ERROR.
CY cyVal;
// VT_CY.
DATE date;
// VT_DATE.
BSTR bstrVal;
// VT_BSTR.
DECIMAL FAR* pdecVal
// VT_BYREF|VT_DECIMAL.
IUnknown FAR* punkVal;
//
VT_UNKNOWN.
IDispatch FAR* pdispVal;
// VT_DISPATCH.
SAFEARRAY FAR* parray;
//
VT_ARRAY|*.
Byte FAR* pbVal;
//
VT_BYREF|VT_UI1.
short FAR* piVal;
// VT_BYREF|VT_I2.
long FAR* plVal;
//
VT_BYREF|VT_I4.
float FAR* pfltVal;
// VT_BYREF|VT_R4.
double FAR* pdblVal;
// VT_BYREF|VT_R8.
VARIANT_BOOL FAR* pboolVal;
//
VT_BYREF|VT_BOOL.
SCODE FAR* pscode;
// VT_BYREF|VT_ERROR.
CY FAR* pcyVal;
//
VT_BYREF|VT_CY.
DATE FAR* pdate;
//
VT_BYREF|VT_DATE.
BSTR FAR* pbstrVal;
// VT_BYREF|VT_BSTR.
IUnknown FAR* FAR* ppunkVal;
//
VT_BYREF|VT_UNKNOWN.
IDispatch FAR* FAR* ppdispVal;
//
VT_BYREF|VT_DISPATCH.
SAFEARRAY FAR* FAR* pparray;
//
VT_ARRAY|*.
VARIANT FAR* pvarVal;
//
VT_BYREF|VT_VARIANT.
void FAR* byref;
// Generic
ByRef.
char cVal;
// VT_I1.
unsigned short uiVal;
// VT_UI2.
unsigned long ulVal;
// VT_UI4.
int intVal;
// VT_INT.
unsigned int uintVal;
//
VT_UINT.
char FAR * pcVal;
// VT_BYREF|VT_I1.
unsigned short FAR * puiVal;
//
VT_BYREF|VT_UI2.
unsigned long FAR * pulVal;
//
VT_BYREF|VT_UI4.
int FAR * pintVal;
// VT_BYREF|VT_INT.
unsigned int FAR * puintVal;
//VT_BYREF|VT_UINT.
};
};