我是用VC++6.0ADO连接Oracle,今天想实现时间查询,字段里有date类型的Time列,于是我写语句sql=“SELECT * FROM Tablename WHERE TO_CHAR(Time,'yyyy-mm')='2007-03'”,再用m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);却始终得不到查询数据,调试发现在m_pRecordset->adoEOF就报错,意思是没有读到一行数据,但我直接用语句在oracle里查找没点问题,我也试了其他查询时间语句如SELECT * FROM Tablename WHERE Time>TO_DATE('2007-03',‘yyyy-mm'),这些语句直接用在oracle上没问题。本是想传递进一个字符串值来查询,现在却连简单的测试都通过不了,其余用VC查询操作没点问题。请问这是为什么啊,谢谢,我想不是sql语句构造的原因,请详细指教,麻烦各位了,急!谢谢。
或者我不用这个转换函数,那怎么实现查询呢,Time存储的是yyyy-mm-dd hh24:mi:ss的格式,要实现传进去查询按月查询的字符串,如2007-3,请问如何做呢,急!谢谢
在m_pRecordset->adoEOF中跳入
Interface* operator->() const throw(_com_error)
{
if (m_pInterface == NULL) {
_com_issue_error(E_POINTER);
} return m_pInterface;
}
{
m_pRecordset->adoEOF;
}
m_pRecordset是怎么取得的?如果有错误,看一下hr的值。
void CAdoSet::SearchByDate(CString date)
{
//OpenTable("EnergyTable");
CString sql="SELECT * FROM EnergyTable WHERE TO_CHAR(Time,'yyyy-mm')='2007-03'";
Execute(sql);
}bool CAdoSet::Execute(CString sql)
{
try
{
_variant_t RecordsAffected;
m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);//这句返回hr是1
return true;
}
catch(...)
{
AfxMessageBox("不成功");
return false;
}
}
按键响应
CString str,name;
str.Format("%d-%d",m_Year,m_Month);
m_Set.SearchByDate(str);//本是传递进去,现在先没用了
while(!m_Set.IsEOF()) //确实是无效报错的
上面的代码没有定义hr, hr是指: HRESULT hr = S_OK;
Execute函数的返回值应是一个HRESULT类型的值。没有初始化m_Set的代码。事实上,不应该使用Execute函数,而应该使用Recordset的open函数来打开记录集。看看这个例子里ADO Recordset的使用方法:
http://support.microsoft.com/kb/231351/zh-cn
我用open函数来做就直接在这句open报错了,
初始化m_Set就是构造函数,
CAdoSet::CAdoSet()
{
HRESULT hr; try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=OraOLEDB.Oracle;Data Source=gdb;User Id=SYSTEM;Password=manager;","","",adModeUnknown);///连接数据库
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
} }
http://msdn2.microsoft.com/en-us/library/ms677563.aspx
{
m_pRecordset.CreateInstance("ADODB.Recordset");
//OpenTable("HistricEnergyTable");'
CString sql="SELECT * FROM HistrcEnergyTable WHERE AMRTime LIKE '2007-03%";
// m_pRecordset->Open(_variant_t(sql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);
Execute(sql);
}
m_pRecordset = m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);//这句返回hr是1
此时返回一个记录集对象或者使用:
hr = m_pRecordset->Open(_variant_t(sql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);看看hr是什么?