小弟初次接触 Oracle,现在使用ADO连接方式操作数据库,需要调用 数据库的存储过程,
Proc_TULT_CHECK
(
PTULT002 varchar2,PTULT004 varchar2,outstr out varchar2
)
前2个参数都是text类型的输入参数,输出的也是 text参数,请问用C++语言怎么实现 CAdoConnection* m_pOraDb =new CAdoConnection;
m_pOra->Open("Provider=OraOLEDB.Oracle.1;Password=0000;Persist Security Info=True;User ID=xxx;Data Source=xxxx");
CAdoRecordSet OraadoPersonSet(m_pOraDb);
小弟是新手中的新手,刚开始接触,请各位哥哥姐姐帮帮忙啊 !谢谢!!!!弄好后就送分!谢谢大家,麻烦顶下!顶了都有分!!再次谢谢了!!!
Proc_TULT_CHECK
(
PTULT002 varchar2,PTULT004 varchar2,outstr out varchar2
)
前2个参数都是text类型的输入参数,输出的也是 text参数,请问用C++语言怎么实现 CAdoConnection* m_pOraDb =new CAdoConnection;
m_pOra->Open("Provider=OraOLEDB.Oracle.1;Password=0000;Persist Security Info=True;User ID=xxx;Data Source=xxxx");
CAdoRecordSet OraadoPersonSet(m_pOraDb);
小弟是新手中的新手,刚开始接触,请各位哥哥姐姐帮帮忙啊 !谢谢!!!!弄好后就送分!谢谢大家,麻烦顶下!顶了都有分!!再次谢谢了!!!
解决方案 »
- IPicture 使用 OnPaint 绘制图片,窗口最小化后,图片消失问题
- CListCtrl.Create没有设置sort属性,插入时仍然排序。
- CDialogBar::Create
- select 后WSAGetLastError得到的错误代码是10038???
- 问一个多线程的问题???
- 如何将CString转换成CTime?
- 怎样将一个类变成任何windows编程语言(如vb)都可以调用的dll,谢谢
- 对VC感兴趣的兄弟,,将大家的QQ或者是E-mail留下,以便大家互相交流和学习,还有个人主页也可以!!!
- 高分请教关于编译程序的问题:关于PL/0语言的编译程序
- 一个简单的window窗口程序的问题
- 求助 CLlistBox 中的AddSrting
- 关于PRN文件的问题?
ado连oracle没用过。
不过有CAdoConnection,CAdoRecordSet类么?msdn上没有看到。
pRec.CreateInstance(__uuidof(Recordset));
comm.CreateInstance(__uuidof(Command)); HRESULT hr;
AfxMessageBox("开始进行连接");
try
{
//_10.231.152.15
hr=pCon->Open("Provider=MSDAORA.1;;Data Source=NLV;Password=GUEST;User ID=NLV_GUEST;Persist Security Info=True","","",adModeUnknown);
}
catch(_com_error *e)
{
MessageBox(e->ErrorMessage());
}
AfxMessageBox("连接结束");//oracle执行存储过程的准备
comm->ActiveConnection = pCon; //ADO连接
comm->CommandType = adCmdStoredProc;
comm->CommandText=_bstr_t(L"nlv_package.pro_mep"); //存储过程名 comm->Parameters->Append(comm->CreateParameter("HPZL",adBSTR,adParamInput,2,_variant_t(hpzl)));comm->Parameters->Append(comm->CreateParameter("HPHM",adBSTR,adParamInput,16,_variant_t(hphm)));comm->Parameters->Append(comm->CreateParameter("WFSJ",adDBTimeStamp,adParamInput,20,_variant_t(wfsj)));
comm->Parameters->Append(comm->CreateParameter("WFXW",adBSTR,adParamInput,5,_variant_t(wfxw)));
comm->Parameters->Append(comm->CreateParameter("WFDD",adBSTR,adParamInput,12,_variant_t(wfdddm)));
comm->Parameters->Append(comm->CreateParameter("WFDZ",adBSTR,adParamInput,200,_variant_t(wfdd)));
comm->Parameters->Append(comm->CreateParameter("CJR",adBSTR,adParamInput,8,""));
comm->Parameters->Append(comm->CreateParameter("CJJG",adBSTR,adParamInput,10,_variant_t(cjjg)));
comm->Parameters->Append(comm->CreateParameter("SJLY",adBSTR,adParamInput,2,_variant_t(sjly)));
comm->Parameters->Append(comm->CreateParameter("ZPLX",adBSTR,adParamInput,1,_variant_t(zplx)));
comm->Parameters->Append(comm->CreateParameter("SBBH",adBSTR,adParamInput,16,_variant_t(sbbh)));
comm->Parameters->Append(comm->CreateParameter("DLGLS",adNumeric,adParamInput,4,dlgl));
comm->Parameters->Append(comm->CreateParameter("DLMS",adNumeric,adParamInput,3,dlms));
comm->Parameters->Append(comm->CreateParameter("FJBZ",adBSTR,adParamInput,6,""));comm->Parameters->Append(comm->CreateParameter("CLSD",adNumeric,adParamInput,3,cpsd));
comm->Parameters->Append(comm->CreateParameter("DCXS",adNumeric,adParamInput,3,dcxs));
comm->Parameters->Append(comm->CreateParameter("XCXS",adNumeric,adParamInput,3,xcxs));
comm->Parameters->Append(comm->CreateParameter("DCZFXS",adNumeric,adParamInput,3,dczf));
comm->Parameters->Append(comm->CreateParameter("XCZFXS",adNumeric,adParamInput,3,xczf));
comm->Parameters->Append(comm->CreateParameter("ZDXS",adNumeric,adParamInput,3,0));comm->Parameters->Append(comm->CreateParameter("ZJWJ1",adBSTR,adParamInput,100,_variant_t(tp1)));
comm->Parameters->Append(comm->CreateParameter("ZJWJ2",adBSTR,adParamInput,100,_variant_t(tp2)));
comm->Parameters->Append(comm->CreateParameter("ZJWJ3",adBSTR,adParamInput,6,""));
comm->Parameters->Append(comm->CreateParameter("ZJWJ4",adBSTR,adParamInput,6,""));int hh;
comm->Parameters->Append(comm->CreateParameter("ZXJG",adInteger,adParamOutput,sizeof(int),hh)); try
{
comm->Execute(NULL,NULL,adCmdStoredProc);
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
AfxMessageBox("存储完成");
_variant_t var=comm->Parameters->GetItem("ZXJG")->GetValue();
::CoInitialize(0);
_ConnectionPtr pconn;
HRESULT hr;
hr = pconn.CreateInstance(__uuidof(Connection));//建立对象实例
if(SUCCEEDED(hr))
{
try
{
//打开数据源
pconn->ConnectionString = "Provider=OraOLEDB.Oracle.1;Password=1234;Persist Security Info=True;User ID=personal;Data Source=persondb";//设置连接字符串
pconn ->Open("","","",-1);
_CommandPtr cmmd;
HRESULT hr = cmmd.CreateInstance(__uuidof(Command));//中创建_CommandPtr对象
if(FAILED(hr))
{
AfxMessageBox("NewNetDatabase()中创建_CommandPtr对象失败");
return ;
}
_ParameterPtr PickPlace;
_ParameterPtr PickTime;
_ParameterPtr PickIDcode;
//添加参数,第一个参数为存储过程中的参数,可以指定也可以不指定,第二个参数数类型,第三个输
PickPlace = cmmd->CreateParameter("TULT002",adVarChar, adParamInput,64,_variant_t( pikinf.PickPlace));
//为_CommandPtr添加参数
cmmd->Parameters->Append(PickPlace);
PickTime = cmmd->CreateParameter("TULT004",adBigInt,adParamInput,20,_variant_t(pikinf.PickTime));
cmmd->Parameters->Append(PickTime);
PickIDcode = cmmd->CreateParameter("TULT003",adVarChar,adParamOutput,4000);
cmmd->Parameters->Append(PickIDcode);
cmmd->CommandText=_bstr_t("Proc_TULT_CHECK");//存储过程的名称
cmmd->ActiveConnection = pconn;//需要使用的ADO连接
cmmd->CommandType=adCmdStoredProc;
cmmd->Execute(NULL, NULL, adCmdStoredProc);
// strTmp =(CString)cmmd->Parameters->GetItem("TULT003")->GetValue();
// 获取出参
cmmd.Detach();
}
catch(_com_error e)
{
CString strerr;
strerr.Format(_T("出错,连接数据库错误~n错误:%s"),e.ErrorMessage());
AfxMessageBox(strerr);
pconn.Release();
return ;
}
}
No constructor could take the source type, or constructor overload resolution was ambiguous
_RecordsetPtr rs;
_CommandPtr cmd;
_variant_t var; CString strTemp; CoInitialize(NULL); cn.CreateInstance(__uuidof(Connection));
rs.CreateInstance(__uuidof(Recordset));
cmd.CreateInstance(__uuidof(Command)); cn->Open(...); strTemp.Format("exec myproc")//执行你自己的存储过程
cmd->ActiveConnection = cn;
cmd->CommandText = strTemp.GetBuffer(strTemp.GetLength());
rs = cmd->Execute(NULL,NULL,adCmdText);
//返回的结果在rs中,可以是1个参数,也可以是一个结果集//如果是n个参数,这些参数的序号分别是0,1,2,3,.....n.
//那获取的方式如下var.ChangeType(VT_I8);
var.lVal = 0;//获取第1个参数
var = rs->GetField()->GetItem(var)->value;
你获取的第1个参数就在var中存放着
如果是字符串,那就是var.bstrVal,如果是整数那就存在var.lVal里.......(还有很多其他类型的,比如日期,浮点等等)
获取第2个参数的办法就是
var.ChangeType(VT_I8);
var.lVal = 1;//获取第2个参数
var = rs->GetField()->GetItem(var)->value;ok现在是1行参数的,如果是一个结果集,就循环读出每个记录循环处理部分的代码如下
while(!rs->EndOfFile)
{
//象前边说的那样挨个取记录的各个字段.
var.ChangeType(VT_I8);
var.lVal = 0;//获取第1个参数
var = rs->GetField()->GetItem(var)->value; .......
//
rs->MoveNext();
}
例如你的存储过程返回的结果集合如下字段名 fna fnb
记录1 "aaa" 1
记录2 "bbb" 2那么你可以使用rs->GetFields()->GetItem("fna")->value;
获取第1个字段"aaa","bbb"数据
使用rs->GetFields()->GetItem("fnb")->value;
获取第2个字段1、2数据
而不用使用字段序号去取数字,所以好习惯是存储过程返回结果集合应该带字段名。