用ODBC操纵数据库的问题

xinxizheng 2003-08-21 12:42:52
我用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);
}
...全文
41 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qly2010 2003-08-21
  • 打赏
  • 举报
回复
没有任何记录的时候,你可以试一下Insert函数
loveonce 2003-08-21
  • 打赏
  • 举报
回复
你试着这样看看,


void Dlg1::OnUpdateRecordNext(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
int l;
if((m_pDoc->m_ExaSet.IsBOF()&&m_pDoc->m_ExaSet.IsEOF())||
(!m_pDoc->m_ExaSet.IsBOF()&&m_pDoc->m_ExaSet.IsEOF()))
{
pCmdUI->Enable(false);
l=2;
// m_pDoc->m_ExaSet.MoveNext();
}
else
{
pCmdUI->Enable(true);
l=1;
}
switch(l)
{case 1:{m_pDoc->m_ExaSet.MoveNext();
if(m_pDoc->m_ExaSet.IsEOF())
pCmdUI->Enable(false);
m_pDoc->m_ExaSet.MovePrev();
}
case 2: ;
}

}
helloair 2003-08-21
  • 打赏
  • 举报
回复
db1.m_strFilter.Empty();
db1.Requery();
if(db1.IsEOF())
{
AfxMessageBox("没有记录");
}
loveonce 2003-08-21
  • 打赏
  • 举报
回复
关注!!!
xinxizheng 2003-08-21
  • 打赏
  • 举报
回复
用哪个函数查询阿?
benz600 2003-08-21
  • 打赏
  • 举报
回复
查询记录总数,如果为0 ,自然就是空的了啊

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