VC通过ADO批量写数据到MSSQL的有关问题

VC通过ADO批量写数据到MSSQL的问题
用VC连接MSSQL然后想批量写入大量数据.出错,请教怎么用Execute执行批量INSERT动作.下面是问题代码
bool CAdoModule::InitAdo()
{
try
{
::CoInitialize(0);
HRESULT hr = m_pADOCon.CreateInstance( "ADODB.Connection" );
if (FAILED(hr))
{
::MessageBox(NULL, "数据库连接初始化失败!","错误", MB_OK );
}

//----这里分离出来
if (false == OpenDbServer(m_Server, m_DataName, m_Login, m_Password))
{
return false;
}

//---如果直接调用,下面成功但只是单个的数据
/*
_variant_t RecordsAffected;
m_pADORec = m_pADOCon->Execute("INSERT INTO d_master_campaign(id, marketer_id, brand_id, advertiser_id,\
name, rating_id, isactive, start_time, end_time, create_time, creator, last_modified_time, \
last_modified_operator, import_id, reserve) VALUES (NEWID(), NEWID(), NEWID(), NEWID(), 'test', 0, 1, \
GETDATE(), GETDATE(), GETDATE(), 1, GETDATE(), 1, 'abc', null)", &RecordsAffected, adCmdText); */

}
catch (::_com_error e) 
{
char buf[200]="";
_snprintf(buf,sizeof(buf),"connect db error :%s",e.Description());
return false;
}

return true;
}

bool CAdoModule::OpenDbServer(char *pHost, char *pDataName, char *pLogin, char *pPsw)
{
if( m_pADOCon == NULL )
return FALSE;

m_pADOCon ->CommandTimeout = 20;

m_pADOCon ->CursorLocation = adUseClient;

HRESULT hr = -1;

char sz_strcon[512] = {0};
_snprintf(sz_strcon, sizeof(sz_strcon) - 1, "Driver={SQL Server};Server=%s;Database=%s;UID=%s;PWD=%s", pHost, pDataName, pLogin, pPsw);

hr = m_pADOCon->Open( _bstr_t(sz_strcon), "", "", adModeUnknown);
    if (SUCCEEDED(hr))
    {
hr = m_pADOCmd.CreateInstance( "ADODB.Command" );
if (SUCCEEDED(hr))
{
m_pADOCmd ->ActiveConnection = m_pADOCon;
hr = m_pADORec.CreateInstance( "ADODB.Recordset" );
if (SUCCEEDED(hr))
{
return TRUE;
}
}  
}
return FALSE;
}

//--------下面是想一次处理多条信息的代码;
try
{
m_pADOCmd.CreateInstance("ADODB.Command");
_variant_t RecordsAffected;
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND; //定义为无参数
m_pADOCmd->ActiveConnection = m_pADOCon; //非常关键的一句,将建立的连接赋值给它

vector<string>::iterator iter = vec_is.begin();

for (; iter != vec_is.end(); ++iter)
{
/----ssql是一条条以";"号分割的SQL语句合集,
//----例如:Insert into tablename (field1,field2[...,fieldn]) values(value1,value2[...,valuen]);Insert into tablename (field1,field2[...,fieldn]) values(value1,value2[...,valuen])
string sSql = *iter;
m_pADOCmd->CommandText = _bstr_t(sSql.c_str()); //命令字串
//----执行到这里就跳到catch 了.
m_pADORec = m_pADOCmd->Execute(&vNULL, &vNULL, adCmdText);
sSql.clear();
}

}
catch (::_com_error e)
{

_snprintf(buf, sizeof(buf) - 1, "Insert data error :%s", e.Description());
return false;
}
------解决方案--------------------
分析一下catch中的错误信息
------解决方案--------------------
使用循环逐条插入,似乎也没有更好的办法
------解决方案--------------------
Insert into tablename (field1,field2[...,fieldn]) values(value1,value2[...,valuen]);Insert into tablename (field1,field2[...,fieldn]) values(value1,value2[...,valuen])

红色部分去掉,循环体用于设置各个值的值,
以及使用
conn.excutr(sql,...)

------解决方案--------------------
http://blog.csdn.net/Channels_net/article/details/4221122

VC ADO ACCESS
------解决方案--------------------
使用记录集ADO的Recordset对象
如果批量数据,就AddNew多条记录
其中m_pConn是Connection对象



_RecordsetPtr pSet(__uuidof(ADODB::Recordset));

if(SUCCEEDED(pSet->Open(_T("SELECT * FROM XX WHERE STL_ID=0"), (IDispatch*)m_pConn,
adOpenDynamic, adLockOptimistic, adCmdText)))
{
pSet->AddNew();

pSet->PutCollect(_T("STL_ID"), lpszDevID);
pSet->PutCollect(_T("STL_DEVNAME"), lpszDevName);
pSet->PutCollect(_T("STL_RESULT"), _T("OK"));
pSet->PutCollect(_T("STL_ERRORCODE"), nErrCode);

pSet->Update();
pSet->Close();
}