大家好!
我利用ADO去连接Oracle数据库,本地导入没问题,可是远程导入另一台电脑就出错。
错误提示: IMP-00003:遇到ORACLE 错误959
ORA-00959:表空间‘TABLESPACE01’不存在
IMP-00017:由于ORACLE错误959,一下语句失败:
在另一台电脑中也找到了有TABLESPACE01表存在!以下关键代码:
//变量_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordset; //记录集对象
//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;
}
//远程连接Oracle
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); if(!m_adolinkoracle.OpneConnect(lpszConnect,m_userName,m_password))
{//连接失败!
return ;
}
//创建表和表空间
CString str;
str.Format("create tablespace %s datafile '%s' size 2m reuse autoExtend on next 2M maxsize 10000m",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 profile DEFAULT",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);
system(str);
m_list.AddString("<Ado提示:>导入数据库完毕!");
我利用ADO去连接Oracle数据库,本地导入没问题,可是远程导入另一台电脑就出错。
错误提示: IMP-00003:遇到ORACLE 错误959
ORA-00959:表空间‘TABLESPACE01’不存在
IMP-00017:由于ORACLE错误959,一下语句失败:
在另一台电脑中也找到了有TABLESPACE01表存在!以下关键代码:
//变量_ConnectionPtr m_pConnection; //连接对象
_RecordsetPtr m_pRecordset; //记录集对象
//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;
}
//远程连接Oracle
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); if(!m_adolinkoracle.OpneConnect(lpszConnect,m_userName,m_password))
{//连接失败!
return ;
}
//创建表和表空间
CString str;
str.Format("create tablespace %s datafile '%s' size 2m reuse autoExtend on next 2M maxsize 10000m",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 profile DEFAULT",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);
system(str);
m_list.AddString("<Ado提示:>导入数据库完毕!");
//导入
CString str;
str.Format("imp userid= %s/%s full=y file=%s ignore=y",m_info_name,m_info_password,m_info_table);
system(str);
m_list.AddString("<Ado提示:>导入数据库完毕!");1、这里每次都在导入本地 ,而发现本地并有创建这个表和表空间所以才报错的。
2、我刚开始以为本地和远程只有连接时的差别,其实导入也是有差别的。
3、待看看远程导入执行语句。