大家好!
  
    我利用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提示:>导入数据库完毕!");

解决方案 »

  1.   

    注释掉imp语句,在导入环境上手工执行imp会有问题吗?
      

  2.   

    我找到导致的原因了
    //导入
    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、待看看远程导入执行语句。
      

  3.   

    自己整理出来了答案:http://www.cnblogs.com/doublesnke/archive/2011/07/19/2110328.html