调用插入数据的存储过程:
// 调用存储过程来插入一条记录 BOOL CDBTestAppDlg::InsertRecord() { CAdoParameter param1, param2, param3; CAdoCommand comm; if(ConnTODB()) { comm.SetConnection(m_pConnection); param1.SetSize(20); param1.SetName("C_Name"); param1.SetDirection(adParamInput); param1.SetType(adVarChar); // varchar2 param1.SetValue((CString)"hello113"); // 这里必须用类型转换,默认的参数类型为bool,所以转换会出错 comm.Append(param1.GetParameter()); param2.SetName("C_Age"); param2.SetDirection(adParamInput); param2.SetType(adInteger); // Integer param2.SetValue(21); comm.Append(param2.GetParameter()); param3.SetName("C_ExeTime"); param3.SetDirection(adParamInput); param3.SetType(adVarChar); // varchar2 param3.SetValue((CString)"2010-1-10"); comm.Append(param3.GetParameter()); comm.SetCommandText("Proc_Insert"); comm.SetCommandType(adCmdStoredProc); try { comm.Execute(); MessageBox("Procedure execute success!", "执行成功", MB_OK | MB_ICONINFORMATION); return TRUE; } catch (CException* e) { char errorMessage[256]; e->GetErrorMessage(errorMessage, 255); MessageBox(errorMessage); } } return FALSE; }
其中连数据库的函数为:
BOOL CDBTestAppDlg::ConnTODB() { BOOL nResult = TRUE; if (m_pConnection == NULL) { m_pConnection = new CAdoConnection; if (!m_pConnection->CreateInstance()) { MessageBox("创建数据库实例失败"); delete m_pConnection; m_pConnection = NULL; return FALSE; } } if (m_pConnection->IsOpen()) m_pConnection->Close(); m_pConnection->SetConnectTimeOut(2); m_pRecordSet.SetAdoConnection(m_pConnection); if (!m_pConnection->Connection(m_sProvider)) { // MessageBox("连接业务数据库失败"); nResult = FALSE; } else { // MessageBox("连接业务数据库成功"); } return nResult; }
为了返回结果集,首先要建立一个包,再建立一个包体,代码如下:
CREATE OR REPLACE Package pkg_GetResult as Type myResult is REF CURSOR; -- 定义返回值类型 Procedure getResult(age number, pResult out myResult); -- 声明pResult为输出的结果集变量 end pkg_GetResult; / CREATE OR REPLACE Package Body pkg_GetResult as Procedure getResult(age number, pResult out myResult) IS sqlstr varchar2(200); begin if age = 0 then open pResult for Select C_ID, C_Name, C_Age, C_InTime, C_Salary, C_ExeTime from T_Test; else sqlstr := 'Select C_ID, C_Name, C_Age, C_InTime, C_Salary, C_ExeTime from T_Test where C_Age=:w_age'; open pResult for sqlstr using age; end if; end getResult; end pkg_GetResult;
在vc中调用这个包中的存储过程,调用方法:包名.存储过程名(参数1, 参数2, ...):
BOOL CDBTestAppDlg::GetResult(CString ProcName, int age) { if(ConnTODB()) { try { CString sql; sql.Format("{call %s(%d)}", ProcName, age); // 调用包中的存储过程:packageName.procedureName(参数1,参数2...) TRACE(sql + "\n"); m_pRecordSet.Open(sql, adCmdText, adOpenStatic, adLockReadOnly); TRACE("Procedure execute success!"); while(!m_pRecordSet.IsEOF()) { CString name, age; m_pRecordSet.GetCollect("C_Name", name); m_pRecordSet.GetCollect("C_Age", age); MessageBox("name = " + name + ", age = " + age); // TRACE("name = " + name + ", age = " + age); m_pRecordSet.MoveNext(); } return TRUE; } catch (CException* e) { char errorMessage[256]; e->GetErrorMessage(errorMessage, 255); MessageBox(errorMessage); return FALSE; } } return FALSE; }
通过CRecordSet的Open()方法可以返回结果集,再进行遍历。这里用到了一些自定义的函数,因为相对简单,所以未给出。这里的调用是adCmdText,而不是adCmdStoredProc