我想通过recordset方式在已经成功连接的access数据库中增加新纪录,数据从编辑框输入,如果不成功提示错误信息。
然后弹出的messagebox显示我的错误是 类型不匹配。
bstr_t mStrSQL; mStrSQL = "SELECT * FROM Images "; //SQL语句 

try
{
m_pRecordset->Open(mStrSQL,               
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);//打开记录集
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
// TODO: Add your control notification handler code here

try
{


// 添加新记录
m_pRecordset->AddNew();

m_pRecordset->PutCollect("Record_No", _variant_t((long)m_Record_No));
                //m_Record_No是编辑框输入的变量,我定义的是int
m_pRecordset->PutCollect("year", _variant_t(m_year));
m_pRecordset->PutCollect("month", _variant_t(m_month));
m_pRecordset->PutCollect("date", _variant_t(m_date));
m_pRecordset->PutCollect("electricity", _variant_t(m_electricity));
m_pRecordset->PutCollect("gas", _variant_t(m_gas));
m_pRecordset->PutCollect("water", _variant_t(m_water));
m_pRecordset->PutCollect("commodity", _variant_t(m_commodity));

m_pRecordset->Update();

AfxMessageBox("插入成功!");
}
catch (_com_error e)
{
// 显示错误信息
CString errormessage;
errormessage.Format("添加记录失败!\r\n错误信息:%s", e.ErrorMessage());
AfxMessageBox(errormessage);
return;
}
// 关闭记录集
m_pRecordset->Close();

解决方案 »

  1.   

    我的Record_No在MFC Class Wizard中是int型,在access数据库中是数字 长整型,
    其他的在VC中是Cstring型,在access中是 文本,
    这个对应关系没有问题啊~
      

  2.   


    m_pRecordset->PutCollect("Record_No", _variant_t((long)m_Record_No));
    ACCESS中的长整型 -》 VC中的int,不用再转换。
      

  3.   

    http://download.csdn.net/source/1981464
    以前写得。看你有没有用。
      

  4.   

    如果我的int不转成long的话编译器会报错:cannot convert from 'int' to 'class _variant_t'
      

  5.   

    //向数据库插入 
    CString strtemp;
    strtemp.Format("insert into Data([CName], [PId]) values('%s','%s')", dlg.m_AddName, Pid);
    m_pRecordset.CreateInstance("ADODB.Recordset");
    m_pRecordset->Open((_bstr_t)(strtemp) ,
    _variant_t((IDispatch* )theApp.m_pConnection, true),
    adOpenStatic,
    adLockOptimistic,
    adCmdText);
    m_pRecordset.Release();
    m_pRecordset->Close(); 直接用sql语句比较好。给你参考
      

  6.   

    感谢各位大虾
    改成这样后,所有变量类型的问题都解决了 但是我使用updatedata(TRUE)刷新时程序报错debug assertation failed.
    说是在afx.inl的第122行有错?
      

  7.   

    我尝试了 只要没有这句话 就能成功插入,加上这句话就出现debug assertation failed.
      

  8.   

    updatedata(TRUE)是从Control到变量,是不是调用的时机不对。
    你程序中应该是个“保存”按钮,点击时先updatedata(TRUE),再把变量写入数据库。
      

  9.   

    把你表里的date字段名改成别的
      

  10.   

    我是在按下这个按钮调用的函数的第一行就使用了updatedata(TRUE),运行到这一句就出现了debug asseration failed.
      

  11.   


    在以下内容里,一定有名字写错什么的,请认真调试。
    最后再仔细核对表的字段。m_pRecordset->PutCollect("Record_No", _variant_t((long)m_Record_No));
      //m_Record_No是编辑框输入的变量,我定义的是int
    m_pRecordset->PutCollect("year", _variant_t(m_year));
    m_pRecordset->PutCollect("month", _variant_t(m_month));
    m_pRecordset->PutCollect("date", _variant_t(m_date));
    m_pRecordset->PutCollect("electricity", _variant_t(m_electricity));
    m_pRecordset->PutCollect("gas", _variant_t(m_gas));
    m_pRecordset->PutCollect("water", _variant_t(m_water));
    m_pRecordset->PutCollect("commodity", _variant_t(m_commodity));