連接數據庫:
CDatabase db;
BOOL b;
try
{
b=db.OpenEx("DSN=超市管理系統;UID=sa",CDatabase::noOdbcDialog);
}
catch (CDBException* pDBEx)
{
pDBEx->ReportError();
}
catch(CMemoryException *pMemEx)
{
pMemEx->ReportError();
}
if(!b)
MessageBox("連接數據庫失敗!");
打開紀錄集並讀入數據:
str.Format("select * from Password where UserID=%d",m_UserID);
CPWRecordset rs(&db);
try
{
b=rs.Open(CRecordset::snapshot,str);
}
catch (CDBException* pDBEx)
{
pDBEx->ReportError();
}
catch(CMemoryException *pMemEx)
{
pMemEx->ReportError();
}
if(!b)
{
AfxMessageBox("Query table failed!",MB_OK|MB_ICONERROR);
return;
}
需要注意的是str.Format("select * from Password where UserID=%d",m_UserID);不可以寫成
str.Format("select Password from Password where UserID=%d",m_UserID);
因爲紀錄集爲每個元素從數據庫中取值是按順序不按名字的,雖然只查找了Password,但紀錄集會把結果
放在建立紀錄集時獲取的第一個元素上,這就是爲什麼設斷點查看時我的密碼會被賦給密碼標識字段。
當查找完紀錄集後,如果要讀取紀錄集中的數據,需要先用MoveFirst(),繼續向下到下一行時要使用
MoveNext(),判斷是查完使用IsEOF();
即使紀錄集中只有一行記錄,也要使用MoveFirst()。
另外,添加紀錄集需要注意的是一個紀錄集對應一個表,應該是還可以選擇多個表,但我這樣選擇時讀不
到任何記錄。
rs.Open(CRecordset::snapshot,str);返回真說明打開紀錄集成功,但紀錄集裏可以沒有任何記錄。要判
斷紀錄集中是否有紀錄,可以判斷
rs.IsBOF(),爲真說明紀錄集裏沒有記錄。
在list control中顯示紀錄集中的數據,代碼如下:
int nRow=0;
CString tmp;
for(rs.MoveFirst();!rs.IsEOF();rs.MoveNext())
{
tmp.Format("%d",rs.m_Gid);
m_gList.InsertItem(nRow,tmp,0);
m_gList.SetItemText(nRow,1,rs.m_Gname);
m_gList.SetItemText(nRow,2,rs.m_Gsort);
m_gList.SetItemText(nRow,3,rs.m_Gaddr);
m_gList.SetItemText(nRow,4,rs.m_Gdate);
tmp.Format("%d",rs.m_Gkeep);
m_gList.SetItemText(nRow,5,tmp);
tmp.Format("%d",rs.m_Gcount);
m_gList.SetItemText(nRow,6,tmp);
nRow++;
}
InsertItem和SetItemText使用時要先把數據用tmp.Format("%d",rs.m_Gid);轉化爲字符串。
要關閉對話框可以使用CDialog::OnCancel();或this->OnCancel()
同一個紀錄集對象,添加一次紀錄後如果想修改查詢條件重新添加記錄,首先要關閉原先的紀錄集,在執行
新的添加記錄語句前加上rs.Close();
遇到了一個傳遞數據問題:
把一個窗口中保存下來的用戶編號傳遞給另一個修改密碼的窗口,我用的類對象傳遞,但總是傳不過去
我先用用戶編號和密碼登陸用戶界面,用戶界面上有個按鈕用來打開另一個修改用戶密碼的窗口,因爲是
用的用戶編號登陸的,所以修改密碼只需要填用戶原始密碼和新密碼,但訪問數據庫需要登陸時的用戶編
號,我傳不過去
我先修改了相關類的構造函數,例如:
CPassword::CPassword(int m_UserID)
: CDialog(CPassword::IDD, NULL)
{
//{{AFX_DATA_INIT(CPassword)
m_newPassword = 0;
m_confirmPassword = 0;
m_oldPassword = 0;
m_Select=0;
this->m_UserID=m_UserID;
//}}AFX_DATA_INIT
}
之後調用 CPassword dlg(m_UserID);
程序成功運行。可以直接把數據傳遞進去。
不過我還是不能明白爲什麼之前我沒有修改構造函數,而是使用
CPassword cp;
cp.m_UserID=m_UserID //m_UserID是在登陸窗口記錄的用戶編號
爲什麼數據無法傳遞呢,我沒有使登陸窗口關閉,析構函數中也沒有相關語句,爲什麼數據傳過去後會被
另一個類的構造函數設爲零。
我使用了指針和對象方法,還有全局變量方法,變量傳過去始終爲零。