用mfc实现一个注册界面对话框与数据库的交互,当点击提交按钮时,其相应函数将注册界面上编辑框中的信息获取到并添加到数据库中,但是现在一到要把数据插入到数据库中时就报错,说是类型不匹配,请问是怎么回事??? 下面是源码其中m_PassWord = _T("");
m_Priority = _T("");
m_UserName = _T("");是与注册界面上单个编辑框对应的变量,都是CString类型的 void CRegistrDlg::OnBUTTONCommit() 
{
// TODO: Add your control notification handler code here
::AfxMessageBox("OK");
try
{
m_pConnection=NULL;
HRESULT hr=S_OK;
hr=m_pConnection.CreateInstance(__uuidof(Connection));
CString strConnect="Provider=Microsoft.ACE.OLEDB.12.0;Persist Security Info=False;Data Source=UserManager.accdb;";
m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);//adModeUnknown,adConnectUnspecified

}
catch(_com_error e)
{
AfxMessageBox(e.Description());
} ::AfxMessageBox("Connection"); char ch1[30],ch2[30],ch3[30];
//m_PassWord.GetWindowText(IDC_EDIT_UserName,ch1,30);
_bstr_t sql;
GetDlgItemText(IDC_EDIT_UserName,ch1,30);
GetDlgItemText(IDC_EDIT_Password,ch2,30);
GetDlgItemText(IDC_EDIT_Priority,ch3,30); sql="Insert into User(姓名,密码,权限) values(ch1,ch2,ch3)"; 
//sql="Select * from UserTable";
m_pRecordSet.CreateInstance(__uuidof(Recordset));
m_pRecordSet->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); _variant_t Holder;
try
{
m_pRecordSet->AddNew();
m_pRecordSet->PutCollect("姓名",(_bstr_t)m_UserName);//(_bstr_t)m_UserName
m_pRecordSet->PutCollect("密码",(_bstr_t)m_PassWord);//(_bstr_t)m_PassWord
m_pRecordSet->PutCollect("权限",(_bstr_t)m_Priority);//(_bstr_t)m_Priority
m_pRecordSet->Update();
}
catch(_com_error e1)
{
MessageBox(e1.ErrorMessage());
return;
} if(m_pRecordSet!=NULL)
m_pRecordSet->Close();
m_pConnection->Close(); ::AfxMessageBox("Done");
}

