用下面的代码能成功连接SQL2000,但是连接Oracle出现问题
请大家帮忙看下,谢谢////////// DBTestDlg.cpp
BOOL CDBTestDlg::OnInitDialog()
{
    if(!AfxOleInit())  
{   
AfxMessageBox("OLE初始化出错!");   
return   FALSE;   
}
}////////// stdafx.h
//引入SQLO安装目录下的ADO库文件
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
////////// DBControl.cpp
//Variant类型转换成CString类型
CString CDBControl::VariantToCString(VARIANT var)
{
CString   strValue;  //返回值 
_variant_t   var_t;   
_bstr_t   bst_t;   
time_t   cur_time;   
CTime   time_value;   
COleCurrency   var_currency;   
switch(var.vt)   
{   
case   VT_EMPTY:   
strValue=_T("");   
break;   
case   VT_UI1:   
strValue.Format("%d",var.bVal);   
break;   
case   VT_I2:   
strValue.Format("%d",var.iVal);   
break;   
case   VT_I4:   
strValue.Format("%d",var.lVal);   
break;   
case   VT_R4:   
strValue.Format("%f",var.fltVal);   
break;   
case   VT_R8:   
strValue.Format("%f",var.dblVal);   
break;   
case   VT_CY:   
var_currency=var;   
strValue=var_currency.Format(0);   
break;   
case   VT_BSTR:   
var_t=var;   
bst_t=var_t;   
strValue.Format   ("%s",(const   char*)bst_t);   
break;   
case   VT_NULL:   
strValue=_T("");   
break;   
case   VT_DATE:   
cur_time   =   (long)var.date;   
time_value=cur_time;   
strValue=time_value.Format("%A,%B%d,%Y");   
break;   
case   VT_BOOL:   
strValue.Format("%d",var.boolVal   );   
break;   
default:     
strValue=_T(""); //默认值  
break;   
}   
return   strValue; 
}//获取当前目录
CString CDBControl::GetModuleDir()
{
char pFileName[256];
GetModuleFileName( NULL, pFileName, 255 );

CString csFullPath(pFileName);
int nPos = csFullPath.ReverseFind( _T('\\') );
if( nPos < 0 )
return CString("");
else
return csFullPath.Left( nPos );
}//读配置文件,初始化数据库连接字符串
void CDBControl::ReadIni()
{
    CString retVal;
    CString iniPath;
    iniPath =  GetModuleDir();
    iniPath.Insert(iniPath.GetLength(),"\\config.ini"); 
    GetPrivateProfileString("DB参数设置","服务器名","Default",strServer.GetBuffer(0),MAX_PATH,iniPath);
    GetPrivateProfileString("DB参数设置","数据库名","Default",strDataBase.GetBuffer(1),MAX_PATH,iniPath);    GetPrivateProfileString("DB参数设置","用户名","Default",strUserName.GetBuffer(2),MAX_PATH,iniPath);
    GetPrivateProfileString("DB参数设置","密码","Default",strPassword.GetBuffer(3),MAX_PATH,iniPath);
    retVal.Format("Driver=SQL Server;Server=%s;Database=%s;UID=%s;PWD=%s",strServer,strDataBase,strUserName,strPassword);
    strConn = retVal; 
}//获取待TTS转换数据
BOOL CDBControl::mySQLQuery(TTSDATA_2CONVERT* TTSInfo)
{
ReadIni();
        BOOL retFlg = FALSE;

try
{
if(FAILED(pPtr.CreateInstance("ADODB.Recordset")))   
{   
retFlg = FALSE;
            return retFlg; 
}   

//数据库连接字符串
        CString  strSRC;      
strSRC=strConn;

//查询语句
CString strSQL = "select username,sendid,content from VOI_SendSound where content is not null and switchflag=0 and rownum<=100 and sendtime<sysdate";   
_variant_t   varSRC(strSRC);   
_variant_t   varSQL(strSQL);   

//stdafx.h 引入SQLO安装目录下的ADO库文件
//#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF") 
//打开Oracle数据库失败!!!
//SQL2000能正常打开
if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))   
{   
retFlg= FALSE;
pPtr.Release();   
return  retFlg;   
}   

int itemLen = 0; //记录个数
while(!pPtr->GetadoEOF())   
{   
_variant_t   varSENDID;    //SENDID
_variant_t   varUSERNAME;  //USERNAME  
_variant_t   varCONTENT;   //CONTENT varSENDID   = pPtr->GetCollect("SENDID");   
varUSERNAME = pPtr->GetCollect("USERNAME"); 
varCONTENT =   pPtr->GetCollect("CONTENT");  

CString  strSENDID   = (char *)_bstr_t(varSENDID); 
CString  strUSERNAME = VariantToCString(varUSERNAME);
CString  strCONTENT =   (char *)_bstr_t(varCONTENT); 
             
strSENDID.TrimLeft();
strSENDID.TrimRight();
                        strUSERNAME.TrimLeft();
strUSERNAME.TrimRight();
                        strCONTENT.TrimLeft();
strCONTENT.TrimRight();

//给结构体变量赋值
strcpy(TTSInfo->sendid[itemLen],strSENDID);      
strcpy(TTSInfo->username[itemLen],strUSERNAME);  
strcpy(TTSInfo->content[itemLen],strCONTENT);  

retFlg = TRUE; 
pPtr->MoveNext();  
}   

