2011-07-04 64 views
1

我是Java开发人员,但我必须用C++开发应用程序。C++中的字符和字符串

我只是想读取数据库中的一些数据,并将其设置在此:

struct Line{ 
    char* pdf1; 
    char* pdf2; 
    char* ident; 
    char* reportpath ; 
}; 

,我有这样的方法:

void DBConnect() 
{ 
    char* pdf1; 
    char* pdf2; 
    SAConnection con; 
    lines=0; 
    page[lines] = new Line(); 

    SACommand cmd(&con,"select from pdf where rownum<3 "); 
    try 
    { 
     // connect to database (Oracle in our example) 
     con.Connect("DB", "user", "password", SA_Oracle_Client); 
     // Select from our test table 
     cmd.Execute(); 
     // fetch results row by row and print results 
     page[lines]->pdf1="PDF_CM"; 
     page[lines]->pdf2="PDF_LATEST"; 
     lines++; 

     char *c1=new char(CELLSIZE); 
     char *c2=new char(CELLSIZE); 
     while(cmd.FetchNext()) 
     { 
      page[lines] = new Line(); 
      string s1=cmd.Field("org_doc").asString(); 
      string s2=cmd.Field("rev_doc").asString(); 
      size_t t1=s1.find("text1"); 
      size_t t2=s2.find("text1"); 
      s1.replace(t1,std::string("text1").length(),"text2"); 
       s2.replace(t2,std::string("text1").length(),"text2"); 
      c1=new char(s1.size()+1); 
      c2=new char(s2.size()+1); 
      std::copy(s1.begin(), s1.end(), c1); 
      std::copy(s2.begin(), s2.end(), c2); 
      c1[s1.size()]='\0'; 
      c2[s2.size()]='\0'; 


      page[lines]->pdf1 =c1; 
      page[lines]->pdf2 =c2; 
      s1.erase(); 
      s2.erase(); 
      ++lines; 

     } 
     con.Commit(); 
     con.Disconnect(); 
    } 
    catch(SAException &x) 
    { 
     try 
     { 
      con.Rollback(); 
     } 
     catch(SAException &) 
     { 
     } 
     printf("%s\n", (const char*)x.ErrText()); 
    } 
} 

我在第二个得到一个错误,而循环INT这行:

string s1=cmd.Field("org_doc").asString(); 

但我不知道是什么错误,因为我在工作的插件:(

+0

和错误是...? –

+0

'new char(CELLSIZE)'no –

回答

1

的SQL字符串看起来很可疑,应该不会是

select * from pdf where rownum<3 

实际的SQL命令可能会返回零列的表,这将导致一个错误,如果你试图访问现场org_doc(其中止跌在这种情况下不存在)。

4

除了一切之外,这不是合适的C++。这是C和C++代码的混合。

如果您只需将char*成员替换为正确的std::string,您将消除大量问题(例如,您错误地分配了char缓冲区)。

也就是说,您的第一步应该是从您的代码中完全删除char*new,然后使用std::string和自动存储。

0

看着SACommand的文档看起来SAStringstring是不相关的类型。 SACommand是一种MFC风格的字符串,它需要您访问底层缓冲区才能将其用作string类型的对象。

如果查尔类型被定义为一个普通字符,你可以做类似

string s1 = cmd.Field("org_doc").AsString().GetBuffer(min_length);