📄 accessdatabase.cpp
字号:
if( m_padoConnect == 0 )
return S_OK;
HRESULT hr;
_variant_t vError( DISP_E_PARAMNOTFOUND, VT_ERROR );
try{
THROW_ERR( CoCreateInstance(CLSID_CADORecordset, NULL, CLSCTX_INPROC_SERVER,
IID_IADORecordset, (LPVOID *)ppSet) );
THROW_ERR( (*ppSet)->putref_ActiveConnection(m_padoConnect) );
THROW_ERR( (*ppSet)->put_Source(bstrSQL) );
THROW_ERR( (*ppSet)->put_CacheSize(MAX_CACHESIZE) );
THROW_ERR( (*ppSet)->Open(vError, vError, adOpenKeyset, adLockOptimistic, adCmdText) );
}
catch (HRESULT hr)
{
//m_error.GetError(hr);
if( *ppSet )
CLOSE((*ppSet));
return hr;
}
return S_OK;
}
STDMETHODIMP CComAccessMdb::GetTypeInfoCount(UINT* pctinfo)
{
return S_OK;
}
STDMETHODIMP CComAccessMdb::GetTypeInfo (UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
return S_OK ;
}
STDMETHODIMP CComAccessMdb::GetIDsOfNames (REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid)
{
return S_OK;
}
STDMETHODIMP CComAccessMdb::Invoke(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
return S_OK ;
}
///////////////////////////////////////////////////////////////////////////////
//
//
//
///////////////////////////////////////////////////////////////////////////////
/*
HRESULT CComAccessMdb::Insert (
BSTR bstrSQL,
long lRow,
long lColumn,
VARIANT * pVar )
{
//取出实际数据
if(pVar == 0 || lRow == 0 || lColumn == 0 )
return S_FALSE;
BEGIN_ERROR
//取得行和列
long &row = lRow;
long &col = lColumn;
//连接数据库
if( !OpenDatabase() )
return E_FAIL;
m_padoSet = 0;
//打开记录集
if( !OpenRecordset( &m_padoSet, bstrSQL ) )
return E_FAIL;
assert(m_padoSet);
//得到字段数量和记录数量
long field;
ADOFields * padoFields = 0;
m_padoSet->get_Fields(&padoFields);
assert(padoFields);
if( padoFields == 0 )
{
CLOSE(m_padoSet);
return E_FAIL;
}
padoFields->get_Count(&field);
//判断字段数量是否一致
assert( field > 0 && field == col );
if( !( field>0 && field==col ) )
{
CLOSE(m_padoSet);
padoFields->Release();
return E_FAIL;
}
//得到字段对象
ADOField ** ppadoField = new ADOField*[field];
_variant_t ivar(0L);
for(long j=0; j<field; j++)
{
ppadoField[j] = 0;
ivar.lVal = j;
padoFields->get_Item(ivar, ppadoField+j);
assert(ppadoField[j]);
if( ppadoField[j] == 0 )
{
CLOSE(m_padoSet);
padoFields->Release();
while(--j>0)
ppadoField[j]->Release();
delete[] ppadoField;
return S_FALSE;
}
}
//插入数据
_variant_t var1( DISP_E_PARAMNOTFOUND , VT_ERROR );
_variant_t var2( DISP_E_PARAMNOTFOUND , VT_ERROR );
HRESULT hr;
long pos, level;
m_padoConnect->BeginTrans(&level);
for(long i=0; i<row; i++)
{
try{
THROW_ERR( m_padoSet->AddNew(var1, var2) );
for( j=0; j<field; j++)
{
pos = i*field+j;
THROW_ERR( ppadoField[j]->put_Value(pVar[pos]) );
}
THROW_ERR( m_padoSet->Update(var1, var2) );
}
catch(HRESULT hr)
{
REPORT_ERROR(hr, bstrSQL)
m_padoSet->CancelUpdate();
}
}
m_padoConnect->CommitTrans();
//释放所有变量
CLOSE(m_padoSet);
padoFields->Release();
j = 0;
while(j<field)
ppadoField[j++]->Release();
delete[] ppadoField;
return S_OK;
}
HRESULT CComAccessMdb::InsertEx (
BSTR bstrSQL_D,
BSTR bstrSQL_I,
long lRow,
long lColumn,
VARIANT * pVar )
{
//取出实际数据
if( pVar == 0 || lRow == 0 || lColumn == 0 )
return S_FALSE;
BEGIN_ERROR
//取得行和列
long &row = lRow;
long &col = lColumn;
//连接数据库
if( !OpenDatabase() )
return E_FAIL;
m_padoSet = 0;
//打开记录集
if( !OpenRecordset( &m_padoSet, bstrSQL_I ) )
return E_FAIL;
assert(m_padoSet);
//得到字段数量和记录数量
long field;
ADOFields * padoFields = 0;
m_padoSet->get_Fields(&padoFields);
assert(padoFields);
if( padoFields == 0 )
{
CLOSE(m_padoSet);
return E_FAIL;
}
padoFields->get_Count(&field);
//判断字段数量是否一致
assert( field > 0 && field == col );
if( !( field>0 && field==col ) )
{
CLOSE(m_padoSet);
padoFields->Release();
return E_FAIL;
}
//得到字段对象
ADOField ** ppadoField = new ADOField*[field];
_variant_t ivar(0L);
for(long j=0; j<field; j++)
{
ppadoField[j] = 0;
ivar.lVal = j;
padoFields->get_Item(ivar, ppadoField+j);
assert(ppadoField[j]);
if( ppadoField[j] == 0 )
{
CLOSE(m_padoSet);
padoFields->Release();
while(--j>0)
ppadoField[j]->Release();
delete[] ppadoField;
return S_FALSE;
}
}
//插入数据
_variant_t var1( DISP_E_PARAMNOTFOUND , VT_ERROR );
_variant_t var2( DISP_E_PARAMNOTFOUND , VT_ERROR );
HRESULT hr;
long pos, level;
cbstr bstr, bstrSQL;
char *psql;
psql = bstr.ToChar(bstrSQL_D);
char szSQL[MAX_SQL] = {'\0'};
m_padoConnect->BeginTrans(&level);
for(long i=0; i<row; i++)
{
sprintf( szSQL, psql, pVar[i*field].lVal );
try{
m_padoConnect->BeginTrans(&level);
THROW_ERR( m_padoConnect->Execute( bstrSQL.ToBSTR(szSQL), 0, adCmdText, 0));
THROW_ERR( m_padoSet->AddNew(var1, var2) );
for( j=0; j<field; j++)
{
pos = i*field+j;
THROW_ERR( ppadoField[j]->put_Value(pVar[pos]) );
}
THROW_ERR( m_padoSet->Update(var1, var2) );
m_padoConnect->CommitTrans();
}
catch(HRESULT hr)
{
REPORT_ERROR(hr, bstrSQL_I)
m_padoSet->CancelUpdate();
m_padoConnect->RollbackTrans();
}
}
m_padoConnect->CommitTrans();
//释放所有变量
CLOSE(m_padoSet);
padoFields->Release();
j = 0;
while(j<field)
ppadoField[j++]->Release();
delete[] ppadoField;
return S_OK;
}
HRESULT CComAccessMdb::InsertEx2 (
BSTR bstrSQL_D,
BSTR bstrSQL_I,
long lRow,
long lColumn,
VARIANT * pVar )
{
//取出实际数据
if( pVar == 0 || lRow == 0 || lColumn == 0 )
return S_FALSE;
BEGIN_ERROR
//取得行和列
long &row = lRow;
long &col = lColumn;
//连接数据库
if( !OpenDatabase() )
return E_FAIL;
m_padoSet = 0;
//打开记录集
if( !OpenRecordset( &m_padoSet, bstrSQL_I ) )
return E_FAIL;
assert(m_padoSet);
//得到字段数量和记录数量
long field;
ADOFields * padoFields = 0;
m_padoSet->get_Fields(&padoFields);
assert(padoFields);
if( padoFields == 0 )
{
CLOSE(m_padoSet);
return E_FAIL;
}
padoFields->get_Count(&field);
//判断字段数量是否一致
assert( field > 0 && field == col );
if( !( field>0 && field==col ) )
{
CLOSE(m_padoSet);
padoFields->Release();
return E_FAIL;
}
//得到字段对象
ADOField ** ppadoField = new ADOField*[field];
_variant_t ivar(0L);
for(long j=0; j<field; j++)
{
ppadoField[j] = 0;
ivar.lVal = j;
padoFields->get_Item(ivar, ppadoField+j);
assert(ppadoField[j]);
if( ppadoField[j] == 0 )
{
CLOSE(m_padoSet);
padoFields->Release();
while(--j>0)
ppadoField[j]->Release();
delete[] ppadoField;
return S_FALSE;
}
}
//插入数据
_variant_t var1( DISP_E_PARAMNOTFOUND , VT_ERROR );
_variant_t var2( DISP_E_PARAMNOTFOUND , VT_ERROR );
HRESULT hr;
long pos, level;
long i;
m_padoConnect->BeginTrans(&level);
hr = m_padoConnect->Execute( bstrSQL_D, 0, adCmdText, 0);
if( !SUCCEEDED(hr) )
{
REPORT_ERROR(hr, bstrSQL_D);
m_padoConnect->RollbackTrans();
goto exit_insertex2;
}
for(i=0; i<row; i++)
{
try{
THROW_ERR( m_padoSet->AddNew(var1, var2) );
for( j=0; j<field; j++)
{
pos = i*field+j;
THROW_ERR( ppadoField[j]->put_Value(pVar[pos]) );
}
}
catch(HRESULT hr)
{
REPORT_ERROR(hr, bstrSQL_I)
m_padoSet->CancelUpdate();
}
}
m_padoSet->Update(var1, var2);
m_padoConnect->CommitTrans();
exit_insertex2:
//释放所有变量
CLOSE(m_padoSet);
padoFields->Release();
j = 0;
while(j<field)
ppadoField[j++]->Release();
delete[] ppadoField;
return S_OK;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -