類間數據傳遞問題

連接數據庫:
 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是在登陸窗口記錄的用戶編號

爲什麼數據無法傳遞呢,我沒有使登陸窗口關閉,析構函數中也沒有相關語句,爲什麼數據傳過去後會被

另一個類的構造函數設爲零。
我使用了指針和對象方法,還有全局變量方法,變量傳過去始終爲零。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章