之前一直没有接触过VC,现在手头上调试一个用C++写的程序要连接数据库,用的是oracle9I的数据库客户端。
         _ConnectionPtr pMyConnect=NULL;
_variant_t vtEmpty;
_bstr_t bstrCommand;
CString sQueryCommand;
_variant_t var; int iCount; _RecordsetPtr m_pRecordset; 
m_pRecordset.CreateInstance(__uuidof(Recordset)); HRESULT hr=pMyConnect.CreateInstance(__uuidof(Connection));
if(FAILED(hr))
{
return -1;
}
_bstr_t strConnect="Provider=OraOLEDB.Oracle;DSN=uscmfgdb; uid=uscyr_user; pwd=useryr;";
//_bstr_t strConnect="Provider=MSDAORA;DSN=uscmfgdb; uid=uscyr_admin@uscmfgdb; pwd=adminuscyr;";//for test data
//connecting to the database server now:
sQueryCommand="select count(*) cnt from uscyr_admin.bin_desc where program_name='";
sQueryCommand+=sProgram;
sQueryCommand+="' and program_version='";
sQueryCommand+=sVersion;
sQueryCommand+="'";
bstrCommand=sQueryCommand;
iCount=-1;
try
{
pMyConnect->Open(strConnect,"","",NULL);
m_pRecordset->Open(bstrCommand, pMyConnect.GetInterfacePtr(), adOpenDynamic,adLockOptimistic, adCmdUnknown);
if(!m_pRecordset->EndOfFile)
{
var = m_pRecordset->GetCollect("cnt");
iCount=var.dblVal;
}
m_pRecordset->Close();
pMyConnect->Close();
}
catch (_com_error &e)
{
// AfxMessageBox(e.ErrorMessage());
_bstr_t aa=e.Description();
//_bstr_t aa=e.ErrorMessage();
CString sc=" ";
sc.Format("%s",FileName + "\n" +(LPCTSTR)aa+"\n");
WriteLog("text.txt",sc);
        Result=1;
return false;
}在头文件中我发现之前写这个程序的老人用的是
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
和现在在网上找到的ADO连接的代码似是非是,同时在用这种代码连接数据库时,有时正常,有时在执行pMyConnect->Open(strConnect,"","",NULL);会返回
TNS-12560: TNS:protocol adapter error和TNS-12542: TNS:address already in use这两种错误交替出现,在执行插入命令的时候也会出现同样的问题bool CWaferSortDB::bInsertWaferSortBin(int &Result)
{
_ConnectionPtr pMyConnect=NULL;
_variant_t vtEmpty;
_bstr_t bstrCommand;
CString InsertCommand;
_variant_t var; _RecordsetPtr m_pRecordset; 
m_pRecordset.CreateInstance(__uuidof(Recordset));// _bstr_t strConnect="Provider=MSDAORA;DSN=uscmfgdb; uid=uscyr_user; pwd=useryr;";
    _bstr_t strConnect="Provider=MSDAORA;DSN=uscmfgdb; uid=uscyr_admin@uscmfgdb; pwd=adminuscyr;";//test for databace
InsertCommand="insert into uscyr_admin.wafer_bin_info values('";
InsertCommand+=sLot;
InsertCommand+="_";
InsertCommand+=sWafer;
InsertCommand+="',";
InsertCommand+=ssBin;
InsertCommand+=",";
InsertCommand+=shBin;
InsertCommand+=",";
InsertCommand+=sCount;
InsertCommand+=")";
Result=0;
try
{
HRESULT hr=pMyConnect.CreateInstance(__uuidof(Connection));
if(FAILED(hr))
{
// AfxMessageBox("Connect fail");
Result=1;
return false;
}
pMyConnect->Open(strConnect,"","",NULL);
bstrCommand=InsertCommand;
pMyConnect->Execute(bstrCommand,&vtEmpty, adCmdUnknown);
pMyConnect->Close();
}
catch (_com_error &e)
{
_bstr_t aa=e.Description();
CString sc=" ";
sc.Format("%s",FileName + "\n" +(LPCTSTR)aa+"\n");
if (MessageCount==0)
{
mailInfo.sendMail(FileName + "\n" + InsertCommand+"\n"+sc);
}
WriteLog("text.txt",sc);
Result=1;
// AfxMessageBox(InsertCommand);
return false;
}
return true;
}
从网上的资料来看,这两段代码我没发现任何问题,自己机器的配置和正在运行这个程序的服务器配置基本相同,网上的方法基本上都试过了,都没能成功,希望有大牛帮忙提点。

解决方案 »

  1.   

    非代码级的问题,应该是配置级的问题。建议你查询下Oracle错误文档列表偶查到:ORA-12560 的错误。
    一般是监听没有起来造成的。首先在CMD下lsnrctl status 看看监听的状态。
    如果监听是正常的,那么排查实例是否是启动的状态。
    如果实例也是正常启动的状态,那么很有可能是SID设置的不正确,与你实例的SID不一致造成的。
    Oracle收费的,有问题直接客服,钱不是白交的啊
      

  2.   

    侦听程序好象是listen.exe,你看看是不是侦听程序没运行,或者IP地址被什么程序占用了,但不是一直占用,时而占用时而释放IP
      

  3.   

    很明显,这个是你的ora配置问题,跟代码没关系,换个地址看看