现在我使用一个简单的SQL语句的某张表的数据,但是这张表中有CLOB字段,这时会发现此应用程序有内存泄漏,不知有没有什么好办法可以解决!
解决方案 »
- 修改串
- 请教一下如何删除XML文件的数据?
- CListCtrl怎样在大量添加数据的时候不更新窗口
- 我想做个软件,其功能是将同音的汉字对应于一个数值,然后可以互相翻译,请大家给点思路或提供点资源,例如控件之类的
- 救命啊,runtime error??
- 初来乍道请各位前辈帮忙啊!
- 适时生成曲线
- ㊣㊣ 问个问题,如何才可以像ie一样,可以将它的菜单栏和工具栏以一幅图片做为它的背景呢?指的是主菜单,不是点击菜单后的弹出菜单的?㊣
- 帶一個checkbox的list應該怎麼做?
- 问题,实在没分,刚有的十分,压上了.
- 请问:如何修改一个图形中一个点的(HSL)值;(色调,饱和度,亮度)
- 完成端口的问题,请教高手!
{
CComBSTR bstrSql;
_RecordsetPtr spAdoRs;
try
{
HRESULT hr = spAdoRs.CreateInstance(__uuidof(Recordset));
if(FAILED(hr)) continue;
spAdoRs->PutCursorLocation(adUseClientBatch);
bstrSql = m_strSql;
spAdoRs->Open((BSTR)bstrSql, m_spAdoCon.GetInterfacePtr(), adOpenStatic, adLockBatchOptimistic, -1);
}
catch(_com_error e)
{
CString str,strMsg;
str = (BSTR)e.Description();
strMsg.Format(_T("错误号:%d,错误原因:%s"),e.Error(),str);
MessageBox(strMsg);
return ;
}
}
return ;
STDMETHODIMP GetRecordset(BSTR bstrSQL, _Recordset **ppRs)
{
HRESULT hr;
VARIANT var;
long lCount = 0;
_CommandPtr spAdoCmd = NULL;
_ParameterPtr spAdoClob = NULL;
_RecordsetPtr spAdoRs = NULL;
VariantInit(&var);
try
{
m_spAdoCon->PutCursorLocation(adUseClient);
hr = spAdoCmd.CreateInstance(__uuidof(Command));
if(FAILED(hr)) return hr;
spAdoCmd->ActiveConnection = m_spAdoCon;
spAdoClob = spAdoCmd->CreateParameter(L"prCLOB",adLongVarChar,adParamOutput,100000);
hr = spAdoCmd->Parameters->Append(spAdoClob);
spAdoCmd->Properties->GetItem(L"SPPrmsLOB")->Value = 1L; spAdoCmd->CommandText = bstrSQL;
spAdoRs = spAdoCmd->Execute(&var,NULL,adCmdText); var.vt = VT_DISPATCH;
var.pdispVal = NULL;
spAdoRs->PutActiveConnection(var);
*ppRs = spAdoRs.Detach();
VariantClear(&var);
}
catch(_com_error e)
{
//异常处理
}
return S_OK;
}
用如下的办法得到的Recordset是可写的,但是会产生内存泄漏
STDMETHODIMP GetRecordset(BSTR bstrSQL, _Recordset **ppRs)
{
HRESULT hr;
VARIANT var;
long lCount = 0;
_CommandPtr spAdoCmd = NULL;
_ParameterPtr spAdoClob = NULL;
_RecordsetPtr spAdoRs = NULL;
VariantInit(&var);
try
{
m_spAdoCon->PutCursorLocation(adUseClient);
hr = spAdoCmd.CreateInstance(__uuidof(Command));
if(FAILED(hr)) return hr;
spAdoCmd->ActiveConnection = m_spAdoCon;
spAdoClob = spAdoCmd->CreateParameter(L"prCLOB",adLongVarChar,adParamOutput,100000);
hr = spAdoCmd->Parameters->Append(spAdoClob);
spAdoCmd->Properties->GetItem(L"SPPrmsLOB")->Value = 1L; spAdoCmd->CommandText = bstrSQL;
hr = spAdoRs.CreateInstance(__uuidof(Recordset));
if(FAILED(hr)) return hr;
spAdoRs->PutCursorLocation(adUseClientBatch);
spAdoRs->Open((IDispatch *)spAdoCmd, vtMissing, adOpenStatic, adLockBatchOptimistic, -1); var.vt = VT_DISPATCH;
var.pdispVal = NULL;
spAdoRs->PutActiveConnection(var);
*ppRs = spAdoRs.Detach();
VariantClear(&var);
}
catch(_com_error e)
{
//异常处理
}
return S_OK;
}
说明对于此语句只能是使用ORACLE数据库才可运行,因为有它的专用属性SPPrmsLOB及专用参数。
希望大家帮忙,至于分的问题不是问题。