vc下用ODBC连接Oracle,使用CRecordSet派生类:CODBC,发现可以得到查询结果,但是进行编辑时就报错:“记录集是只读”。请教各位这种问题如何解决,刚开始用VC,请各位多多指教。ODBC.h的代码如下:
#if !defined(AFX_ODBC_H__3393FF31_78E7_45B0_BD40_3A4F718EDD1F__INCLUDED_)
#define AFX_ODBC_H__3393FF31_78E7_45B0_BD40_3A4F718EDD1F__INCLUDED_
#include "ODBCtest.h"
#include "StdAfx.h"
#include"afxdb.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ODBC.h : header file
///////////////////////////////////////////////////////////////////////////////
// CODBC recordsetclass CODBC : public CRecordset
{
public:
CODBC(CDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CODBC)// Field/Param Data
//{{AFX_FIELD(CODBC, CRecordset)
CString m_WORKNO;
CString m_NAME;
CString m_DEPT;
CString m_DBNAME;
CString m_DBSIZE;
CString m_EMAIL;
CString m_COU;
CString m_REMARK;
CString m_ATTRIBUTE;
CString m_USR_ID;
CString m_USR_NAME;
CString m_USR_PWD;
CString m_USR_PWD_QUESTION;
CString m_USR_PWD_ANSWER;
CString m_USR_REMARK;
CTime m_USR_DISABLE_DATE;
CString m_USR_EMAIL;
//}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CODBC)
public:
virtual CString GetDefaultConnect();    // Default connection string
virtual CString GetDefaultSQL();    // Default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX);  // RFX support
virtual BOOL Open(UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSql = NULL, DWORD dwOptions = none);
virtual BOOL Requery();
//}}AFX_VIRTUAL// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_ODBC_H__3393FF31_78E7_45B0_BD40_3A4F718EDD1F__INCLUDED_)ODBC.cpp代码如下:
// ODBC.cpp : implementation file
//#include "stdafx.h"
#include "ODBCtest.h"
#include "ODBC.h"
#include"afxdb.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CODBCIMPLEMENT_DYNAMIC(CODBC, CRecordset)CODBC::CODBC(CDatabase* pdb)
: CRecordset(pdb)
{
//{{AFX_FIELD_INIT(CODBC)
m_WORKNO = _T("");
m_NAME = _T("");
m_DEPT = _T("");
m_DBNAME = _T("");
m_DBSIZE = _T("");
m_EMAIL = _T("");
m_COU = _T("");
m_REMARK = _T("");
m_ATTRIBUTE = _T("");
m_USR_ID = _T("");
m_USR_NAME = _T("");
m_USR_PWD = _T("");
m_USR_PWD_QUESTION = _T("");
m_USR_PWD_ANSWER = _T("");
m_USR_REMARK = _T("");
m_USR_EMAIL = _T("");
m_nFields = 17;
//}}AFX_FIELD_INIT
m_nDefaultType =snapshot;
}CString CODBC::GetDefaultConnect()
{
return _T("ODBC;DSN=Msg_Ctr");
}CString CODBC::GetDefaultSQL()
{
return _T("[ADM_C].[MAIL_SIZE_TEST],[HR_C].[SYS_USR]");
}void CODBC::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CODBC)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, _T("[WORKNO]"), m_WORKNO);
RFX_Text(pFX, _T("[NAME]"), m_NAME);
RFX_Text(pFX, _T("[DEPT]"), m_DEPT);
RFX_Text(pFX, _T("[DBNAME]"), m_DBNAME);
RFX_Text(pFX, _T("[DBSIZE]"), m_DBSIZE);
RFX_Text(pFX, _T("[EMAIL]"), m_EMAIL);
RFX_Text(pFX, _T("[COU]"), m_COU);
RFX_Text(pFX, _T("[REMARK]"), m_REMARK);
RFX_Text(pFX, _T("[ATTRIBUTE]"), m_ATTRIBUTE);
RFX_Text(pFX, _T("[USR_ID]"), m_USR_ID);
RFX_Text(pFX, _T("[USR_NAME]"), m_USR_NAME);
RFX_Text(pFX, _T("[USR_PWD]"), m_USR_PWD);
RFX_Text(pFX, _T("[USR_PWD_QUESTION]"), m_USR_PWD_QUESTION);
RFX_Text(pFX, _T("[USR_PWD_ANSWER]"), m_USR_PWD_ANSWER);
RFX_Text(pFX, _T("[USR_REMARK]"), m_USR_REMARK);
RFX_Date(pFX, _T("[USR_DISABLE_DATE]"), m_USR_DISABLE_DATE);
RFX_Text(pFX, _T("[USR_EMAIL]"), m_USR_EMAIL);
//}}AFX_FIELD_MAP
}
/////////////////////////////////////////////////////////////////////////////
// CODBC diagnostics#ifdef _DEBUG
void CODBC::AssertValid() const
{
CRecordset::AssertValid();
}void CODBC::Dump(CDumpContext& dc) const
{
CRecordset::Dump(dc);
}
#endif //_DEBUGBOOL CODBC::Open(UINT nOpenType, LPCTSTR lpszSql, DWORD dwOptions) 
{

return CRecordset::Open(nOpenType, lpszSql, dwOptions);
}BOOL CODBC::Requery() 
{

return CRecordset::Requery();
}
我的代码:
  m_ODBC.Open(AFX_DB_USE_DEFAULT_TYPE,NULL);
  m_ODBC.MoveFirst();
  AfxMessageBox("a");
  if (m_ODBC.m_USR_ID=="80334272")
  {
  m_ODBC.Edit();
  m_ODBC.m_USR_ID="80334273";
  m_ODBC.Update();
  }
  m_ODBC.Close();在m_ODBC.Edit();时就出错!