📄 getdatabase.cpp
字号:
}
}
// 执行存储过程返回记录集的地址。在此函数中使用约定包名:mfd_callpkg。字段列表用"逗号"隔开如:"empid,empname"。
// 存储过程格式约定:包名.存储过程名(输入参数 , 输入参数 , 输出参数 , 结果集)。
_RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName , PARAMETERINFO aParameterInfo[] , BYTE bParametersCount ,
const char *pcFieldsList , const char *pcPackageName/* = "mfd_callpkg"*/)
{
_RecordsetPtr *ppRs = new _RecordsetPtr; // 动态创建记录集对象。
HRESULT hpRecordset = (*ppRs).CreateInstance(_uuidof(Recordset));
if(FAILED(hpRecordset))
{
TRACE("--CDatabaseAccess::ExecProGetRecordset()-- 创建RECORDSET对象失败!");
return NULL;
}
_CommandPtr pCmd;
HRESULT hRet = pCmd.CreateInstance(_uuidof(Command));
if(FAILED(hRet))
{
TRACE("--CDatabaseAccess::ExecProGetRecordset()-- 创建COMMAND对象失败!");
return NULL;
}
const CString strResultsetNumber = "1000"; // 结果集中记录的个数.好像是上限。
CString strCallScript; // 调用格式.
strCallScript = "{call ";
if(strlen(pcPackageName)) // 如果在包中。则连入包名。
{
strCallScript += pcPackageName;
strCallScript += ".";
}
strCallScript += pcProcedureName;
strCallScript += "(";
for(int i=1 ; i<=bParametersCount ; i++)
{
strCallScript += "?,";
}
strCallScript += "{resultset ";
strCallScript += strResultsetNumber;
strCallScript += ",";
strCallScript += pcFieldsList;
strCallScript += "})}";
TRACE("%s\n" , strCallScript.GetBuffer(0));
_ParameterPtr *aParameterPtr = NULL;
if(bParametersCount > 0)
{ // 动态创建参数对象
aParameterPtr=new _ParameterPtr[bParametersCount];
memset(aParameterPtr , 0 ,sizeof(_ParameterPtr) * bParametersCount);
}
try
{
if(bParametersCount <= 0) // 无参数
{
if(bParametersCount < 0)
{
delete ppRs;
return (_RecordsetPtr*)NULL; // 出错
}
pCmd->ActiveConnection = m_pCon; // 设置COMMAND对象的属性
pCmd->CommandText = strCallScript.AllocSysString();
pCmd->CommandType = adCmdText;
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR); //变体类型空值
(*ppRs)->CursorLocation = adUseClient;
(*ppRs)->Open((IDispatch*)pCmd , vtEmpty, adOpenKeyset, adLockOptimistic,adOpenRecordUnspecified);
return ppRs;
}
pCmd->ActiveConnection = m_pCon; // 设置COMMAND对象的属性
pCmd->CommandText = strCallScript.AllocSysString();
pCmd->CommandType = adCmdText;
//创建参数实例并添加之
for(int i=0; i < bParametersCount; i++)
{
aParameterPtr[i] = pCmd->CreateParameter(aParameterInfo[i].Name , aParameterInfo[i].Type , aParameterInfo[i].Direction , aParameterInfo[i].Size);
pCmd->Parameters->Append(aParameterPtr[i]);
}
if(!m_bIsOracle) // SQLServer中需要!
pCmd->Parameters->Refresh(); // 资源集中的操作
// 对输入参数的处理
for(i=0; i < bParametersCount; i++)
{
if(aParameterInfo[i].Direction==adParamInput || aParameterInfo[i].Direction == adParamInputOutput)
{
if(m_bIsOracle) //oracle数据库
{
pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value = aParameterInfo[i].Value;
}
else //SQLserver数据库
{
CString str;
str.Format("@%s",((char *)aParameterInfo[i].Name));
pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value = aParameterInfo[i].Value;
}
}
}
_variant_t vtEmpty (DISP_E_PARAMNOTFOUND, VT_ERROR); //变体类型空值
(*ppRs)->CursorLocation = adUseClient;
(*ppRs)->Open((IDispatch*)pCmd , vtEmpty, adOpenKeyset/*adOpenForwardOnly*/, adLockOptimistic,adOpenRecordUnspecified);
// 对输出参数的处理
for(i=0; i < bParametersCount; i++)
{
if(aParameterInfo[i].Direction==adParamOutput || aParameterInfo[i].Direction == adParamInputOutput)
{
if(m_bIsOracle) //oracle数据库
{
aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(aParameterInfo[i].Name) )->Value;
}
else //SQLserver数据库
{
CString str;
str.Format("@%s",((char *)aParameterInfo[i].Name));
aParameterInfo[i].Value = pCmd->Parameters->GetItem(_variant_t(_bstr_t(str.AllocSysString())))->Value;
}
}
}
if(bParametersCount > 0)
delete []aParameterPtr;
return ppRs; //返回记录集对象的指针.
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ExecProGetRecordset()-- %s,%s %x\n",(char *)e.Description(),(char *)e.ErrorMessage(),e.Error());
if(e.Error() == 0x80004005)
{
TRACE("到数据库的网络连接可能已经断开。\n");
}
if(bParametersCount > 0)
delete []aParameterPtr;
delete ppRs;
return NULL;
}
catch (...) {
TRACE("--ExecProGetRecordset()-- 不明错误\n");
if(bParametersCount > 0)
delete []aParameterPtr;
delete ppRs;
return NULL;
}
}
// 无参数的存储过程(普通存储过程,非包中)。
_RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName)
{
return (_RecordsetPtr *)ExecuteProcedure(pcProcedureName, (PARAMETERINFO *)NULL , 0);
}
// 无参数的存储过程
_RecordsetPtr *CDatabaseAccess::ExecProGetRecordset(const char *pcProcedureName , const char *pcFieldsList)
{
return ExecProGetRecordset(pcProcedureName, (PARAMETERINFO *)NULL , 0 , pcFieldsList);
}
// 执行SQL语句
_RecordsetPtr *CDatabaseAccess::ExecuteSQLSentence( const char *pcSentence)
{
_RecordsetPtr *ppRs=new _RecordsetPtr; // 动态创建记录集对象。
try
{
(*ppRs).CreateInstance(_uuidof(Recordset));
(*ppRs)->Open(_variant_t(pcSentence) , m_pCon.GetInterfacePtr() , adOpenKeyset , adLockOptimistic, adCmdText);
return ppRs;
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ExecuteSQLSentence()-- %s,%s\n", (char *)e.Description() ,(char *)e.ErrorMessage());
delete ppRs;
return NULL;
}
catch (...) {
TRACE("--CDatabaseAccess::ExecuteSQLSentence()-- 不明错误\n");
delete ppRs;
return NULL;
}
}
//连接内地数据库方式(无用户名和密码格式)(Access数据库)
BOOL CDatabaseAccess::ConnectDB(char *DatabaseName)
{
if (!m_bIsOracle)
{
try
{
CString strConnection; //连接字符串
strConnection.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False",DatabaseName);
HRESULT hResult=m_pCon->Open(strConnection.GetBuffer(0) ,"" ,"" ,adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return 1; //连接成功!
else
return 0; //连接失败!
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());
return 0; //连接失败
}
catch (...) {
TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");
return 0;
}
}
return 0;
}
BOOL CDatabaseAccess::ConnectDB(const char *DatabaseName,char *PassWord)
{
//连接ACCESS数据库,带密码
if (!m_bIsOracle)
{
try
{
CString strConnection; //连接字符串
strConnection.Format("DSN=%s;PWD=%s",DatabaseName,PassWord);
HRESULT hResult=m_pCon->Open(strConnection.GetBuffer(0) ,"" ,"" ,adModeUnknown);
strConnection.ReleaseBuffer();
if(SUCCEEDED(hResult))
return 1; //连接成功!
else
return 0; //连接失败!
}
catch(_com_error &e)
{
TRACE("--CDatabaseAccess::ConnectDB()-- %s,%s\n",(char *)e.Description() ,(char *)e.ErrorMessage());
return 0; //连接失败
}
catch (...) {
TRACE("--CDatabaseAccess::ConnectDB()-- 不明错误\n");
return 0;
}
}
return 0;
}
int CDatabaseAccess::GetRecordSetCount(_RecordsetPtr m)
{
int i=0;
if(!(m->GetRecordCount()==0))
{
m->MoveFirst();
while (!m->adoEOF) {
i++;
m->MoveNext();
}
}
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -