對數據庫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的時候就崩潰掉。
這幾天在寫一個對數據庫操作的項目,但是這幾天被這個問題給卡住了,實在是找不到如何解決了,還請各位大神指點迷津。
主要是你的數據庫連接字符串,有兩種類型,你選擇你對應的
//設置連接字符串
//一個是數據庫身份驗證
_bstr_t strConnect = "Provider=SQLOLEDB.1;Data Source=ZHOUWEI\\MYSQL;Initial Catalog=AMS;User ID=sa;PWD=123456";
//下面是Windows身份驗證方式
_bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security = SSPI;Persist Security Info = FALSE;Data Source=WANGLIANG\\SQLEXPRESS;Initial Catalog=ADODemo";