C/C++10天气APP:MySQL,PostgreSQL,环境变量,动静态库,Linux/Oracle字符集

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++10天气APP:MySQL,PostgreSQL,环境变量,动静态库,Linux/Oracle字符集相关的知识,希望对你有一定的参考价值。


1.mysql:decimal,find . .-print

如下是centos6安装mysql。

如下select…from user是查看用户字典。

如下赋予所有的权限允许所有主机远程访问。客户端Navicat Premium可访问mysql数据库链接:链接:https://pan.baidu.com/s/1otzYSvY5d08IZ5S5J-Tkzw 提取码:leof 。

service iptables stop再telnet 192…3306。



oracle字段说明文字放外面,mysql字段说明文字放create table里面。mysql本身自增列字段意义不大,没有序列生成器但可模拟出:https://www.runoob.com/mysql/mysql-using-sequences.html。如下修改mysql字符集,大写P指端口,小写p指密码。

以下在本地虚拟机中修改mysql字符集,如下最后一行是自己添加的。

如下封装MySQL访问接口。

# mysql头文件存放路径
MYSQLINCL = -I/usr/include/mysql

# mysql库文件保存路径
MYSQLLIB = -L/usr/lib64/mysql

# mysql链接库
MYSQLLIBS = -lmysqlclient

#CFLAGS = -O2
CFLAGS = -O2 -Wall

CFLAGS = -g -Wno-write-strings 

all:	createtable inserttable selecttable updatetable deletetable 

createtable: createtable.cpp _mysql.h _mysql.cpp
	g++ $(CFLAGS) -o createtable createtable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lc

inserttable: inserttable.cpp _mysql.h _mysql.cpp
	g++ $(CFLAGS) -o inserttable inserttable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lc

selecttable: selecttable.cpp _mysql.h _mysql.cpp
	g++ $(CFLAGS) -o selecttable selecttable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lc

updatetable: updatetable.cpp _mysql.h _mysql.cpp
	g++ $(CFLAGS) -o updatetable updatetable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lc

deletetable: deletetable.cpp _mysql.h _mysql.cpp
	g++ $(CFLAGS) -o deletetable deletetable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lc

clean:	
	rm -rf createtable inserttable selecttable updatetable deletetable

make后./createtable


oracle用to_date,mysql用str_to_data如下

