对数据库Student进行查询时运行到msado.tli文件中的下面这个函数中的raw_Open时就崩溃掉。
inline HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) {
HRESULT _hr = raw_Open(Source, ActiveConnection, CursorType, LockType, Options);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _hr;
}
调用代码:
CString strsql = _T("select * from LoginInfo where Name='");
strsql+=name;
strsql+="' and Password='";
strsql+=psw;
strsql+="'";
MessageBox(hwnd, strsql, _T("查询字符串"), MB_OK);
CString strcolumn[6] = {_T("Name"),_T("Sex"),_T("Password"),_T("School"),_T("Major"),_T("Number")};
int ncolumn = 6;
CStringArray strvalue;
theApp.m_dao.GetData(strsql,strcolumn,ncolumn,strvalue);
BOOL CDao::GetData(CString strSql,CString *strQueryCloum,int nCloumNum,CStringArray& strDataValue)
{
HRESULT het;
//_bstr_t 字符串 _variant_t 多种数据类型集合 vt类型 ..value值 //com
_bstr_t bstrSql = strSql; //执行sql
_bstr_t bstrConnect = m_strConnect; //连库串
_bstr_t bstrQueryCloum; //列名
Fields *fields;
FieldPtr fieldPtr;
CString strValue;
_variant_t varBLOB;
try
{
//1.打开表
/*m_pRecordset->Open(查询SQL语句,连接串,打开方式,数据源更新时如何锁定结果集,以什么形式传入)
打开方式:
adOpenUnspecified = -1, 默认的方式打开
adOpenForwardOnly = 0, 向前移动的游标打开
adOpenKeyset = 1, 以键值打开
adOpenDynamic = 2, 当你添加数据时别人也有可能往这个表添加数据,谁在前谁添加到前面(多人用数据库时)
adOpenStatic = 3 别人也想往里面添加数据一直停留在打开时候
锁定结果集方式:
adLockReadOnly = 1, 只读的不能改变数据
adLockPessimistic = 2, (保守式锁定)逐个 – 编辑时立即锁定数据源的纪录
adLockOptimistic = 3, (开放式锁定)逐个 – 只在调用update方法时才锁定纪录
adLockBatchOptimistic = 4 开方式 可以更新一批数据更新模式
+ bstrConnect {"Driver={SQL Native Client};Server=192.168.1.92,2433;Uid=sa;Pwd=sa;Database=colin0716" (1)} _bstr_t
+ bstrSql {"select * from student" (1)} _bstr_t
*/
het = m_pRecordset->Open(bstrSql,bstrConnect,adOpenDynamic,adLockOptimistic,adCmdText);
if (!SUCCEEDED(het))
{
AfxMessageBox(_T("打开表失败"));
m_strErrorMsg = _T("查询表失败");
return FALSE;
}
//循环结果
while(!m_pRecordset->ADOEOF)
{
//按行遍历
for(int i=0;i<nCloumNum;i++)
{
bstrQueryCloum = strQueryCloum[i];
fields = m_pRecordset->GetFields(); //fields 结果集中的字段集合。由于一行记录中可以包含多个字段,因此fileds属性是一个数组形式,数组中每一个元素代表一个字段
fieldPtr = fields->GetItem(bstrQueryCloum);//field对象表示记录集中数据的某个单独的列。
varBLOB = fieldPtr->GetValue();//获得当前列的值
//long nSize =fieldPtr->ActualSize;
//注意图片名称必须为图片流的前一个字段
//strValue = DataToCStringType(varBLOB,nSize,strValue);
strValue = DataToCStringType(varBLOB);
strDataValue.Add(strValue);
//varBLOB.Detach();
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_error *e)
{
m_strErrorMsg = e->ErrorMessage();
AfxMessageBox(e->ErrorMessage());
}
return TRUE;
}
那个_hr是总是返回E_FAIL,然后return的时候就崩溃掉。
这几天在写一个对数据库操作的项目,但是这几天被这个问题给卡住了,实在是找不到如何解决了,还请各位大神指点迷津。