char и String в c ++ - PullRequest
       5

char и String в c ++

1 голос
/ 04 июля 2011

Я 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 ]

4 голосов
/ 04 июля 2011

Помимо всего прочего, это не правильный C ++.Это некоторая смесь кода C и C ++.

Если вы просто замените элементы char* на правильные std::string s, вы устраните целый ряд проблем (например, ошибочное распределение буферов char).

То есть ваш первый шаг должен состоять в том, чтобы полностью исключить char* и new из вашего кода и использовать вместо него std::string и автоматическое хранение.

1 голос
/ 04 июля 2011

Строки sql выглядят подозрительно, не должно ли это быть

select * from pdf where rownum<3

Фактическая команда sql может вернуть таблицу с нулевыми столбцами, что приведет к ошибке, если вы попытаетесь получить доступ к полю org_doc (которого в этом случае не будет).

0 голосов
/ 04 июля 2011

Взглянув на документы для SACommand, кажется, SAString и string не связаны между собой. SACommand - это строка в стиле MFC, требующая доступа к базовому буферу для использования его в качестве объекта типа string.

Если тип SAChar определен как обычный символ, вы можете сделать что-то вроде

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