- 在结构体中,都用字符串表示,因为整数,浮点数不能表示为NULL;
- 在表中,浮点数据都用int类型表示,例如:1.25元,在数据库中,应表示为125分。
-
/project/idc1/c/obtmindtodb2.cpp
![]()
- CDir和CFile的共同使用
-
if (Dir.OpenDir(pathname,"*.xml")==false)
while (true)
{
// 读取目录,得到一个数据文件名。
if (Dir.ReadDir()==false) break;
。
。
if (File.Open(Dir.m_FullFileName,"r")==false)
//读取一个文件里的每一行数据。(以<endl/>结尾)
while (true)
{
if (File.FFGETS(strBuffer,1000,"<endl/>")==false) break;
}
}
- 数据的拼接和分割
GetXMLBuffer(strBuffer,"t",tmp,10); if (strlen(tmp)>0)
//右往左
snprintf(stzhobtmind.t,10,"%d",(int)(atof(tmp)*10));
//左往右
GetXMLBuffer(strBuffer,"obtid",stzhobtmind.obtid,10);
2./project /public/db/mysql/selecttable
sqlstatement stmt(&conn); // 操作SQL语句的对象。
int iminid,imaxid; // 查询条件最小和最大的id。
// 准备查询表的SQL语句。
stmt.prepare("\
select id,name,weight,date_format(btime,'%%Y-%%m-%%d %%H:%%i:%%s') from girls where id>=:1 and id<=:2");
/*
注意事项:
1、如果SQL语句的主体没有改变,只需要prepare()一次就可以了;
2、结果集中的字段,调用bindout()绑定变量的地址;
3、bindout()方法的返回值固定为0,不用判断返回值;
4、如果SQL语句的主体已改变,prepare()后,需重新用bindout()绑定变量;
5、调用execute()方法执行SQL语句,然后再循环调用next()方法获取结果集中的记录;
6、每调用一次next()方法,从结果集中获取一条记录,字段内容保存在已绑定的变量中。
*/
// 为SQL语句绑定输入变量的地址,bindin方法不需要判断返回值。
stmt.bindin(1,&iminid);
stmt.bindin(2,&imaxid);
// 为SQL语句绑定输出变量的地址,bindout方法不需要判断返回值。 默认第一列输出为1,第二列为2....
stmt.bindout(1,&stgirls.id);
stmt.bindout(2, stgirls.name,30);
stmt.bindout(3,&stgirls.weight);
stmt.bindout(4, stgirls.btime,19);
iminid=1; // 指定待查询记录的最小id的值。
imaxid=3; // 指定待查询记录的最大id的值。
// 执行SQL语句,一定要判断返回值,0-成功,其它-失败。
// 失败代码在stmt.m_cda.rc中,失败描述在stmt.m_cda.message中。
if (stmt.execute() != 0)
{
printf("stmt.execute() failed.\n%s\n%s\n",stmt.m_sql,stmt.m_cda.message); return -1;
}
// 本程序执行的是查询语句,执行stmt.execute()后,将会在数据库的缓冲区中产生一个结果集。
while (true)
{
memset(&stgirls,0,sizeof(struct st_girls)); // 结构体变量初始化。
// 从结果集中获取一条记录,一定要判断返回值,0-成功,1403-无记录,其它-失败。
// 在实际开发中,除了0和1403,其它的情况极少出现。
if (stmt.next()!=0) break;
// 把获取到的记录的值打印出来。
printf("id=%ld,name=%s,weight=%.02f,btime=%s\n",stgirls.id,stgirls.name,stgirls.weight,stgirls.btime);
}
// 请注意,stmt.m_cda.rpc变量非常重要,它保存了SQL被执行后影响的记录数。
printf("本次查询了girls表%ld条记录。\n",stmt.m_cda.rpc);
if (stmt.execute()!=0)
{
// 1、失败的情况有哪些?是否全部的失败都要写日志?
// 答:失败的原因主要有二:一是记录重复,二是数据内容非法。
// 2、如果失败了怎么办?程序是否需要继续?是否rollback?是否返回false?
// 答:如果失败的原因是数据内容非法,记录日志后继续;如果是记录重复,不必记录日志,且继续。
if (stmt.m_cda.rc!=1062)
{
logfile.Write("Buffer=%s\n",strBuffer);
logfile.Write("stmt.execute() failed.\n%s\n%s\n",stmt.m_sql,stmt.m_cda.message);
}
}