用OLEDB为什么rs.Insert(0)都不插不进SQL2000数据
我在SQL2000里建了一个表"雇员" 字段名称->类型 雇员ID->Int,姓名->char,卡号->char,头衔->char,尊称->char,出生日期->Datetime,雇用日期->Datetime,地址->char,地区-char,,国家->char,电话->char,上级->char,部门ID->int.
程序带码如下:
第一个函数
void COLEDB_MFCView::OnEmployeeRegister()
{
// TODO: Add your command handler code here
CStringArray saDeptArray;
CUIntArray uaDepartID;
if (!GetDeptArray(uaDepartID,saDeptArray)) return;
CEmplReglDlg EmplRegiDlg;
EmplRegiDlg.m_saDepartment.Append(saDeptArray);
EmplRegiDlg.m_uaDepartID.Append(uaDepartID);
if (IDOK==EmplRegiDlg.DoModal()) {
CStringArray saValue;
saValue.Add(EmplRegiDlg.m_strCardNo);
saValue.Add(EmplRegiDlg.m_strName);
saValue.Add(EmplRegiDlg.m_strTitle);
saValue.Add(EmplRegiDlg.m_strRespect);
saValue.Add(EmplRegiDlg.m_strBirthday);
saValue.Add(EmplRegiDlg.m_strHireDate);
saValue.Add(EmplRegiDlg.m_strAddress);
saValue.Add(EmplRegiDlg.m_strDistrict);
saValue.Add(EmplRegiDlg.m_strCountry);
saValue.Add(EmplRegiDlg.m_strTeleNo);
saValue.Add(EmplRegiDlg.m_strSupervisor);
saValue.Add(EmplRegiDlg.m_strDeptName);
CString strTableName=_T("dbo.雇员");
if (!InsertRecord(strTableName,saValue)) {
MessageBox("新员工登记操作失败!");
return;
}
}
}
第二个函数
BOOL COLEDB_MFCView::InsertRecord(CString strTableName,CStringArray &saValue)
{
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();
//ULONG ulFields=saValue.GetSize();
TRY{
UpdateData(TRUE);
lpszColumns=new TCHAR[ulFields][50];
rs.CreateAccessor(ulFields,&lpszColumns[0],sizeof(TCHAR)*50*ulFields);
for(ULONG l=0;l<ulFields;l++)
rs.AddBindEntry(l+1,DBTYPE_STR,40,&lpszColumns[l]);
//CoInitialize(NULL);
CDBPropSet propset(DBPROPSET_ROWSET);
propset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
propset.AddProperty(DBPROP_IRowsetChange,true);
propset.AddProperty(DBPROP_UPDATABILITY,DBPROPVAL_UP_CHANGE|DBPROPVAL_UP_INSERT|DBPROPVAL_UP_DELETE);
rs.Create(m_Session,m_strQuery);
rs.Prepare();
HRESULT hOpen=rs.Open(&propset);
if(hOpen!=S_OK)
AfxThrowOLEDBException(rs.m_spRowset,IID_IRowset);
rs.MoveLast();
for(ULONG i=1;i<ulFields;i++)
_tcsncpy(lpszColumns[i],saValue.GetAt(i-1),50);
HRESULT hResult=rs.Insert(0);
if(hResult!=S_OK)
AfxThrowOLEDBException(rs.m_spRowset,IID_IRowsetChange);
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;
}
检查了N篇了,HRESULT hResult=rs.Insert(0);
就是插不进数据.
[解决办法]
try
{
if (m_Recordset)
{
if (m_Recordset->State == adStateOpen)
m_Recordset->Close();
}
else
{
m_Recordset.CreateInstance(__uuidof(Recordset));
}
m_Command->ActiveConnection = m_Connection;
m_Command->CommandType = adCmdText;
m_Command->CommandText = (_bstr_t)(szSql);
_variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND;
m_Command->Execute( &vNull, &vNull, adCmdText );
}