OLEDB problem - dont update table

Hi, all!

I create my accessor:
class TColumnBase
{
public:
CArray<TColumnEntry> m_aColumns;

public:
typedef TColumnBase _classtype;
typedef TColumnBase _OutputColumnsClass;
static ULONG _GetNumAccessors() throw() { return 2; }
static bool HasOutputColumns() throw () { return true; }
HRESULT _GetBindEntries(LPOLESTR* pColumnNames, DBORDINAL* pColumns, DBBINDING *pBinding, ULONG nAccessor, bool* pAuto, BYTE* pBuffer = NULL, bool bClearOnly = false) throw();
BOOL SetColumns(CArray<TColumnEntry>& aColumns);
};
In m_aColumns I place information about columns which must bind
class TColumnEntry
{
public:
TColumnEntry() { DBLength = 0; }
CStringW ColumnName;
CString ColumnCaption;

CVariant Value; // this is my analog of COleVariant
DBSTATUS DBStatus;
DBLENGTH DBLength;

bool isRW;

BOOL Setup(LPCWSTR lpwName, LPCTSTR lptCaption, CVariant& value, bool isRWenable);
void operator=(const TColumnEntry& src);
};
Next make:
HRESULT TColumnBase::_GetBindEntries(LPOLESTR* pColumnNames, ORDINAL* pColumns, DBBINDING *pBinding, ULONG nAccessor, bool* pAuto, BYTE* pBuffer, bool bClearOnly) throw()
{
ATLASSERT(pColumns != NULL);
DBPARAMIO eParamIO = DBPARAMIO_NOTPARAM;
DBORDINAL nColumns = 0;
DBORDINAL nCol;
(pBuffer);
CVariant v;
// BEGIN_ACCESSOR(0, true)
if (nAccessor == 0)
{
if (pBinding != NULL)
*pAuto = true;
// COLUMN_NAME_PS_LENGTH_STATUS
for (nCol=0; nCol<(DBORDINAL)m_aColumns.GetSize(); nCol++)
{
if (m_aColumns[nCol].isRW)
{
if (pBuffer != NULL)
{
if (!bClearOnly)
ATL::CAccessorBase::FreeType(m_aColumns[nCol].Value.GetType(), (LPBYTE)m_aColumns[nCol].Value.GetBuffer());
memset(m_aColumns[nCol].Value.GetBuffer(), 0, m_aColumns[nCol].Value.GetLength());
}
else if (pBinding != NULL)
{
ATLASSERT( pColumnNames != NULL );
*pColumnNames = m_aColumns[nCol].ColumnName.GetBuffer();
ATL::CAccessorBase::Bind(pBinding, 0,
m_aColumns[nCol].Value.GetType(),
m_aColumns[nCol].Value.GetLength(),
m_aColumns[nCol].Value.GetPrecision(),
m_aColumns[nCol].Value.GetScale(),
eParamIO,
(DBBYTEOFFSET)((LPBYTE)(m_aColumns[nCol].Value.GetBuffer()) - (LPBYTE)this),
(DBBYTEOFFSET)((LPBYTE)(&(m_aColumns[nCol].DBLength)) - (LPBYTE)this),
(DBBYTEOFFSET)((LPBYTE)(&(m_aColumns[nCol].DBStatus)) - (LPBYTE)this));
pColumnNames++;
pBinding++;
}
nColumns++;
}
}
// END_ACCESSOR()
}
else
// BEGIN_ACCESSOR(1, false)
if (nAccessor == 1)
{
if (pBinding != NULL)
*pAuto = false;
// COLUMN_NAME_PS_LENGTH_STATUS()
for (nCol=0; nCol<(DBORDINAL)m_aColumns.GetSize(); nCol++)
{
if (pBuffer != NULL)
{
if (!bClearOnly)
ATL::CAccessorBase::FreeType(m_aColumns[nCol].Value.GetType(), (LPBYTE)m_aColumns[nCol].Value.GetBuffer());
memset(m_aColumns[nCol].Value.GetBuffer(), 0, m_aColumns[nCol].Value.GetLength());
}
else if (pBinding != NULL)
{
ATLASSERT( pColumnNames != NULL );
*pColumnNames = m_aColumns[nCol].ColumnName.GetBuffer();
ATL::CAccessorBase::Bind(pBinding, 0,
m_aColumns[nCol].Value.GetType(),
m_aColumns[nCol].Value.GetLength(),
m_aColumns[nCol].Value.GetPrecision(),
m_aColumns[nCol].Value.GetScale(),
eParamIO,
(DBBYTEOFFSET)((LPBYTE)(m_aColumns[nCol].Value.GetBuffer()) - (LPBYTE)this),
(DBBYTEOFFSET)((LPBYTE)(&(m_aColumns[nCol].DBLength)) - (LPBYTE)this),
(DBBYTEOFFSET)((LPBYTE)(&(m_aColumns[nCol].DBStatus)) - (LPBYTE)this));
pColumnNames++;
pBinding++;
}
nColumns++;
}
// END_ACCESSOR()
}
// END_ACCESSOR_MAP()
*pColumns = nColumns;
return S_OK;
}
And (code fragment):
CTable<CAccessor<TColumnBase> > cmnd;
cmnd.SetColumns(aCol);
CDataSource ds;
CSession ssn;
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_IRowsetScroll, true);
propset.AddProperty(DBPROP_IRowsetChange, true);
// propset.AddProperty(DBPROP_IRowsetUpdate, true); // is it needed
propset.AddProperty(DBPROP_IRowsetFind, true);
propset.AddProperty(DBPROP_ISequentialStream, true);
propset.AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE );
HRESULT hr;
hr = ds.OpenFromInitializationString(L"Provider=SQLOLEDB.1;Password=test;Persist Security Info=True;User ID=test;Initial Catalog=test;Data Source=SQLSERVER;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=ADMIN;Use Encryption for Data=False;Tag with column collation when possible=False");
if (hr == S_OK)
hr = ssn.Open(ds);
if (hr == S_OK)
{
hr = cmnd.Open(ssn, _T("test"), &propset);
if (hr == S_OK) hr = cmnd.MoveFirst();
if (hr == S_OK)
{
CStringA str = (CStringA)cmnd.m_aColumns[1].Value; // Get data from column - it's correct
*cmnd.m_aColumns[1].Value.Data.ptrVal.ptr = '+'; // Vodify data in column
hr = cmnd.SetData(1); // Now return DB_E_ERRORSOCCURED and NOT UPDATE TABLE

}
cmnd.Close();
}
ssn.Close();
ds.Close();
//////////////////////////////////////
I don't make update (or insert, etc) any data in table :(
What a make incorrect? Pls, help me
[5957 byte] By [alex_sar] at [2007-11-19 22:45:20]