连接数据库:
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是在登陆窗口记录的用户编号
为什么数据无法传递呢,我没有使登陆窗口关闭,析构函数中也没有相关语句,为什么数据传过去后会被
另一个类的构造函数设为零。
我使用了指针和对象方法,还有全局变量方法,变量传过去始终为零。