小弟刚开始学习用VC操作数据库.
以CRecordset为父类,生成了一个CCommonRS类,用它来访问数据库(CCommonRS中没有重载任何父类函数),访问数据库的大致过程如下:CDatabase *m_pDB = new CDatabase();
if(!m_pDB->Open(_T("DBTest")))
return FALSE;
CCommonRS *g_pCommonRS = new CRecordset(m_pDB);
CString strSQL = _T("SELECT * FROM tbMailboxType");
if(!g_pCommonRS->Open(CRecordset::dynaset,strSQL,CRecordset::appendOnly))
return FALSE;
if(!g_pCommonRS->CanAppend())
MessageBox(_T("不能执行增加记录操作"),_T("信息"),MB_OK);结果数据库能正常打开并读取数据,但是,无论我怎么设置打开选项,都无法执行添加,更新和删除操作.跟踪发现,在Open()函数执行的前面阶段,标记"m_bAppendable"是为1的,即可以执行添加操作,但是,当执行到PrepareAndExecute()这个函数里的这样一句时:
AFX_SQL_SYNC(::SQLGetStmtOption(m_hstmt, SQL_CONCURRENCY, &dwConcurrency));
返回的标记 dwConcurrency为SQL_CONCUR_READ_ONLY,所以,下面又把标记"m_bAppendable"设置为0,不可执行添加操作了.想问下大家,这个问题,该怎么解决呢?
另外还有一个相关的问题,如果大家有空,还请一并给点指导:
http://community.csdn.net/Expert/topic/5106/5106211.xml?temp=.9995081

解决方案 »

  1.   

    没人啊!
    自己顶了.另外,我有仔细跟踪了下,更改标记的具体过程为:
    AFX_SQL_SYNC(::SQLGetStmtOption(m_hstmt, SQL_CONCURRENCY, &dwConcurrency));
           if (!Check(nRetCode))
     ThrowDBException(nRetCode);
           if (dwConcurrency == SQL_CONCUR_READ_ONLY && (m_bUpdatable ||m_bAppendable))
           {
    m_bUpdatable = FALSE;
    m_bAppendable = FALSE; TRACE(traceDatabase, 0, _T("Warning: Concurrency changed by driver.\n"));
    TRACE(traceDatabase, 0, _T("\tMarking CRecordset as not updatable.\n"));
    }从TRACE语句的输出来看,好象可更新标记是因为驱动程序不允许才又被设置为FALSE的:"Warning: Concurrency changed by driver."莫非是我的ODBC源建立的有问题?我的ODBC源"DBTest",是在ODBC管理器中建立的系统DSN,驱动程序为SQL Server,采用的网络登陆ID的Windows NT认证,机器上装的是SQL Server 2000,我程序中访问的表tbMailboxType的所有权限都已经对所有用户开通.实在是想不出这个问题到底是什么引起的啊!!!
      

  2.   

    m_pSet->AddNew();
    然后添加不就可以了,最后m_pSet->Update();
    没遇到过你的问题。
      

  3.   

    SQL_CONCUR_READ_ONLY
    难道你的数据库设置成了只读模式,
    所以不能添加修改
      

  4.   

    哎,郁闷!可能是我写的太罗嗦了,这个问题挂了好长时间都没人能给点意见.谢谢大家的指导.我自己摸索了好长时间,才发现:
    g_pCommonRS->Open(CRecordset::dynaset,strSQL,CRecordset::appendOnly))的第一个参数有问题,SQL Server 2000好象对dynaset这种打开方式有冲突,得用CRecordset::dynamic这种方式才行!,而dynamic,恰巧是MSDN和网上好多资料说的大多数数据库都不支持的打开方式,不知道这个大多数,是怎么得出来的!CRecordset::dynamic   A recordset with bi-directional scrolling. Changes made by other users to the membership, ordering, and data values are visible following a fetch operation. Note that many ODBC drivers do not support this type of recordset.
    结帖!
      

  5.   

    我今天也遇到这个问题了,我跟踪后,了发现一进入
    void CRecordset::AddNew()
    {
    ASSERT_VALID(this); /////////////////进入这个函数就出现m_bAppendable=0 ASSERT(m_hstmt != SQL_NULL_HSTMT);
    // we can't construct an INSERT statement w/o any columns
    ASSERT(m_nFields != 0); if (!m_bAppendable)
    {
    ThrowDBException(AFX_SQL_ERROR_RECORDSET_READONLY);
    } if (m_dwOptions & useMultiRowFetch)
    {
    // Can't use update methods on multi-row rowset
    ASSERT(FALSE);
    return;
    }
    给点方案解决!