高分!VC下用ODBC连接Oracle的问题

nojave 2006-05-29 09:09:34
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 recordset

class 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

/////////////////////////////////////////////////////////////////////////////
// CODBC

IMPLEMENT_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 //_DEBUG

BOOL 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();时就出错!




...全文
186 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
billy145533 2006-06-01
  • 打赏
  • 举报
回复
m_ODBC.Open(AFX_DB_USE_DEFAULT_TYPE,NULL);指定一个打开方式
nojave 2006-05-29
  • 打赏
  • 举报
回复
错误现象是:打开的记录集是只读的。用CanUpdate()判断发现是False;
lixiaosan 2006-05-29
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_crecordset.3a3a.open.asp

仔细看看dwOptions参数
billy145533 2006-05-29
  • 打赏
  • 举报
回复
你贴这么多代码
还不如把错误现象描述一下
nojave 2006-05-29
  • 打赏
  • 举报
回复
补充一下,程式连接access的时候是没问题的,可以编辑,连接oracle就是只读的。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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