c ++中的char和String

时间:2011-07-04 12:07:12

标签: c++ database string oracle char

我是Java开发人员,但我必须用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());
    }
}

我在第二行while循环中得到一个错误:

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

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

3 个答案:

答案 0 :(得分:4)

除了其他一切,这不是正确的C ++。它是C和C ++代码的混合。

如果您只是用适当的char*替换std::string成员,您将消除许多问题(例如,您错误地分配了char缓冲区)。

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

答案 1 :(得分:1)

sql字符串看起来很可疑,不应该是

select * from pdf where rownum<3

如果您尝试访问字段org_doc(在这种情况下不会出现),实际的sql命令可能会返回一个列为零的表,这会导致错误。

答案 2 :(得分:0)

浏览SACommand的文档似乎SAStringstring是不相关的类型。 SACommand是一个MFC样式字符串,它要求您访问底层缓冲区以将其用作string类型对象。

如果将SAChar类型定义为常规字符,则可以执行类似

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