// 本程序演示创建一个表,用于存放商品信息createtable.cpp
#include "_mysql.h"
int main(int argc,char *argv[])

  // 数据库连接池
  connection conn;
  
  // 连接数据库,返回值0-成功,其它-失败
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中。
  if (conn.connecttodb("127.0.0.1,root,123qweASD!@#,mysql,3306","gbk") != 0)
  
    printf("connect database failed.\\n%s\\n",conn.m_cda.message); return -1;
  

  // SQL语言操作类
  sqlstatement stmt(&conn);

  // 准备创建表的SQL,商品表:商品编号id,商品名称name,价格sal
  // 入库时间btime,商品说明memo,商品图片pic
  // prepare方法不需要判断返回值
  stmt.prepare("\\
    create table goods(id    bigint(10),\\
                       name  varchar(30),\\
                       sal   decimal(8,2),\\
                       btime datetime,\\
                       memo  longtext,\\
                       pic   longblob,\\
                       primary key (id))");

  // 执行SQL语句,一定要判断返回值,0-成功,其它-失败。
  if (stmt.execute() != 0)
  
    printf("stmt.execute() failed.\\n%s\\n%s\\n",stmt.m_sql,stmt.m_cda.message); return -1;
  

  printf("create table goods ok.\\n");

  return 0;

// 本程序演示向商品表中插入10条记录inserttable.cpp
#include "_mysql.h"

// 定义用于操作数据的结构,与表中的字段对应
struct st_GOODS

  long id;          // 商品编号,用long数据类型对应mysql无小数的bigint
  char name[31];    // 商品名称,用char对应mysql的varchar,注意,表中字段的长度是30,char定义的长度是31,要留C语言的结束符
  double sal;       // 商品价格,用double数据类型对应mysql有小数的decimal
  char btime[20];   // 入库时间,用char对应mysql的datetime,格式可以在SQL语句中指定,本程序将指定为'%%Y-%%m-%%d %%h:%%i:%%s'
  char t[15];
 stgoods;

int main(int argc,char *argv[])

  // 数据库连接池
  connection conn;
  
  // 连接数据库,返回值0-成功,其它-失败
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中。
  if (conn.connecttodb("127.0.0.1,root,123qweASD!@#,mysql,3306","gbk") != 0)
  
    printf("connect database failed.\\n%s\\n",conn.m_cda.message); return -1;
  
  
  // SQL语言操作类
  sqlstatement stmt(&conn);
  
  // 准备插入数据的SQL,不需要判断返回值
  stmt.prepare("\\
    insert into goods(id,name,sal,btime,t) \\
                values(:1,:2,:3,str_to_date(:4,'%%Y-%%m-%%d %%h:%%i:%%s'),to_null(:5))");
  // 为SQL语句绑定输入变量的地址
  stmt.bindin(1,&stgoods.id);
  stmt.bindin(2, stgoods.name,30);
  stmt.bindin(3,&stgoods.sal);
  stmt.bindin(4, stgoods.btime,19);
  stmt.bindin(5, stgoods.t,10);

  // 模拟商品数据,向表中插入10条测试信息
  for (int ii=1;ii<=10;ii++)
  
    // 结构体变量初始化
    memset(&stgoods,0,sizeof(stgoods));

    // 为结构体的变量指定值
    stgoods.id=ii;
    sprintf(stgoods.name,"商品名称%02d",ii);
    stgoods.sal=ii*2.11;
    strcpy(stgoods.btime,"2018-03-01 12:25:31");

    // 每次指定变量的值后,执行SQL语句,一定要判断返回值,0-成功,其它-失败。
    if (stmt.execute() != 0)
    
      printf("stmt.execute() failed.\\n%s\\n%s\\n",stmt.m_sql,stmt.m_cda.message); return -1;
    

    printf("insert ok(id=%d).\\n",ii);
  

  printf("insert table goods ok.\\n");

  // 提交数据库事务
  conn.commit();

  return 0;

// 本程序演示从商品表中查询数据selecttable.cpp
#include "_mysql.h"
// 定义用于查询数据的结构,与表中的字段对应
struct st_GOODS

  long id;          // 商品编号,用long数据类型对应mysql无小数的bigint
  char name[31];    // 商品名称,用char对应mysql的varchar,注意,表中字段的长度是30,char定义的长度是31,要留C语言的结束符
  double sal;       // 商品价格,用double数据类型对应mysql有小数的decimal
  char btime[20];   // 入库时间,用char对应mysql的datetime,格式可以在SQL语句中指定,本程序将指定为'%%Y-%%m-%%d %%h:%%i:%%s'
 stgoods;

int main(int argc,char *argv[])

  // 数据库连接池
  connection conn;
  
  // 连接数据库,返回值0-成功,其它-失败
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中。
  if (conn.connecttodb("127.0.0.1,root,123qweASD!@#,mysql,3306","gbk") != 0)
  
    printf("connect database failed.\\n%s\\n",conn.m_cda.message); return -1;
  
  
  // SQL语言操作类
  sqlstatement stmt(&conn);

  int iminid,imaxid;

  // 准备查询数据的SQL,不需要判断返回值
  stmt.prepare("\\
    select id,name,sal,date_format(btime,'%%Y-%%m-%%d %%h:%%i:%%s')\\
      from goods where id>? and id<?");
  // 为SQL语句绑定输入变量的地址
  stmt.bindin(1,&iminid);
  stmt.bindin(2,&imaxid);

  // 为SQL语句绑定输出变量的地址
  stmt.bindout(1,&stgoods.id);
  stmt.bindout(2, stgoods.name,30);
  stmt.bindout(3,&stgoods.sal);
  stmt.bindout(4, stgoods.btime,19);

  // 手工指定id的范围为1到8,执行一次查询
  iminid=1;
  imaxid=8;

  // 执行SQL语句,一定要判断返回值,0-成功,其它-失败。
  if (stmt.execute() != 0)
  
    printf("stmt.execute() failed.\\n%s\\n%s\\n",stmt.m_sql,stmt.m_cda.message); return -1;
  

  while (1)
  
    // 先把结构体变量初始化,然后才获取记录
    memset(&stgoods,0,sizeof(stgoods));

    // 获取一条记录,一定要判断返回值,0-成功,其它-无记录
    if (stmt.next() !=0) break;
    
    // 把获取到的记录的值打印出来
    printf("id=%ld,name=%s,sal=%.02f,btime=%s\\n",stgoods.id,stgoods.name,stgoods.sal,stgoods.btime);
  

  // 请注意,stmt.m_cda.rpc变量非常重要,它保存了SQL被执行后影响的记录数。
  printf("本次查询了goods表%ld条记录。\\n",stmt.m_cda.rpc);
  
  return 0;

// 本程序演示更新商品表中数据updatetable.cpp
#include "_mysql.h"
int main(int argc,char *argv[])

  // 数据库连接池
  connection conn;
  
  // 连接数据库,返回值0-成功,其它-失败
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中。
  if (conn.connecttodb("127.0.0.1,root,123qweASD!@#,mysql,3306","gbk") != 0)
  
    printf("connect database failed.\\n%s\\n",conn.m_cda.message); return -1;
  
   
  // SQL语言操作类
  sqlstatement stmt(&conn);

  int iminid,imaxid;
  char strbtime[20];

  // 准备更新数据的SQL,不需要判断返回值
  stmt.prepare("\\
    update goods set btime=str_to_date(:1,'%%Y-%%m-%%d %%h:%%i:%%s') where id>:2 and id<:3");
  // 为SQL语句绑定输入变量的地址
  stmt.bindin(1, strbtime,19);
  stmt.bindin(2,&iminid);
  stmt.bindin(3,&imaxid);

  // 手工指定id的范围为1到5,btime为2017-12-20 09:45:30,执行一次更新
  iminid=1;
  imaxid=5;
  memset(strbtime,0,sizeof(strbtime));
  strcpy(strbtime,"2017-12-20 09:45:30");

  // 执行SQL语句,一定要判断返回值,0-成功,其它-失败。
  if (stmt.execute() != 0)
  
    printf("stmt.execute() failed.\\n%s\\n%s\\n",stmt.m_sql,stmt.m_cda.message); return -1;
  

  // 请注意,stmt.m_cda.rpc变量非常重要,它保存了SQL被执行后影响的记录数。
  printf("本次更新了goods表%ld条记录。\\n",stmt.m_cda.rpc);

  // 提交事务
  conn.commit();

  return 0;

// 本程序演示删除商品表中数据deletetable.cpp
#include "_mysql.h"
int main(int argc,char *argv[])

  // 数据库连接池
  connection conn;
  
  // 连接数据库,返回值0-成功,其它-失败
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中。
  if (conn.connecttodb("127.0.0.1,root,123qweASD!@#,mysql,3306","gbk") != 0)
  
    printf("connect database failed.\\n%s\\n",conn.m_cda.message); return -1;
  
  
  // SQL语言操作类
  sqlstatement stmt(&conn);

  int iminid,imaxid;

  // 准备删除数据的SQL,不需要判断返回值
  stmt.prepare("delete from goods where id>:1 and id<:2");
  // 为SQL语句绑定输入变量的地址
  stmt.bindin(1,&iminid);
  stmt.bindin(2,&imaxid);

  // 手工指定id的范围为1到5
  iminid=1;
  imaxid=5;

  // 执行SQL语句,一定要判断返回值,0-成功,其它-失败。
  if (stmt.execute() != 0)
  
    printf("stmt.execute() failed.\\n%s\\n%s\\n",stmt.m_sql,stmt.m_cda.message); return -1;
  
  // 请注意,stmt.m_cda.rpc变量非常重要,它保存了SQL被执行后影响的记录数。
  printf("本次从goods表中删除了%ld条记录。\\n",stmt.m_cda.rpc); 
  // 提交事务
  conn.commit();
  return 0;

以下在mysql中,mysql区分空值和null值(空值不占空间,null值占空间)。如下指定c1数字型字段不是char字符串字段,如果数字遇到空值(不是null值)解析到结构体里,程序bindin插入自动转为0,所以只能在程序里拼成sql效率低。

以下在oracle中,希望字段为空或数字变量的话,一般会用空的字符串去绑定bindin表的字段。这种方法在mysql中不行。

2.PostgreSQL:$

centos7安装:https://blog.csdn.net/zll_0405/article/details/81197633。


如上设置好字符集,如下启动pg数据库,切换到pg用户并登录。

如下windows客户端连接数据库,如下修改pg_hba.conf放开对客户端ip限制并重启服务端。

PostgreSQL数据类型和序列生成器。



以下在oracle中不允许。

以下在pg中允许。

如下regclass表示第二列不管。不需要用表的触发器得到序列值,序列生成器就行。

# postgresql头文件存放路径
PGINCL = -I/usr/include

# postgresql库文件保存路径
PGLIB = -L/usr/lib64

# postgresql链接库
PGLIBS = -lpq

#CFLAGS = -O2
CFLAGS = -O2 -Wall
#CFLAGS = -g -Wall
CFLAGS = -g -Wno-write-strings

all:	createtable inserttable selecttable updatetable deletetable

createtable: createtable.cpp _postgresql.h _postgresql.cpp
	g++ $(CFLAGS) -o createtable createtable.cpp _postgresql.cpp  $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lc

inserttable: inserttable.cpp _postgresql.h _postgresql.cpp
	g++ $(CFLAGS) -o inserttable inserttable.cpp _postgresql.cpp  $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lc

selecttable: selecttable.cpp _postgresql.h _postgresql.cpp
	g++ $(CFLAGS) -o selecttable selecttable.cpp _postgresql.cpp  $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lc

updatetable: updatetable.cpp _postgresql.h _postgresql.cpp
	g++ $(CFLAGS) -o updatetable updatetable.cpp _postgresql.cpp  $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lc

deletetable: deletetable.cpp _postgresql.h _postgresql.cpp
	g++ $(CFLAGS) -o deletetable deletetable.cpp _postgresql.cpp  $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lc

clean:	
	rm createtable inserttable selecttable updatetable deletetable
// 本程序演示创建一个表,用于存放商品信息createtable.cpp
#include "_postgresql.h"
int main(int argc,char *argv[])

  // 数据库连接池
  connection conn;

  // 连接数据库,返回值0-成功,其它-失败
  // 失败代码在conn.m_cda.rc中,失败描述在conn.m_cda.message中。
  if (conn.connecttodb("host=118.89.50.198 user=postgres password=pwdidc dbname=postgres port=5432",

以上是关于C/C++10天气APP:MySQL,PostgreSQL,环境变量,动静态库,Linux/Oracle字符集的主要内容,如果未能解决你的问题,请参考以下文章

C/C++8天气APP:Oracle数据库安装,表操作,C语言操作Oracle数据库

C/C++12天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)

C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性

C/C++14天气APP:文件传输系统(tcpput/getfile.cpp客户端,tcpfileserver.cpp)

C/C++11天气APP:txt/xml文件处理入库(psurfdata.cpp,_shqx.h),数据结构设计(PowerDesigner)

C/C++13天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)