{
//saValues值已经ok了//
InsertRow(strTableName,saValues);if(!RefreshColumn(&ulColCount)) return FALSE;
if(0==ulColCount) return FALSE;//刷新视图的数据显示
 if(!RefreshData(ulColCount)) return FALSE;
}我现在通过消息响应函数,只要下位机有消息就循环一遍上面的函数,每行已经可以增加一组数据了,但是每循环一次,列也会增加一组,如何解决这种现象。菜鸟想了好久了
以下是成员函数的代码。
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CMyView::InsertRow(CString strTableName, CStringArray &saValues)
{
//有效性检验
if(!m_fConnected) return FALSE;
if(strTableName.IsEmpty()) return FALSE;
int nColNum=0;
if(0==(nColNum=saValues.GetSize())) return FALSE;
HRESULT hr;
Fields* fields=NULL;
Field* field=NULL;
VARIANT varValue;
VARIANT varCount;
varValue.vt=VT_NULL;
DataTypeEnum data_type;
varCount.vt=VT_I4;
//打开结果
    if(!OpenCurRecord(strTableName)) return FALSE;try{
hr=m_recordset->AddNew();
hr=m_recordset->get_Fields(&fields);for(int i=0;i<nColNum-1;i++){
     varCount.lVal=i;
hr=fields->get_Item(varCount,&field);
field->get_Type(&data_type);
if(!ConstructVar(saValues.GetAt(i),data_type,&varValue)) return FALSE;
hr=field->put_Value(varValue);
}
m_recordset->Update();  //将修改后的记录保存到数据库
fields->Release();
field->Release();
}
catch(_com_error&e){
AfxMessageBox(e.Description());
return FALSE;
}
return(SUCCEEDED(hr));
}
//////////////////////////////////////////////////////////////////////////////
BOOL CMyView::RefreshColumn(ULONG *pulColCount)
{
//有效性检验
if(!m_fConnected) return FALSE;
HRESULT hr;
CListCtrl &listCtrl = GetListCtrl();
listCtrl.DeleteAllItems();  //首先清空列表控件原有的内容
listCtrl.ModifyStyle(0,LVS_REPORT|LVS_SHOWSELALWAYS);//|LVS_SORTASCENDING使显示不正常
listCtrl.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
CString strColName;
Fields* fields = NULL;
try{
//取结果集的列集
hr = m_recordset->get_Fields(&fields);
if(SUCCEEDED(hr))
hr=fields->get_Count((long*)pulColCount);
int index;
for(long i=0;i<*pulColCount;i++){
BSTR bstrColName;
hr = fields->Item[i]->get_Name(&bstrColName);
strColName=bstrColName;
//插入列表视图的列
int nWidth = listCtrl.GetStringWidth(strColName)+73;
index=listCtrl.InsertColumn(i,strColName,LVCFMT_LEFT,nWidth);
}
//释放列集
if(SUCCEEDED(hr)) fields->Release();
}
catch(_com_error&e)
{
MessageBox("ADO显示失败!");// MessageBox(e.ErrorMessage());
return FALSE;
}
return(SUCCEEDED(hr));
}///////////////////////////////////////////////////////////////////////////////////////
BOOL CMyView::RefreshData(ULONG ulColCount)
{
//有效性检验
if(!m_fConnected) return FALSE;
if(0==ulColCount) return FALSE;
HRESULT hr;
CListCtrl &ListCtrl = GetListCtrl();
CString strValue;
VARIANT var_value;
VARIANT_BOOL ValEof;
int nRowCount = 0;
Field *field = NULL;
VARIANT varCounter;
varCounter.vt=VT_I4;
varCounter.lVal = 0;
try{
//取当前光标位置是否在结果集末尾
ValEof=m_recordset->get_adoEOF(&ValEof);
while(TRUE){
if(ValEof) break;
varCounter.lVal=0;
//取一个列对象
m_recordset->Fields->get_Item(varCounter,&field);
// DataTypeEnum data_type;
//取列对象的值
field->get_Value(&var_value);
//转换成字符类型
    strValue=VariantToCtring(var_value);
//插到界面列表视图里
            ListCtrl.InsertItem(nRowCount,strValue);
for(int i=1;i<ulColCount;i++){
varCounter.iVal=i;
m_recordset->Fields->get_Item(varCounter,&field);
field->get_Value(&var_value);
strValue=VariantToCtring(var_value);
                ListCtrl.SetItemText(nRowCount,i,strValue);
}
nRowCount++;
m_recordset->MoveNext();
m_recordset->get_adoEOF(&ValEof);
}
m_recordset->Close();
}
catch(_com_error &e){
MessageBox(e.ErrorMessage());
return FALSE;
}
return(SUCCEEDED(hr));
}数据库编程