用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");
}
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");
}
这句话出错了,错误信息是IDispatch error #3088,在csdn上看到说是SQL语句出了错,但是都没有详细说是怎么回事,请问有知道是什么原因的么??
sql="Insert into User(姓名,密码,权限) values(ch1,ch2,ch3)"; 这个语句用m_pConnection->Execute(sql,NULL,adCmdText)就可以了
sql="Select * from UserTable";
或者
m_pRecordSet->Open("UserTable",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdTable);
执行之后还是没有插入成功,报的错是类型不匹配,我在编辑框上设置的类型都是CString,但是在表中设置的是文本和是\否,是不是这个的原因啊 ,而且如果我把权限改成int型,在m_pRecordSet->PutCollect("权限",(_bstr_t)m_Priority);这句话就会报错
数据库类型为int ,m_pRecordSet->PutCollect("权限",Priority);就可以了,Priority也为int类型sql语句一般写成
Insert into User(姓名,密码,权限) values('ch1','ch2',int3)
这样也不行 ,还是有错
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
试试
恩 刚试了下,把/*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兄知道是咋回事部>?? 再有就是每次运行程序之后只能添加一项,如果你在点击提交按钮的话就会报错说"未指定的错误"
{
// 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中输入内容才行.
GetDlgItemText(IDC_EDIT_UserName,ch1,30);
GetDlgItemText(IDC_EDIT_Password,ch2,30);
GetDlgItemText(IDC_EDIT_Priority,ch3,30);这几行执行过后,ch1[30],ch2[30],ch3[30]的值都是什么?
按照你的这个方法实现了,现在已经可以注册成功了,之所以没有获取到编辑框控件的内容是因为没有加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哈哈~
这几行就是输入到编辑框的内容,但是插入到数据库的还是ch1,ch2,ch3,却不是输入的内容