解决方案 »

  1.   

    现在知道是m_pRecordSet->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    这句话出错了,错误信息是IDispatch error #3088,在csdn上看到说是SQL语句出了错,但是都没有详细说是怎么回事,请问有知道是什么原因的么??
      

  2.   

    当然是sql错了
    sql="Insert into User(姓名,密码,权限) values(ch1,ch2,ch3)";  这个语句用m_pConnection->Execute(sql,NULL,adCmdText)就可以了
      

  3.   

    如何要用m_pRecordSet来插入,sql就这样写
    sql="Select * from UserTable";
    或者
    m_pRecordSet->Open("UserTable",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdTable);
      

  4.   


    执行之后还是没有插入成功,报的错是类型不匹配,我在编辑框上设置的类型都是CString,但是在表中设置的是文本和是\否,是不是这个的原因啊 ,而且如果我把权限改成int型,在m_pRecordSet->PutCollect("权限",(_bstr_t)m_Priority);这句话就会报错
      

  5.   

    类型不匹配是SQL语句没写对
    数据库类型为int ,m_pRecordSet->PutCollect("权限",Priority);就可以了,Priority也为int类型sql语句一般写成
    Insert into User(姓名,密码,权限) values('ch1','ch2',int3)
      

  6.   


    这样也不行 ,还是有错 
    error C2664: 'PutCollect' : cannot convert parameter 2 from 'int' to 'const class _variant_t &'
            Reason: cannot convert from 'int' to 'const class _variant_t'
            No constructor could take the source type, or constructor overload resolution was ambiguous
      

  7.   

    m_pRecordSet->PutCollect("权限",_variant_t(Priority));
    试试
      

  8.   

    都试过了 ,_variant_t(Priority)和",(_bstr_t)m_Priority一样,都会包同样的错,就是说_variant_t和_bstr_t都是两个COM类,在VC中的基本数据类型无发和他俩相互转换
      

  9.   

    _variant_t(Priority) 的 Priority应该是int类型,对应数据库字段也应该是int类型._variant_t和bstr_t都是基本类型的封装类,可以和和基本类型相互转换.实在不行就用m_pConnection->Execute(sql,NULL,adCmdText)这种方式吧,简单又通用.
      

  10.   


    恩 刚试了下,把/*try
    {
    m_pRecordSet->AddNew();
    m_pRecordSet->PutCollect("姓名",(_bstr_t)m_UserName);//(_bstr_t)m_UserName
    m_pRecordSet->PutCollect("密码",(_bstr_t)m_PassWord);//(_bstr_t)m_PassWord
    m_pRecordSet->PutCollect("权限",(_bstr_t)m_Priority);//(_bstr_t)m_Priority
    m_pRecordSet->Update();
    }
    catch(_com_error e1)
    {
    MessageBox(e1.ErrorMessage());
    return;
    }*/这部分代码注释掉了,但是奇怪的是插入数据库中的数据是ch1,ch2,ch
    3,并不是我在编辑框中输入的内容,saiyaman5兄知道是咋回事部>?? 再有就是每次运行程序之后只能添加一项,如果你在点击提交按钮的话就会报错说"未指定的错误"
      

  11.   

    贴出你的sql语句和代码,insert 语句每次插入一条记录.
      

  12.   

    http://blog.csdn.net/zyq5945/archive/2010/04/29/5541280.aspx
      

  13.   

    void CRegistrDlg::OnBUTTONCommit() 
    {
    // TODO: Add your control notification handler code here
    //::AfxMessageBox("OK");
    try
    {
    m_pConnection=NULL;
    HRESULT hr=S_OK;
    hr=m_pConnection.CreateInstance(__uuidof(Connection));
    CString strConnect="Provider=Microsoft.ACE.OLEDB.12.0;Persist Security Info=False;Data Source=UserManager.accdb;";
    m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);//adModeUnknown,adConnectUnspecified

    }
    catch(_com_error e)
    {
    AfxMessageBox(e.Description());
    } //::AfxMessageBox("Connection"); char ch1[30],ch2[30],ch3[30];

    _bstr_t sql; GetDlgItemText(IDC_EDIT_UserName,ch1,30);
    GetDlgItemText(IDC_EDIT_Password,ch2,30);
    GetDlgItemText(IDC_EDIT_Priority,ch3,30); //::AfxMessageBox("IN1");
    sql="Insert into UserTable(姓名,密码,权限) values('2222','7777','666')"; 
    //sql="Select * from UserTable"; ::AfxMessageBox("IN");
    try
    {
    m_pConnection->Execute(sql,NULL,adCmdText);

    //m_pRecordSet.CreateInstance(__uuidof(Recordset));
    //m_pRecordSet->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    //m_pConnection.GetInterfacePtr(),_variant_t((IDispatch*)m_pConnection);
    }
    catch (_com_error e2)
    {
    AfxMessageBox(e2.ErrorMessage());
    }


    /*try
    {
    m_pRecordSet->AddNew();
    m_pRecordSet->PutCollect("姓名",(_bstr_t)m_UserName);//(_bstr_t)m_UserName
    m_pRecordSet->PutCollect("密码",(_bstr_t)m_PassWord);//(_bstr_t)m_PassWord
    m_pRecordSet->PutCollect("权限",(_bstr_t)m_Priority);//(_bstr_t)m_Priority
    m_pRecordSet->Update();
    }
    catch(_com_error e1)
    {
    MessageBox(e1.ErrorMessage());
    return;
    }*/ if(m_pRecordSet!=NULL)
    m_pRecordSet->Close();

    m_pConnection->Close(); /*m_pRecordSet->Release();
    m_pConnection->Release();
    m_pRecordSet=NULL;
    m_pConnection=NULL;*/
    ::AfxMessageBox("Done");
    }
    每次改变sql中的第一项即姓名的话,再运行程序就可以把sql语句中的内容插入数据库,但是若是只修改后两项的话就不会插入到数据库中,而且获取不到输入到编辑框控件中的内容.每次必须在sql中输入内容才行.
      

  14.   

    插入不了应该会有报错吧,是不是用姓名做主键了?姓名没改,插入时就会出现主键重复,所以失败,在这个时候应该用update语句.char ch1[30],ch2[30],ch3[30];
    GetDlgItemText(IDC_EDIT_UserName,ch1,30);
    GetDlgItemText(IDC_EDIT_Password,ch2,30);
    GetDlgItemText(IDC_EDIT_Priority,ch3,30);这几行执行过后,ch1[30],ch2[30],ch3[30]的值都是什么?
      

  15.   


    按照你的这个方法实现了,现在已经可以注册成功了,之所以没有获取到编辑框控件的内容是因为没有加UpdateData(TRUE);这句代码,具体的代码我贴出来void CRegistrDlg::OnBUTTONCommit() 
    {
    // TODO: Add your control notification handler code here
    try
    {
    m_pConnection=NULL;
    HRESULT hr=S_OK;
    hr=m_pConnection.CreateInstance(__uuidof(Connection));
    CString strConnect="Provider=Microsoft.ACE.OLEDB.12.0;Persist Security Info=False;Data Source=UserManager.accdb;";
    m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);//adModeUnknown,adConnectUnspecified

    }
    catch(_com_error e)
    {
    AfxMessageBox(e.Description());
    } _bstr_t sql; //::AfxMessageBox("IN1"); 
    sql="Select * from UserTable"; ::AfxMessageBox("IN");
    try
    {
    //m_pConnection->Execute(sql,NULL,adCmdText);

    m_pRecordSet.CreateInstance(__uuidof(Recordset));
    m_pRecordSet->Open(sql,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
    UpdateData(TRUE);
    }
    catch (_com_error e2)
    {
    AfxMessageBox(e2.ErrorMessage());
    }


    try
    {
    m_pRecordSet->AddNew();
    m_pRecordSet->PutCollect("姓名",(_variant_t)m_UserName);
    m_pRecordSet->PutCollect("密码",(_variant_t)m_PassWord);
    m_pRecordSet->PutCollect("权限",(_variant_t)m_Priority);
    m_pRecordSet->Update();
    //UpdateData(TRUE);
    ::AfxMessageBox("Input Ok");
    }
    catch(_com_error e1)
    {
    MessageBox(e1.ErrorMessage());
    return;
    } if(m_pRecordSet!=NULL)
    m_pRecordSet->Close();

    m_pConnection->Close();
    ::AfxMessageBox("Done");
    非常感谢saiyaman5兄的回帖 O(∩_∩)O哈哈~
      

  16.   


    这几行就是输入到编辑框的内容,但是插入到数据库的还是ch1,ch2,ch3,却不是输入的内容