数据库项目实战中的一些细节

  • 在结构体中,都用字符串表示,因为整数,浮点数不能表示为NULL;
  • 在表中,浮点数据都用int类型表示,例如:1.25元,在数据库中,应表示为125分。
  1. /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);
        }   
      }   

 

posted @ 2022-11-08 19:11  从前有个羊羊羊  阅读(71)  评论(0)    收藏  举报