日期:2014-05-17  浏览次数:21024 次

用OLE DB的列绑定的方式如何插入记录
CCommand<CManualAccessor> rs;
TCHAR lpszColumns[3][11];
memset(lpszColumns, 0, sizeof(lpszColumns));
CString m_strQuery;
m_strQuery.Format("select * from %s", strTableName);
ULONG ulFields = 1+saValue.GetSize(); 
// 加1是为了不绑定第一列,因为第一列是Identity类型的,
//并没有saValue数组里存放值。
try
{
        // 创建存取器
        rs.CreateAccessor(ulFields -1, &lpszColumns[0], 
        sizeof(TCHAR)*10*(ulFields-1));
        // 绑定列
        for (ULONG l=0; l<ulFields-1; l++) // 
rs.AddBindEntry(l+1, DBTYPE_STR, 10, &lpszColumns[l]);
        // Create a rowset containing data.
// 建立存取器的属性对象,
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY,
  DBPROPVAL_UP_INSERT /*| DBPROPVAL_UP_CHANGE | 
        DBPROPVAL_UP_DELETE*/);
rs.Create(m_Session, m_strQuery);
rs.Prepare();
if (rs.Open(&propset) != S_OK)
        AfxThrowOLEDBException(rs.m_spRowset, IID_IRowset);
// 项绑定缓存区拷贝数据
        for(ULONG i=1;i<ulFields;i++)
{
_tcsncpy(lpszColumns[i-1], saValue.GetAt(i-1), 10);
}
// 执行行插入操作
if (rs.Insert(0) != S_OK)
AfxThrowOLEDBException(rs.m_spRowset, IID_IRowsetChange);
// 清除绑定缓存区
if (lpszColumns != NULL) 
{
        delete [ulFields]lpszColumns;
lpszColumns = NULL;
}
 }
catch(int e)
{
        return FALSE;
}

以上源码的目的是在数据库表中插入一条记录,在MSSQLServer2005上运行成功,但在oracle上执行rs.open时报错:多步OLE DB 操作产生错误,如果可能,请检查每个OLE DB状态值。没有工作被完成。我注释掉CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_IRowsetChange, true);
propset.AddProperty(DBPROP_UPDATABILITY,
DBPROPVAL_UP_INSERT /*| DBPROPVAL_UP_CHANGE | 
DBPROPVAL_UP_DELETE*/);
执行rs.open不报错,但执行rs.insert(0)报错。
请高手指点
------解决方案--------------------
这个问题我知道了,是驱动连的不合理。

另外c++程序中如何得到oracle表的number(38)类型的字段值啊