在OnInitialUpdate中:
HRESULT hr;
CDBPropSet dbinit(DBPROPSET_DBINIT);
dbinit.AddProperty(DBPROP_AUTH_INTEGRATED,"SSPI");
dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO,false);
dbinit.AddProperty(DBPROP_INIT_CATALOG,"Employees");
dbinit.AddProperty(DBPROP_INIT_DATASOURCE,"bbx");
dbinit.AddProperty(DBPROP_INIT_MODE, (long)3);
dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052);
//start connect
hr=m_Connect.Open("SQLOLEDB.1",&dbinit);InsertRecord如下:
if(0==saValue.GetSize()) return FALSE;
if(strTableName.IsEmpty()) return FALSE;
USES_CONVERSION;
CCommand<CManualAccessor> rs;
TCHAR(*lpszColumns)[50]=NULL;
CString m_strQuery;
m_strQuery.Format("Select * from %s",strTableName);
ULONG ulFields=1+saValue.GetSize();
TRY
{
lpszColumns=new TCHAR[ulFields][50];
//create accesso存取器
rs.CreateAccessor(ulFields,&lpszColumns[0],sizeof(TCHAR)*50*ulFields);
//bind columns
for(ULONG l=0;l<ulFields;l++)
rs.AddBindEntry(l+1,DBTYPE_STR,40,&lpszColumns[l]);
//create a rowset containing data
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_IRowsetScroll, true);
propset.AddProperty(DBPROP_IRowsetChange,VARIANT_TRUE);
propset.AddProperty(DBPROP_UPDATABILITY,DBPROPVAL_UP_INSERT|DBPROPVAL_UP_CHANGE|DBPROPVAL_UP_DELETE);
HRESULT hr;
//hr=rs.CreateCommand(m_Session);
hr=rs.Create(m_Session,m_strQuery);
if(FAILED(hr))
MessageBox("Create command failed!");
hr=rs.Prepare();
if(FAILED(hr))
MessageBox("Prepare Command Failed!");
if(rs.Open(&propset)!=S_OK)
AfxThrowOLEDBException(rs.m_spRowset,IID_IRowset);
//copy data to binded buffer
for(ULONG i=1;i<ulFields;i++)
_tcsncpy(lpszColumns[i], saValue.GetAt(i-1), 50);
//insert单步到这儿的时候返回不是S_OK
if(rs.Insert(0)!=S_OK) AfxThrowOLEDBExceptionrs.m_spRowset,IID_IRowsetChange);
//clear binding cache
if(lpszColumns!=NULL)
{
delete [ulFields]lpszColumns;
lpszColumns=NULL;
}
}
CATCH(COLEDBException, e)
{
if(lpszColumns!=NULL)
delete [ulFields]lpszColumns;
e->ReportError();
return FALSE;
}
END_CATCH
return TRUE;