用ODBC操纵数据库的问题
我用ODBC打开了数据库,基本操作没问题,但是删除完最后一个纪录时,就什么也不能做了,我要求它应该还能添加数据。他说:“操作失败,无当前纪录”,请问如何判断数据库为空,如何预防。还有,若数据库原来为空,程序云行也出错,说是:“试图越过有效的存储空间”,如何才能处理这些错误。源码如下:其中db1是CRecordSet的一个实例
// Dlg1.cpp : implementation file
//
#include "stdafx.h"
#include "xin1.h"
#include "Dlg1.h"
#include <afxpriv.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Dlg1 dialog
Dlg1::Dlg1(CXin1Doc* pDoc,CWnd* pParent /*=NULL*/)
: CDialog(Dlg1::IDD, pParent)
{ ASSERT_VALID(pDoc);
m_pDoc=pDoc;
m_Add=false;
//{{AFX_DATA_INIT(Dlg1)
m_class = 0;
m_course1 = 0.0f;
m_course2 = 0.0f;
m_course3 = 0.0f;
m_name = _T("");
m_number = 0;
//}}AFX_DATA_INIT
}
void Dlg1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Dlg1)
DDX_Text(pDX,IDC_name,m_pDoc->db1.m_name);
DDX_Text(pDX,IDC_number,m_pDoc->db1.m_number);
DDX_Text(pDX,IDC_class,m_pDoc->db1.m_class);
DDX_Text(pDX,IDC_course1,m_pDoc->db1.m_course1);
DDX_Text(pDX,IDC_course2,m_pDoc->db1.m_course2);
DDX_Text(pDX,IDC_course3,m_pDoc->db1.m_course3);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(Dlg1, CDialog)
//{{AFX_MSG_MAP(Dlg1)
ON_MESSAGE_VOID(WM_KICKIDLE,OnKickIdle)
ON_COMMAND(ID_BUTTON_FIRST, OnButtonFirst)
ON_UPDATE_COMMAND_UI(ID_BUTTON_FIRST, OnUpdateButtonFirst)
ON_COMMAND(ID_BUTTON_NEXT, OnButtonNext)
ON_UPDATE_COMMAND_UI(ID_BUTTON_NEXT, OnUpdateButtonNext)
ON_COMMAND(ID_BUTTON_PREV, OnButtonPrev)
ON_UPDATE_COMMAND_UI(ID_BUTTON_PREV, OnUpdateButtonPrev)
ON_COMMAND(ID_BUTTON_LAST, OnButtonLast)
ON_UPDATE_COMMAND_UI(ID_BUTTON_LAST, OnUpdateButtonLast)
ON_COMMAND(ID_BUTTON_INSERT, OnButtonInsert)
ON_UPDATE_COMMAND_UI(ID_BUTTON_INSERT, OnUpdateButtonInsert)
ON_COMMAND(ID_BUTTON_DELETE, OnButtonDelete)
ON_UPDATE_COMMAND_UI(ID_BUTTON_DELETE, OnUpdateButtonDelete)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Dlg1 message handlers
BOOL Dlg1::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
if(!m_TBar.Create(this)||!m_TBar.LoadToolBar(IDR_TOOLBAR1))
{TRACE0("创建工具条失败\n");
EndDialog(IDCANCEL);
}
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
0,reposQuery,rcClientNow);
CPoint ptOffset(rcClientNow.left-rcClientStart.left,
rcClientNow.top-rcClientStart.top);
CRect rcChild;
CWnd* pwndChild=GetWindow(GW_CHILD);
while(pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild,FALSE);
pwndChild=pwndChild->GetNextWindow();
}
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right+=rcClientStart.Width()-rcClientNow.Width();
rcWindow.bottom+=rcClientStart.Height()-rcClientNow.Height();
MoveWindow(rcWindow,FALSE);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
CenterWindow();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void Dlg1::OnKickIdle()
{
SendMessageToDescendants(WM_IDLEUPDATECMDUI);
}
void Dlg1::Adding()//把纪录添加到数据库
{
if(m_Add)
{
m_Add=false;
UpdateData(true);
m_pDoc->db1.Update();
UpdateData(false);
}
}
void Dlg1::OnOK()
{
Adding();
if(!m_pDoc->db1.IsBOF()&&!m_pDoc->db1.IsEOF())
{m_pDoc->db1.Edit();
UpdateData();
m_pDoc->db1.Update();
UpdateData(false);
}
CDialog::OnOK();
}
void Dlg1::OnButtonFirst() //移到第一条纪录
{
Adding();
if((m_pDoc->db1.IsBOF()&&!m_pDoc->db1.IsEOF())||(!m_pDoc->db1.IsBOF()&&
m_pDoc->db1.IsEOF()));
else
{
m_pDoc->db1.Edit();
UpdateData();
m_pDoc->db1.Update();
}
m_pDoc->db1.MoveFirst();
UpdateData(false);
}
void Dlg1::OnUpdateButtonFirst(CCmdUI* pCmdUI)//更新
{
// TODO: Add your command update UI handler code here
if(m_pDoc->db1.IsBOF()&&m_pDoc->db1.IsEOF())
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
//下一条纪录
void Dlg1::OnButtonNext()
{
// TODO: Add your command handler code here
Adding();
if(m_pDoc->db1.IsBOF()&&!m_pDoc->db1.IsEOF())
{
m_pDoc->db1.MoveFirst();
}
else
{
m_pDoc->db1.Edit();
UpdateData();
m_pDoc->db1.Update();
m_pDoc->db1.MoveNext();
}
UpdateData(false);
}
void Dlg1::OnUpdateButtonNext(CCmdUI* pCmdUI)
{
//m_pDoc->db1.MoveNext();
// TODO: Add your command update UI handler code here
if((m_pDoc->db1.IsBOF()&&m_pDoc->db1.IsEOF())||(!m_pDoc->db1.IsBOF()&&
m_pDoc->db1.IsEOF()))
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
//m_pDoc->db1.MovePrev();
}
//前一条纪录
void Dlg1::OnButtonPrev()
{
// TODO: Add your command handler code here
Adding();
if(!m_pDoc->db1.IsBOF()&&m_pDoc->db1.IsEOF())
{
m_pDoc->db1.MoveLast();
}
else
{
m_pDoc->db1.Edit();
UpdateData();
m_pDoc->db1.Update();
m_pDoc->db1.MovePrev();
}
UpdateData(false);
}
void Dlg1::OnUpdateButtonPrev(CCmdUI* pCmdUI)
{
//m_pDoc->db1.MovePrev();
// TODO: Add your command update UI handler code here
if((m_pDoc->db1.IsBOF()&&m_pDoc->db1.IsEOF())||(m_pDoc->db1.IsBOF()&&
!m_pDoc->db1.IsEOF()))
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
//m_pDoc->db1.MoveNext();
}
//最后一条纪录
void Dlg1::OnButtonLast()
{
// TODO: Add your command handler code here
if((m_pDoc->db1.IsBOF()&&!m_pDoc->db1.IsEOF())||(!m_pDoc->db1.IsBOF()&&
m_pDoc->db1.IsEOF()));
else
{m_pDoc->db1.Edit();
UpdateData();
m_pDoc->db1.Update();
}
m_pDoc->db1.MoveLast();
UpdateData(false);
}
void Dlg1::OnUpdateButtonLast(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_pDoc->db1.IsBOF()&&m_pDoc->db1.IsEOF())
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}
//插入一条纪录
void Dlg1::OnButtonInsert()
{
// TODO: Add your command handler code here
Adding();
if((m_pDoc->db1.IsBOF()&&!m_pDoc->db1.IsEOF())||(!m_pDoc->db1.IsBOF()&&
m_pDoc->db1.IsEOF())||(m_pDoc->db1.IsBOF()&&m_pDoc->db1.IsEOF()))
;
else
{
UpdateData(true);
m_pDoc->db1.Edit();
m_pDoc->db1.Update();
}
m_pDoc->db1.Requery();
m_pDoc->db1.AddNew();
m_Add=true;
m_pDoc->db1.m_name=" ";
m_pDoc->db1.m_number=0;
m_pDoc->db1.m_class=0;
m_pDoc->db1.m_course1=0;
m_pDoc->db1.m_course2=0;
m_pDoc->db1.m_course3=0;
UpdateData(false);
}
void Dlg1::OnUpdateButtonInsert(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
}
//删除一条纪录
void Dlg1::OnButtonDelete()
{
// TODO: Add your command handler code here
m_pDoc->db1.Delete();
m_pDoc->db1.MoveNext();
if(m_pDoc->db1.IsBOF())
{
m_pDoc->db1.SetFieldNull(NULL);
m_pDoc->db1.Requery();
}
else
if(m_pDoc->db1.IsEOF())
m_pDoc->db1.MoveLast();
UpdateData(false);
}
void Dlg1::OnUpdateButtonDelete(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if(m_pDoc->db1.IsBOF()||m_pDoc->db1.IsEOF())
pCmdUI->Enable(false);
else
pCmdUI->Enable(true);
}