【任务要求】
1、利用ADO本地/远程连接Oracle(Oracle10g)
2、创建表和表空间
3、为表创建用户并且分配权限
4、进行本地/远程导入(imp)操作(*.dmp)
【准备事项】
服务器电脑设置(远程导入的电脑)配置设置
1、查看服务器电脑IP和数据库端口
2、开启监控服务lsnrctl——start
3、修改连接模式为共享模式(关键,否则远程连接不上)
本地设置远程连接服务名:
a、添加点击服务命名
b、设置网络服务名
c、设置远程导入电脑IP地址和端口(查看ip地址:cmd / ipconfig )
d、测试远程服务器是否畅通
进入到cmd后,执行命令:tnsping TEST_ORCL
代码实现:
_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordset; //记录集对象
//本地连接
::CoInitialize(NULL);//初始化com组件
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->CursorLocation=adUseClient;
CString lpszConnect;
//远程连接字串设置
lpszConnect.Format("Provider=OraOLEDB.Oracle.1;Persist Security Info=True;\
Data Source=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =\
(PROTOCOL = TCP)(HOST =%s)\
(PORT = %s)))\
(CONNECT_DATA =(SERVICE_NAME = %s)))",m_szIpAddress,m_szPort,m_source); //远程连接命令行:IP地址、端口号、数据库名
//本地连接字串设置
lpszConnect.Format("Provider=OraOLEDB.Oracle;User ID=%s;Password=%s;Data Source=%s",m_userName,m_password,m_source);//用户system 密码sys Data Source 全局数据名
try
{
myFunc("<提示:>正在打开数据库连接中...",dlg);
m_pConnection->Open(_bstr_t(lpszConnect),_bstr_t(username),_bstr_t(password),adConnectUnspecified);
}
catch(_com_error e)
{
CString err;
err.Format("<提示:>连接错误!\r\n错误信息:%s:",e.ErrorMessage());
myFunc(err,dlg);
//AfxMessageBox(err);
return false;
}
//创建表和表空间
CString str;
str.Format("create tablespace %s logging datafile '%s'size 32m autoextend on next 32m maxsize 2048m extent management local",m_strTableName,m_strtableKJ);//表空间名和表空间的物理文件
if (m_adolinkoracle.OpenRecordset(str))
m_nSel = m_list.AddString("<Ado提示:>创建成功!");
else
m_nSel = m_list.AddString("<Ado提示:>创建失败!");
//为表创建用户
CString str;
//创建临时表空间
str.Format("create user %s identified by %s default tablespace %s temporary tablespace TEMP",m_info_name,m_info_password,m_strTableName);//用户名 密码 表空间名
if (m_adolinkoracle.OpenRecordset(str))
m_list.AddString("<Ado提示:>创建用户成功!");
else
{
m_nSel = m_list.AddString("<Ado提示:>创建用户失败!");
m_list.SetCurSel(m_nSel);
return ;
}
//为用户分配权限
m_list.AddString("<Ado提示:>为用户分配权限!");
str.Format("grant connect to %s",m_info_name);
m_adolinkoracle.OpenRecordset(str);
str.Format("grant dba to %s",m_info_name);
m_adolinkoracle.OpenRecordset(str);
str.Format("grant alter any table to %s",m_info_name);
m_adolinkoracle.OpenRecordset(str);
str.Format("grant select any table to %s",m_info_name);
m_adolinkoracle.OpenRecordset(str);
str.Format("grant unlimited tablespace to %s",m_info_name);
m_adolinkoracle.OpenRecordset(str);
m_nSel = m_list.AddString("<Ado提示:>分配完毕!");
m_list.SetCurSel(m_nSel);
//导入
//本地导入
CString str;
str.Format("imp userid= %s/%s full=y file=%s ignore=y",m_info_name,m_info_password,m_info_table);//用户 密码 *.dmp
str.Format("imp userid= %s/%s@%s full=y file=%s ignore=y",m_info_name,m_info_password,m_fuwuming,m_info_table);//用户 密码 服务名 *.dmp
stsytem(str);//执行导入
m_adolinkoracle 为 CUserAdoLinkOracle类的一个对象
CUserAdoLinkOracle类的设计:
#ifndef ADO_LINK_ORACLE_H
#define ADO_LINK_ORACLE_H
#endif
class CUserAdoLinkOracle
{
typedef void(*callbackfunc)(CString str,LPVOID lparam); //定义回调函数类型
LPVOID dlg;
callbackfunc myFunc; //回调函数对象
public:
_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordset; //记录集对象
bool m_IsConnectSuccess;//连接是否成功
bool m_IsOpenRecordset; //是否打开记录集
CString m_strConnString; //数据库连接字符串
CString m_strErrMsg; //保存错误信息
//////////////////////////////////////////////////////////////////////////
//类的实现
//
CUserAdoLinkOracle()
{//构造函数
m_IsConnectSuccess= false;
m_IsOpenRecordset=false;
}
void InitData(callbackfunc pFunc,LPVOID lparam) //赋值回调函数
{
myFunc = pFunc;
dlg = lparam;
myFunc("<提示:>初始化完毕!",dlg);
}
bool OpneConnect(CString lpszConnect,CString username,CString password)//连接数据库
{
::CoInitialize(NULL);//初始化com组件
//AfxOleInit();
//CString lpszConnect;
//
//lpszConnect.Format("Provider=OraOLEDB.Oracle;User ID=%s;Password=%s;Data Source=%s",username,password,source);
//lpszConnect="Provider=OraOLEDB.Oracle;User ID=system;Password=sys;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1,122)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))";
//char * lpszConnect="Provider=OraOLEDB.Oracle;User ID=system;Password=sys;Data Source=orcl"; //标准安全级别
//char * lpszConnect="Provider=MSDAORA.1;User ID=system;Password=hope;Data Source=192.168.0.223;Persist Security Info=false";// 微软格式
//lpszConnect="Provider=OraOLEDB.Oracle;Persist Security Info=false;Data Source=192.168.1,102";// 微软格式参数
//lpszConnect="Provider=MSDAORA.1;User ID=system;Password=sys;Data Source=192.168.1,102;Persist Security Info=false";// 信任链接
//lpszConnect="Provider=MSDAORA.1;OSAuthent=1;Data Source=192.168.0.122;Persist Security Info=false";// 信任链接 2
// char * lpszConnect="DSN=KUANMEITEMP";
//char * lpszConnect="driver={SQL Server};Server=222.195.150.228;DATABASE=Testonimsitoph;Uid=cw;Pwd=1234";
//char * username="system";
//char * password="sys";
long loptions=adConnectUnspecified;
CoInitialize(NULL);
//hr = m_pConnection.CreateInstance("ADODB.Connection")
m_pConnection.CreateInstance("ADODB.Connection");
m_pConnection->CursorLocation=adUseClient;
try
{
myFunc("<提示:>正在打开数据库连接中...",dlg);
m_pConnection->Open(_bstr_t(lpszConnect),_bstr_t(username),_bstr_t(password),adConnectUnspecified);
}
catch(_com_error e)
{
CString err;
err.Format("<提示:>连接错误!\r\n错误信息:%s:",e.ErrorMessage());
myFunc(err,dlg);
//AfxMessageBox(err);
return false;
}
m_IsConnectSuccess= true; //数据库连接成功
myFunc("<提示:>数据库连接成功",dlg);
//AfxMessageBox("连接成功!");
return true;
}
//SQL语句执行函数
bool OpenRecordset(CString sql)
{
myFunc("<提示:>执行Oracle命令中...",dlg);
ASSERT(!sql.IsEmpty()); //SQL语句不能为空
try
{
m_pRecordset.CreateInstance(__uuidof(Recordset)); //创建记录集对象实例
m_pRecordset->Open(_bstr_t(sql), m_pConnection.GetInterfacePtr(),
adOpenDynamic, adLockOptimistic, adCmdText); //执行SQL得到记录集
}
catch(_com_error e) //捕获可能的异常
{
CString str;
str.Format("<提示:>执行Oracle命令时出现错误,错误原因:%s",e.ErrorMessage());
myFunc(str,dlg);
return false;
}
myFunc("<提示:>执行Oracle命令成功",dlg);
m_IsOpenRecordset = true;
return true;
}
void CloseRecordset()
{
myFunc("<提示:>记录集关闭",dlg);
if(m_pRecordset->GetState() == adStateOpen) //判断当前的记录集状态
m_pRecordset->Close(); //关闭记录集
m_IsOpenRecordset = false;
}
void CloseConn()
{
myFunc("<提示:>数据库关闭",dlg);
m_pConnection->Close(); //关闭数据库连接
::CoUninitialize(); //释放COM环境
m_IsConnectSuccess = false; //数据库关闭
}
};