用下面的代码能成功连接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;
}
请大家帮忙看下,谢谢////////// 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;
}
{
retFlg= FALSE;
pPtr.Release();
return retFlg;
}
数据库连接字符串是全局变量,
在SQL2000下加了行代码
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
在ORACLE下是否要修改?
旧版本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
其次,连接数据库的字符串是不同的,去查连ORACLE的字符串。