高手请进!!ATL COM封装访问数据库问题!谢谢

knightR 2003-03-22 04:55:20
现在作一个中间件,封装ADO,在中间件中实现访问和业务逻辑
我的问题主要在封装访问数据库方面
封装提供SQL语句和存储过程访问分布式数据库,[包含路由]
我现在比较头痛的是存储过程的访问部分,需要返回数据集,
而存储过程的参数和是否有返回也是动态的,
我定义了一个结构来作为存储过程参数的描述
struct PARAMT
{
long bIn; //flag : 0--out, !0--in
VARIANT value; //value of the parameter
} PARAMT;

接口部分::
//单个存储过程
ExecProcSingle(BSTR ProcName , int Mod_Type , BSTR StrConn,SAFEARRAY(PARAMT) * pasParam,/* [out, retval] */ IDispatch** dRst);

ProcName :存储过程名字
Mod_Type :是否有返回 0:无
StrConn:连接串
pasParam:参数
dRst:返回

请高手指点!!!




...全文
21 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
knightR 2003-03-24
  • 打赏
  • 举报
回复
STDMETHODIMP CDBServer::ExecProcSingle(BSTR ProcName, BSTR StrConn,SAFEARRAY** psaParams,IDispatch** dRst)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//////////////////////////////////////////////////////////////////////////////

pConn=NULL;
pCmd=NULL;
pRst=NULL;

HRESULT hrconn;
CString tmp(StrConn);

try
{
hrconn = pConn.CreateInstance("ADODB.Connection"); pConn->Open(_bstr_t(tmp),L"",L"",adModeUnknown);//

HRESULT hr;
hr=pCmd.CreateInstance(__uuidof(ADODB::Command));
pCmd->ActiveConnection =pConn;
pCmd->CommandText = ProcName;
pCmd->CommandType = adCmdStoredProc;
//pCmd->Execute(NULL,NULL,adCmdStoredProc);

}
catch (_com_error e)
{
CString errormessage;
errormessage.Format("Êý¾Ý¿âÁ¬½Óʧ°Ü!\r\n´íÎóÐÅÏ¢:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///ÏÔʾ´íÎóÐÅÏ¢
}

try
{
PARAMT *pArrayElements;
pArrayElements=(PARAMT*) (*psaParams)->pvData;

//add in/out parameter
if(NULL!=psaParams)
{
for(unsigned int i = 0; i<(*psaParams)->rgsabound[0].cElements;i++)
{
PARAMT para;
para=(pArrayElements[i]);
int nSize = 0;
DataTypeEnum DataType;
BOOL bEmpty;
bEmpty=GetDataTypeSize(para.value,DataType,nSize);
ParameterDirectionEnum Direction;
if(1==para.bIn) Direction=adParamInput;
else if(0==para.bIn) Direction=adParamOutput;
else break ;//no parameter


pCmd->Parameters->Append(
pCmd->CreateParameter(
"", //Name optional
DataType,//type
Direction, //direction
nSize,//size
para.value //value of para
)
);
}
}
pCmd->put_Prepared(true);
pRst=pCmd->Execute(NULL,NULL,adCmdStoredProc);
if(pRst)
*dRst = (IDispatch*)pRst;

}
catch(_com_error e)
{
CString errormessage;
errormessage.Format("Êý¾Ý¿âÁ¬½Óʧ°Ü!\r\n´íÎóÐÅÏ¢:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///ÏÔʾ´íÎóÐÅÏ¢
}
return S_OK;
}

问题是 我没有搞懂SAFEARRAY的用法,所以给别人调用时尴尬之,请多多指教
knightR 2003-03-24
  • 打赏
  • 举报
回复
传输SQL语句的我写完了,调用存储过程主要时为了返回记录集合
例如返回符合记录的指针集合
天限天空 2003-03-24
  • 打赏
  • 举报
回复
可以直接传输 sql 语句啊

knightR 2003-03-22
  • 打赏
  • 举报
回复
PARAMT同上为结构:

PARAMT *pArrayElements;
pArrayElements=(PARAMT*) (*psaParams)->pvData;

//add in/out parameter
if(NULL!=psaParams)
{
for(unsigned int i = 0; i<(*psaParams)->rgsabound[0].cElements;i++)
{
PARAMT para;
para=(pArrayElements[i]);
int nSize = 0;
DataTypeEnum DataType;
BOOL bEmpty;
bEmpty=GetDataTypeSize(para.value,DataType,nSize);
ParameterDirectionEnum Direction;
if(1==para.bIn) Direction=adParamInput;
else if(0==para.bIn) Direction=adParamOutput;
else break ;//no parameter

我想将字段的名字一起传进去,但是我不知道别人传进来的内容我该如何解析出????????
pCmd->Parameters->Append(
pCmd->CreateParameter(
"", //Name optional
DataType,//type
Direction, //direction
nSize,//size
para.value //value of para
)
);
}
}


谢谢
knightR 2003-03-22
  • 打赏
  • 举报
回复
怎么将参数pasParam[不确定的] 用CREATEPARAMETER传递给ADO参数.???

ORACLE 的连接串的用
Provider=oraOleDb.Oracle;Password=cctvsms;User ID=cctvsms;Data Source=orcl194;Persist Security Info=True;PLSQLRSET=1

第一次参数时要返回的指针,时这样写的么?
天限天空 2003-03-22
  • 打赏
  • 举报
回复
具体点
天限天空 2003-03-22
  • 打赏
  • 举报
回复
up
knightR 2003-03-22
  • 打赏
  • 举报
回复
我的描述可能不是很清晰,希望和你交流,我一般都在线

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