hr = m_pRecordset->Open(_variant_t("photo"), (IDispatch*)m_pConn, adOpenDynamic, adLockOptimistic, adCmdTable);1、请问上面的代码执行后,会查询数据库中的photo表吗?如果会查询,那么当photo表记录很多时这会不会太低效了?
2、通过这种方式(打开一个表,而不是执行select返回得到)建立的记录集,初始大小是什么呢?
3、它与通过执行select语句而得到的记录集又有何不同呢?希望您不吝赐教。谢谢。
代码是没问题的,我的疑问是:这样的操作会不会查询表呢?
完整代码:
void CTestOCRDlg::OnBnClickedButton4()//写入一张图片
{
// TODO: 在此添加控件通知处理程序代码
::CoInitialize(NULL); //初始化OLE/COM库环境
_ConnectionPtr m_pConn;
try
{
HRESULT hr = m_pConn.CreateInstance("ADODB.Connection");
if(FAILED(hr))
{
//cout<<"Create ADO Connection failed"<<endl;
exit(0);
} CString oracleConnectionString, oracleUserID, oraclePassword;
oracleConnectionString = "Provider=OraOLEDB.Oracle;Data Source=orcl;";
oracleUserID = "scott";
oraclePassword = "1234"; hr = m_pConn->Open((_bstr_t)oracleConnectionString, (_bstr_t)oracleUserID, (_bstr_t)oraclePassword, adModeUnknown);
if (FAILED(hr))
{
//cout<<"Can not connect to database"<<endl;
exit(0);
}
else
{
//cout<<"Connect to database successfully!"<<endl;
}
}
catch(_com_error e)
{
CString errMsg = e.ErrorMessage();
//cout<<errMsg<<endl;
exit(0);
} _RecordsetPtr m_pRecordset;
try
{ HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (FAILED(hr))
{
//cout<<"Create ADO Recordset failed"<<endl;
exit(0);
} // stuinfotable表中有一个blob类型字段stupic存储照片
hr = m_pRecordset->Open(_variant_t("photo"), _variant_t((IDispatch *)m_pConn,true),
adOpenUnspecified, adLockOptimistic, adCmdTable);
if (FAILED(hr))
{
//cout<<"Open ADO Recordset failed"<<endl;
exit(0);
}
m_pRecordset->AddNew(); //写入图片blob
CFile file(TEXT("C:\\to_recognize.jpg"),
CFile::modeRead | CFile::shareDenyNone);
long resultByteLen=file.GetLength();
BYTE* resultImgBuffer=new BYTE[resultByteLen];
file.Read(resultImgBuffer,resultByteLen);
BYTE* pBuf=resultImgBuffer;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=resultByteLen;
psa=SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i=0;i<resultByteLen;i++)
SafeArrayPutElement(psa,&i,pBuf++);
VARIANT varBLOB;
varBLOB.vt=VT_ARRAY|VT_UI1;
varBLOB.parray=psa;
m_pRecordset->GetFields()->GetItem(_variant_t("img"))->AppendChunk(varBLOB);
//写入图片name(以当前时间命名)
COleDateTime time=COleDateTime::GetCurrentTime();
CString str=time.Format(TEXT("%H%M%S"));
m_pRecordset->PutCollect(_variant_t("name"),_variant_t(str)); m_pRecordset->Update(); }
catch(_com_error e)
{
CString errMsg = e.ErrorMessage();
MessageBox(errMsg+TEXT("\n")+(LPCSTR)e.Description());
exit(0);
}
// 断开ADO连接
if (m_pConn != NULL)
{
m_pConn->Close();
m_pConn = NULL;
//cout<<"ADO connection closed successfully"<<endl;
} ::CoUninitialize();//释放程序占用的COM 资源
}
{
// TODO: 在此添加控件通知处理程序代码
::CoInitialize(NULL); //初始化OLE/COM库环境
_ConnectionPtr m_pConn;
try
{
HRESULT hr = m_pConn.CreateInstance("ADODB.Connection");
if(FAILED(hr))
{
//cout<<"Create ADO Connection failed"<<endl;
exit(0);
} CString oracleConnectionString, oracleUserID, oraclePassword;
oracleConnectionString = "Provider=OraOLEDB.Oracle;Data Source=orcl;";
oracleUserID = "scott";
oraclePassword = "1234"; hr = m_pConn->Open((_bstr_t)oracleConnectionString, (_bstr_t)oracleUserID, (_bstr_t)oraclePassword, adModeUnknown);
if (FAILED(hr))
{
//cout<<"Can not connect to database"<<endl;
exit(0);
}
else
{
//cout<<"Connect to database successfully!"<<endl;
}
}
catch(_com_error e)
{
CString errMsg = e.ErrorMessage();
//cout<<errMsg<<endl;
exit(0);
} _RecordsetPtr m_pRecordset;
try
{ HRESULT hr = m_pRecordset.CreateInstance("ADODB.Recordset");
if (FAILED(hr))
{
//cout<<"Create ADO Recordset failed"<<endl;
exit(0);
} // stuinfotable表中有一个blob类型字段stupic存储照片
hr = m_pRecordset->Open(_variant_t("photo"), _variant_t((IDispatch *)m_pConn,true),
adOpenUnspecified, adLockOptimistic, adCmdTable);
if (FAILED(hr))
{
//cout<<"Open ADO Recordset failed"<<endl;
exit(0);
}
m_pRecordset->AddNew(); //写入图片blob
CFile file(TEXT("C:\\to_recognize.jpg"),
CFile::modeRead | CFile::shareDenyNone);
long resultByteLen=file.GetLength();
BYTE* resultImgBuffer=new BYTE[resultByteLen];
file.Read(resultImgBuffer,resultByteLen);
BYTE* pBuf=resultImgBuffer;
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound=0;
rgsabound[0].cElements=resultByteLen;
psa=SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i=0;i<resultByteLen;i++)
SafeArrayPutElement(psa,&i,pBuf++);
VARIANT varBLOB;
varBLOB.vt=VT_ARRAY|VT_UI1;
varBLOB.parray=psa;
m_pRecordset->GetFields()->GetItem(_variant_t("img"))->AppendChunk(varBLOB);
//写入图片name(以当前时间命名)
COleDateTime time=COleDateTime::GetCurrentTime();
CString str=time.Format(TEXT("%H%M%S"));
m_pRecordset->PutCollect(_variant_t("name"),_variant_t(str)); m_pRecordset->Update(); }
catch(_com_error e)
{
CString errMsg = e.ErrorMessage();
MessageBox(errMsg+TEXT("\n")+(LPCSTR)e.Description());
exit(0);
}
// 断开ADO连接
if (m_pConn != NULL)
{
m_pConn->Close();
m_pConn = NULL;
//cout<<"ADO connection closed successfully"<<endl;
} ::CoUninitialize();//释放程序占用的COM 资源
}
appendchunk时要获取recordset,这时用m_pRecordset->Open("SELECT * FROM TABLENAME WHERE FLDNAME='FLDVAL'",.....)这样会快吧;或者连接数据库时用服务器游标pConnection->Open(DS, strUser.c_str(), strPassword.c_str(), adConnectUnspecified);if (adStateOpen & pConnection->GetState())
pConnection->put_CursorLocation (adUseServer);
微软的各种db访问 我都比较蛋疼.
我游戏用过ado, odbc类 但始终偶尔有问题.不知是否他的bug.
有时 简单的查询,我干脆做成web 页去请求.
只是,我的这个数据集的获得,不是通过sql语句执行返回得来的,而通过打开表(sql语句是表名,open最后参数设置的是adCmdTable)的方式,我想问的是:这样来获取数据集,背后不会查数据库吧?它和通过selec*语句获取的数据集有什么不同呢?
您好,你通过Select *的方式返回数据集,这会查询表吧,万一表有很多数据,会不会很耗时,返回的数据集会不会很大,如此,会不会暴内存?求解。
只是,我的这个数据集的获得,不是通过sql语句执行返回得来的,而通过打开表(sql语句是表名,open最后参数设置的是adCmdTable)的方式,我想问的是:这样来获取数据集,背后不会查数据库吧?它和通过selec*语句获取的数据集有什么不同呢?
我只用过sql语句的方式,因为这个方式是跨平台的,要不然以后你的程序移植到非windows环境下你咋办?
这样的意思是返回某条记录的所有字段