//关闭数据库连接,释放资源
pPtr->Close();   
pPtr.Release(); 
}
catch (CException* e)
{
retFlg = FALSE;
return retFlg;
}

return retFlg;
}

解决方案 »

  1.   

    //执行到打开数据库的时候出现错误:        if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText)))   
            {   
                retFlg= FALSE;
                pPtr.Release();   
                return  retFlg;   
            }  
      

  2.   

    先把你的sql语句在oracle执行通过后再说。
      

  3.   

    我确定SQL没有问题,
    数据库连接字符串是全局变量,
    在SQL2000下加了行代码
    #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
    在ORACLE下是否要修改?
      

  4.   

    http://hi.csdn.net/attachment/201009/14/7815987_1284435656AI5I.gif
      

  5.   

    Oracle数据库连接字符串(经典大全)【转】2010-03-24 09:52ODBC新版本Driver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;
    旧版本Driver={Microsoft ODBC Driver for Oracle};ConnectString=OracleServer.world;Uid=myUsername;Pwd=myPassword;
    OLE DB, OleDbConnection (.NET)
    标准连接此连接字符串适用了微软的驱动。
    Provider=msdaora;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;
    受信连接Provider=msdaora;Data Source=MyOracleDB;Persist Security Info=False;Integrated Security=Yes;标准连接由Oracle提供的驱动。
    Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;受信连接Provider=OraOLEDB.Oracle;Data Source=MyOracleDB;OSAuthent=1;Oracle.DataAccess.Client.OracleConnection
    Data Source=TORCL;User Id=myUsername;Password=myPassword;
    标准安全连接
    Data Source=TORCL;Integrated Security=SSPI;
    使用ODP.NET而不使用tnsnames.oraData Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;
    OracleConnection, Oracle Data Provider, ODP.NET, System.Data.OracleClient.OracleConnection标准Data Source=MyOracleDB;Integrated Security=yes;用于8i RC3及以后的版本
    指定用户名和密码Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;Integrated Security=no;
    用于8i RC3及以后的版本 忽略tnsnames.ora另一种不需要使用DSN的连接方式。
    SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));uid=myUsername;pwd=myPassword;
    使用上面的连接字符串可能会导致Visual Studio报告错误,如果您在使用中出现了这些问题,请使用下面的这种连接方式。
    Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyHost)(PORT=MyPort))(CONNECT_DATA=(SERVICE_NAME=MyOracleSID)));User Id=myUsername;Password=myPassword;
    使用连接池如果连接池服务程序找不到已经存在的连接池,它将根据连接字符串创建一个新的池,否则将循环使用池中已存在的连接。
    Data Source=myOracleDB;User Id=myUsername;Password=myPassword;Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;Incr Pool Size=5;Decr Pool Size=2;
    Windows身份验证Data Source=myOracleDB;User Id=/;
    特权连接使用SYSDBAData Source=myOracleDB;User Id=SYS;Password=SYS;DBA Privilege=SYSDBA;
    特权连接使用SYSOPERData Source=myOracleDB;User Id=SYS;Password=SYS;DBA Privilege=SYSOPER;复制密码过期处理过程当使用一个连接字符串连接数据库后,出现“密码已过期”的错误时,请执行OpenWithNewPassword命令来提供新密码。Data Source=myOracleDB;User Id=myUsername;Password=myPassword; oConn.OpenWithNewPassword(sTheNewPassword); 
    Proxy验证Data Source=myOracleDB;User Id=myUsername;Password=myPassword;Proxy User Id=pUserId;Proxy Password=pPassword;
    Core Labs OraDirect (.NET)User ID=myUsername;Password=myPassword;Host=ora;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;
    MS Data ShapeProvider=MSDataShape.1;Persist Security Info=False;Data Provider=MSDAORA;Data Source=orac;User Id=myUsername;Password=myPassword;参考:http://www.connectionstrings.com/oracle#p19
     
      

  6.   

    你的连接字符串.....Data Source=IP;Persist Security Info=True;UserID=system;Unicode=True;password=manager"; 
      

  7.   

    首先, 这不是直接用OLE DB方式连数据库,而是ADO通过OLE DB驱动连数据库,
    其次,连接数据库的字符串是不同的,去查连ORACLE的字符串。