我是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();
但我不知道错误是什么,因为我在插件中工作:(
答案 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
的文档似乎SAString
和string
是不相关的类型。 SACommand
是一个MFC样式字符串,它要求您访问底层缓冲区以将其用作string
类型对象。
如果将SAChar类型定义为常规字符,则可以执行类似
的操作string s1 = cmd.Field("org_doc").AsString().GetBuffer(min_length);