mfc中对对数据库操作老不成功,帮看一下

时间:2022-12-11 15:23:59

SQL> create procedure add_customer_info_tab(
  2  param1 in customer_info_tab.customer_id%type,
  3  param2 in customer_info_tab.name%type,
  4  param3 in customer_info_tab.address%type,
  5  param4 in customer_info_tab.code%type,
  6  param5 in customer_info_tab.profession%type,
  7  param6 in customer_info_tab.company%type,
  8  param7 in customer_info_tab.email%type,
  9  param8 in customer_info_tab.phone%type,
 10  param9 in customer_info_tab.mobile%type,
 11  param10 in customer_info_tab.meet_time%type,
 12  param11 in customer_info_tab.memo%type
 13  )as
 14  begin
 15  delete from customer_info_tab where customer_id=param1;
 16  insert into customer_info_tab(customer_id,name,address,code,profession,comp
any,email,phone,mobile,meet_time,memo)values(param1,param2,param3,param4,param5,
param6,param7,param8,param9,param10,param11);
 17  end;
 18  /

过程已创建。

下面是添加操作的代码

void CCRDBSDlg::OnBtnCustomerAdd() 
{
// TODO: Add your control notification handler code here
if(!UpdateData())
return;
if(m_strCustomerName.IsEmpty()){
AfxMessageBox("客户姓名不能为空");
return;
}
CString strDate=m_oleMeetDate.Format("%Y-%m-%d")
+" "+m_oleMeetTime.Format("%H:%M:%S");
try
{
m_pRecordset->Open("Select seq_customer_id.NEXTVAL from dual"
,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
int id=1;
if(!m_pRecordset->adoEOF)
{
_variant_t TheValue;
TheValue=m_pRecordset->Fields->GetItem((short)0)->Value;
if(TheValue.vt!=VT_NULL)
id=TheValue.iVal;
}
m_pRecordset->Close();
_variant_t vNULL;
vNULL.vt=VT_ERROR;
vNULL.scode=DISP_E_PARAMNOTFOUND;
CString sql;
sql.Format("call add_customer_info_tab(%d,'%s','%s','%s,'%s','%s','%s,'%s','%s',"
"to_date('%s','yyyy-mm-dd hh24:mi:ss'),"
"'%s')",id,m_strCustomerName,m_strAddress,
m_strCode,m_strProfession,m_strCompany,
m_strEmail,m_strPhone,m_strMobile,strDate,m_str_CustomerMemo);
TRACE(sql);
//利用命令对象完成sql命令的执行
m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText=_bstr_t(sql);
m_pCommand->Execute(&vNULL,&vNULL,adCmdText);

InsertCustomerInfoItem(id,m_strCustomerName,m_strAddress,
m_strCode,m_strProfession,m_strCompany,
m_strEmail,m_strPhone,m_strMobile,strDate,m_str_CustomerMemo);
}
catch(_com_error e)
{
AfxMessageBox(e.ErrorMessage());
}
}

这是单击“添加”按钮时候的响应函数,我设断点调试,在执行完
                m_pCommand->ActiveConnection=m_pConnection;
m_pCommand->CommandText=_bstr_t(sql);
m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
之后,在往下执行就出现了一个对话框提示说“IDispatch error #3092”InsertCustomerInfoItem函数没有执行,执行了catch中的代码。查了一下MSDN,还是不懂。大虾们帮我看看,谢了。

补充:运行有一个警告:c:\documents and settings\李金探\桌面\myproject\debug\msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsigned。


警告指向的代码
enum RecordCreateOptionsEnum
{
    adCreateCollection = 8192,
    adCreateStructDoc = -2147483648,
    adCreateNonCollection = 0,//就是这里
    adOpenIfExists = 33554432,
    adCreateOverwrite = 67108864,
    adFailIfNotExists = -1
};

4 个解决方案

#1


// 单步调试,看看什么错误
// 把ADO操作放到try{}catch(_com_error e){}块中
// 可以在catch块中打印 e.ErrorMessage()和e.Description()查看具体ADO错误
// 那个警告不用管,凡是ADO1.5编程都有那个警告。

#2


引用 1 楼 lfchen 的回复:
// 单步调试,看看什么错误
// 把ADO操作放到try{}catch(_com_error e){}块中
// 可以在catch块中打印 e.ErrorMessage()和e.Description()查看具体ADO错误
// 那个警告不用管,凡是ADO1.5编程都有那个警告。
我回去试试,上面调试的结果也就是我单步调试的结果了

#3


dddddd

#4


一、跟踪到
m_pCommand->CommandText=_bstr_t(sql)
将sql的内容直接到数据库管理器中执行一下,看是否SQL或存储过程有错
二、
看m_pConnection是否为NULL
三、
m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
不用这么麻烦,直接
m_pCommand->Execute(NULL,NULL,adCmdText);
即可



我用自己封装的CAdoCommand测试过(WIN2003、VC6、MSSQL2005)

#1


// 单步调试,看看什么错误
// 把ADO操作放到try{}catch(_com_error e){}块中
// 可以在catch块中打印 e.ErrorMessage()和e.Description()查看具体ADO错误
// 那个警告不用管,凡是ADO1.5编程都有那个警告。

#2


引用 1 楼 lfchen 的回复:
// 单步调试,看看什么错误
// 把ADO操作放到try{}catch(_com_error e){}块中
// 可以在catch块中打印 e.ErrorMessage()和e.Description()查看具体ADO错误
// 那个警告不用管,凡是ADO1.5编程都有那个警告。
我回去试试,上面调试的结果也就是我单步调试的结果了

#3


dddddd

#4


一、跟踪到
m_pCommand->CommandText=_bstr_t(sql)
将sql的内容直接到数据库管理器中执行一下,看是否SQL或存储过程有错
二、
看m_pConnection是否为NULL
三、
m_pCommand->Execute(&vNULL,&vNULL,adCmdText);
不用这么麻烦,直接
m_pCommand->Execute(NULL,NULL,adCmdText);
即可



我用自己封装的CAdoCommand测试过(WIN2003、VC6、MSSQL2005)