日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2024/4/24 数据库 96 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C/C++10】天气APP:MySQL/PostgreSQL,环境变量/动静态库,Linux/Oracle字符集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1.MySQL:decimal,find . .-print
  • 2.PostgreSQL:$
  • 3.環境變量:tnsnames.ora,curl
    • 3.1 對單一用戶生效: .bash_profile是oracle安裝解壓縮好的文件,一般要自己配置
    • 3.2 對所有用戶有效:不在同一網段內稱遠程,與數據庫連接也是tcp連接和ssh連服務器一樣
  • 4.動靜態庫:.a,指定.so,LD_
    • 4.1 源代碼組織:公用的自定義函數和類從主程序中分離出來:函數和類的聲明在頭文件中,定義在程序文件中,主程序中要包含頭文件,編譯時要和程序文件一起編譯
    • 4.2 靜態庫:鏈接庫的文件名是libpublic.a,但鏈接庫名是”public”,不是“libpublic.a”
    • 4.3 動態庫:動態庫發生改變,程序不需要重新編譯,所以動態庫升級比較方便
  • 5.Linux中文字符集:/etc/locale.conf
  • 6.Oracle的字符集:NLS_LANG
    • 6.1 服務端的字符集:Oracle數據庫實例創建后,如果沒有開始業務運行,可修改字符集,如果已經業務化運行,不建議修改字符集,會造成數據中的漢字亂碼
    • 6.2 客戶端的字符集:Linux/Windows
  • 7. linux文件編碼轉換:iconv,enca


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 -WallCFLAGS = -g -Wno-write-strings all: createtable inserttable selecttable updatetable deletetable createtable: createtable.cpp _mysql.h _mysql.cppg++ $(CFLAGS) -o createtable createtable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lcinserttable: inserttable.cpp _mysql.h _mysql.cppg++ $(CFLAGS) -o inserttable inserttable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lcselecttable: selecttable.cpp _mysql.h _mysql.cppg++ $(CFLAGS) -o selecttable selecttable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lcupdatetable: updatetable.cpp _mysql.h _mysql.cppg++ $(CFLAGS) -o updatetable updatetable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lcdeletetable: deletetable.cpp _mysql.h _mysql.cppg++ $(CFLAGS) -o deletetable deletetable.cpp $(MYSQLINCL) $(MYSQLLIB) $(MYSQLLIBS) _mysql.cpp -lm -lcclean: 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無小數的bigintchar name[31]; // 商品名稱,用char對應mysql的varchar,注意,表中字段的長度是30,char定義的長度是31,要留C語言的結束符double sal; // 商品價格,用double數據類型對應mysql有小數的decimalchar 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無小數的bigintchar name[31]; // 商品名稱,用char對應mysql的varchar,注意,表中字段的長度是30,char定義的長度是31,要留C語言的結束符double sal; // 商品價格,用double數據類型對應mysql有小數的decimalchar 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到5iminid=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-stringsall: createtable inserttable selecttable updatetable deletetablecreatetable: createtable.cpp _postgresql.h _postgresql.cppg++ $(CFLAGS) -o createtable createtable.cpp _postgresql.cpp $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lcinserttable: inserttable.cpp _postgresql.h _postgresql.cppg++ $(CFLAGS) -o inserttable inserttable.cpp _postgresql.cpp $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lcselecttable: selecttable.cpp _postgresql.h _postgresql.cppg++ $(CFLAGS) -o selecttable selecttable.cpp _postgresql.cpp $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lcupdatetable: updatetable.cpp _postgresql.h _postgresql.cppg++ $(CFLAGS) -o updatetable updatetable.cpp _postgresql.cpp $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lcdeletetable: deletetable.cpp _postgresql.h _postgresql.cppg++ $(CFLAGS) -o deletetable deletetable.cpp _postgresql.cpp $(PGINCL) $(PGLIB) $(PGLIBS) -lm -lcclean: 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","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 int,\name varchar(30),\sal numeric(8,2),\btime timestamp,\memo text,\pic bytea)");// 執行SQL語句,一定要判斷返回值,0-成功,其它-失敗。if (stmt.execute() != 0){printf("stmt.execute() failed.\n%s\n%s\n",stmt.m_sql,stmt.m_cda.message); return -1;}// 提交事務,注意,在postgresql數據庫中,創建表也要提交事務,但刪除表卻不用,奇怪conn.commitwork();printf("create table goods ok.\n");return 0; } // 本程序演示向商品表中插入10條記錄inserttable.cpp #include "_postgresql.h" // 定義用于操作數據的結構,與表中的字段對應 struct st_GOODS {long id; // 商品編號,用long數據類型對應postgresql無小數的intchar name[31]; // 商品名稱,用char對應postgresql的varchar,注意,表中字段的長度是30,char定義的長度是31,要留C語言的結束符double sal; // 商品價格,用double數據類型對應postgresql有小數的numericchar btime[20]; // 入庫時間,用char對應postgresql的timestamp,格式可以在SQL語句中指定,本程序將指定為'yyyy-mm-dd hh24:mi:ss' } stgoods;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","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)\values(:1,:2,:3,to_timestamp(:4,'yyyy-mm-dd hh24:mi:ss'))");// 為SQL語句綁定輸入變量的地址stmt.bindin(1,&stgoods.id);stmt.bindin(2, stgoods.name,30);stmt.bindin(3,&stgoods.sal);stmt.bindin(4, stgoods.btime,19);// 模擬商品數據,向表中插入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("id=%d\n",stgoods.id);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.commitwork();return 0; } // 本程序演示更新商品表中數據updatetable.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","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,不需要判斷返回值。如下to_data會把后面日期丟了,換為to_timestampstmt.prepare("\update goods set btime=to_date(:1,'yyyy-mm-dd hh24:mi:ss') 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.commitwork();return 0; } // 本程序演示從商品表中查詢數據selecttable.cpp #include "_postgresql.h" // 定義用于操作數據的結構,與表中的字段對應 struct st_GOODS { long id; // 商品編號,用long數據類型對應postgresql無小數的intchar name[31]; // 商品名稱,用char對應postgresql的varchar,注意,表中字段的長度是30,char定義的長度是31,要留C語言的結束符double sal; // 商品價格,用double數據類型對應postgresql有小數的numericchar btime[20]; // 入庫時間,用char對應postgresql的timestamp,格式可以在SQL語句中指定,本程序將指定為'yyyy-mm-dd hh24:mi:ss' } stgoods;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","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,to_char(btime,'yyyy-mm-dd hh24:mi:ss')\from goods where id>:1 and id<:2");// 為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到5,執行一次查詢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; } // 本程序演示刪除商品表中數據deletetable.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","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到5iminid=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.commitwork();return 0; }

3.環境變量:tnsnames.ora,curl

/etc/profile,/etc/bashrc 是系統全局環境變量設定。~/.profile, ~/.bashrc用戶家目錄下的私有環境變量設定。
用bash調用腳本的時候會創建一個和自己一模一樣的shell子進程來執行這個外部命令。這個子進程中設置了自己的運行的環境變量。而在此時,父進程的環境變量并沒有改變。bash test.sh == ./test.sh。

用source來執行腳本的時候,不會創建子進程,而是在父進程中直接執行。所以當需要程序修改當前shell本身的環境變量的時候,使用source命令。source test.sh == . test.sh。加載運行config配置文件用source命令配置主進程環境信息。如下記住ebe,從大到小。

上面就是改變linux的env的三種方法,每個用戶env都不一樣,env中HOME為用戶主目錄。

export在命令行單獨輸入是臨時的(export…,env可查到多出了剛export的,但用戶登出再登錄,env查看沒有剛export的)。但在.bash_profile中都含有export,用戶一登錄就執行.bash_profile,所以env中含有這些環境變量,這樣export可視為永久。


本地(客戶端)連虛擬機顯示本地局域網ip(cmd中ifconfig查看)。

本地(客戶端)連互聯網顯示本地出口ip(cmd中curl ipinfo.io查看)。

所有可執行程序都要PATH指定,如ls,pwd(也是可執行程序)不加./(./是在當前目錄執行),因為在冒號分隔(冒號不是連接)的幾個目錄下找。sqlplus命令行命令在/oracle/bin中,PATH在env中可查看。

ls這個可執行程序就是在bin目錄下,上面PATH已指定。如下若未改為英文顯示:未找到命令(中文)。

3.1 對單一用戶生效: .bash_profile是oracle安裝解壓縮好的文件,一般要自己配置

如下必須在用戶主目錄/oracle,才能vi .bash_profile。


3.2 對所有用戶有效:不在同一網段內稱遠程,與數據庫連接也是tcp連接和ssh連服務器一樣



/etc/profile 是文件(里面有不建議在這文件里修改的英文說明), /etc/profile.d/ 是目錄(如下新建.sh文件創建全局環境變量)。

如下在sss.sh中寫入下行。

不想要什么變量直接刪除 /etc/profile.d/ 下對應的shell 腳本即可,當用戶重新登錄shell如下或source /etc/profile 時會觸發。

在/etc/profile這個文件中有這么一段shell:for i in /etc/profile.d/*.sh;,會在每次啟動時自動加載profile.d目錄中每個配置。

如上tnsnames.ora是配置oracle數據庫連接參數,snorcl11g_198是客戶端配置的網絡服務名不是實例名。su - oracle切換用戶相當于用oracle登錄(會執行.bash_profile文件)有oracle的環境變量,su oracle不會改變原來環境變量(不調用環境,只是權限切換)。crontab -e不會有shell環境變量,有與數據庫相關的C程序需和環境變量相關不能放入crontab -e調度。oracle用戶目錄下有home和base,home/bin里有一些應用程序命令sqlplus,dbstart。base/oradata/snorcl11g/數據文件。

4.動靜態庫:.a,指定.so,LD_

4.1 源代碼組織:公用的自定義函數和類從主程序中分離出來:函數和類的聲明在頭文件中,定義在程序文件中,主程序中要包含頭文件,編譯時要和程序文件一起編譯

// public.h #ifndef PUBLIC_H #define PUBLIC_H 1 #include <stdio.h> void func(); // 自定義函數的聲明 #endif // public.cpp #include "public.h" // 包含自定義函數聲明的頭文件 void func() // 自定義函數的實現 {printf("我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。\n"); } // book265.cpp #include "public.h" // 把public.h頭文件包含進來 int main() {func(); } g++ -o book265 book265.cpp public.cpp ./book265 我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。

公用函數庫的public.cpp是源代碼,對任何人可見,實際開發出于技術保密,開發者并不希望提供公用函數庫源代碼。C/C++提供了一個保證代碼安全性方法,把公共程序文件public.cpp編譯成庫(庫分為靜態庫與動態庫)。庫是一種可執行代碼的二進制形式,可以與其它的源程序一起編譯,也可以被操作系統載入內存執行。

4.2 靜態庫:鏈接庫的文件名是libpublic.a,但鏈接庫名是”public”,不是“libpublic.a”

如下優點是在編譯后的可執行程序可以獨立運行,因為所使用的函數都已經被編譯進去了。缺點如果所使用的靜態庫發生更新改變,我們的程序必須重新編譯,靜態庫文件名的命名方式是“libxxx.a”。

gcc -c -o libpublic.a public.cpp

使用靜態庫的方法一,直接把調用者源代碼和靜態庫文件名一起編譯:

g++ -o book265 book265.cpp libpublic.a

使用靜態庫的方法二,采用L參數指定靜態庫文件的目錄,-l參數指定靜態庫名:

g++ -o book265 book265.cpp -L/home/w/demo -lpublic ./book265 我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。

如果要指定多個靜態庫文件的目錄,用法是“-L/目錄1 -L目錄2 -L目錄3”;如果要指定多個靜態庫,用法是“-l庫名1 -l庫名2 -l庫名3”。

4.3 動態庫:動態庫發生改變,程序不需要重新編譯,所以動態庫升級比較方便

g++ -fPIC -shared -o libpublic.so public.cpp

使用動態庫的方法與使用靜態庫的方法相同。如果在動態庫文件和靜態庫文件同時存在,優先使用動態庫編譯:

g++ -o book265 book265.cpp -L/home/w/demo -lpublic

執行程序./book265時,出現以下提示:/book265: error while loading shared libraries: libpublic.so: cannot open shared object file: No such file or directory,因為采用了動態鏈接庫的可執行程序在運行時需要指定動態庫文件的目錄,Linux系統中采用LD_LIBRARY_PATH環境變量指定動態庫文件的目錄。采用以下命令設置LD_LIBRARY_PATH環境變量。

export LD_LIBRARY_PATH=/home/w/demo:.

注意:如果要指定多個動態庫文件的目錄,用法是“export LD_LIBRARY_PATH=目錄1:目錄2:目錄3:.”,目錄之間用半角的冒號分隔,最后的圓點指當前目錄。接下來修改動態庫中func函數的代碼:

printf("我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。\n");

改為

printf("生活美好如鮮花,不懂享受是傻瓜;\n"); printf("傻呀傻呀傻呀傻,比不上小鳥和烏鴉。\n"); printf("芳草地啊美如畫,誰要不去是傻瓜;\n"); printf("我是一只傻傻鳥,獨在枯枝丫上趴。\n");

重新編譯動態庫,無需重新編譯book265,直接執行程序

g++ -fPIC -shared -o libpublic.so public.cpp ./book265 生活美好如鮮花,不懂享受是傻瓜; 傻呀傻呀傻呀傻,比不上小鳥和烏鴉。 芳草地啊美如畫,誰要不去是傻瓜; 我是一只傻傻鳥,獨在枯枝丫上趴。

5.Linux中文字符集:/etc/locale.conf

1、查看當前系統已安裝的字符集
(1)locale命令用于查看當前系統全部的已安裝的字符集,Linux支持的符集約800種:
locale -a
(2)查看已安裝的中文字符集(只查看中國大陸的,不包括香港和臺灣):
locale -a|grep zh_CN,下圖表示已經安裝了中文字符集。

2.安裝中文字符集
如果您的Linux系統沒有安裝中文字符集,可以用yum命令安裝。安裝中文字符集軟件包的方法比較多,沒找到準確的說法,所以把多種方法都寫了進來,以下命令都可以執行,不會有副作用:
yum -y groupinstall chinese-support
yum -y install chinese-support
yum -y install kde-l10n-Chinese
yum -y install ibus-table-chinese-1.4.6-3.el7.noarch
安裝后,執行locale -a|grep zh_CN,如果顯示的內容如下,表示安裝成功。

3.修改字符集配置文件
CentOS6.x字符集配置文件在/etc/sysconfig/i18n文件中。
CentOS7.x字符集配置文件在/etc/locale.conf文件中,內容如下:

執行以下命令或者重啟系統使修改生效:
CentOS6.x:source /etc/sysconfig/i18n
CentOS7.x:source /etc/locale.conf

4.centos7修改 /etc/locale.conf 不生效
centos7的語言環境變量是通過/etc/profile.d/lang.sh加載locale.conf來設置的。我在修改 /etc/locale.conf 內容為 LANG=“zh_CN.UTF-8” 并重啟后發現并沒有什么效果。local得出的依然是默認的en_US。于是我去檢查lang.sh的代碼。發現中間有一段是這樣的:

可以看到,當變量為zh*的時候,依然將LANG賦值為en_US.UTF-8。不知道官方為什么會采用這種默認設置,所以我將代碼改成這樣。重啟之后,再次查看locale,就好了。

6.Oracle的字符集:NLS_LANG

6.1 服務端的字符集:Oracle數據庫實例創建后,如果沒有開始業務運行,可修改字符集,如果已經業務化運行,不建議修改字符集,會造成數據中的漢字亂碼

1.查看服務端字符集
執行以下SQL可以查看服務端的字符集:
select * from NLS_DATABASE_PARAMETERS where parameter like ‘%CHARACTERSET%’;

執行以下SQL也可以查看服務端的字符集:
select userenv(‘language’) from dual;

2.修改服務端字符集
用DBA權限,執行以下步驟修改Oracle數據庫的字符集(例如修改為ZHS16GBK)。
(1)修改服務端操作系統的NLS_LANG環境變量:
export NLS_LANG=‘Simplified Chinese_China.ZHS16GBK’
(2)關閉Oracle數據庫:
shutdown immediate;
(3)把數據庫啟動到mount狀態:
startup mount;
(4)把數據庫改為restricted模式:
alter system enable restricted session;
alter system set job_queue_processes=0;
alter system set aq_tm_processes=0;
(5)打開數據庫:
alter database open;
(6)修改數據庫的字符集。
alter database character set internal_use ZHS16GBK;
(7)重啟數據庫:
shutdown immediate;
startup;

6.2 客戶端的字符集:Linux/Windows

1.Linux環境
Oracle客戶端的字符集必須與服務端相同,否則中文會出現亂碼,客戶端的字符集由NLS_LANG環境變量控制。
(1)查看NLS_LANG環境變量。
env|grep NLS_LANG

(2)設置環境變量
修改環境變量參數文件(系統或用戶的profile文件)。
export NLS_LANG=‘Simplified Chinese_China.ZHS16GBK’

2.Windows環境
打開注冊表( 執行regedit.exe)
HKEY_LOCAL_MACHINE -> SOFTWARE -> ORACLE -> KEY_OraClient11g_home1

7. linux文件編碼轉換:iconv,enca

第一種:iconv命令用于文件編碼的轉換,碰到gbk編碼的文件,需要轉換成utf8,直接使用該命令即可。iconv --list :列出iconv支持的編碼列表。iconv -f 原編碼 -t 新編碼 filename -o newfile。
-f : from 來源編碼
-t : to 轉換后新編碼
-c: 忽略無效字符
-s: --silent,忽略警告
-o file : 可選,沒有的話直接轉換當前文件, 使用-o 保留源文件

第二種:linux安裝enca,多文件轉編碼:

enca -v //源碼安裝,root用戶 wget http://dl.cihar.com/enca/enca-1.13.tar.gz tar -zxvf enca-1.13.tar.gz cd enca-1.13 //根據REAMDE說明依次執行如下命令 ./configure make make check make install // which enca 得知enca默認安裝路徑 /usr/local/bin/目錄,默認頭文件位置/usr/local/include //查看configure可執行文件幫助文檔,可不執行 //./configure -h //在執行./configure時可配置安裝目錄,可不執行 //./configure --prefix=/usr/bin enca -L zh_CN filename //或 enca filename enca `ls` //查看本目錄下文件編碼格式 enca -L zh_CN -x UTF-8 filename //或enca -x UTF-8 filename,enca -x GB2312 filename enca -x utf-8 * // 該目錄下所有文件,一般只有gbk,gb2312在linux中不顯示中文亂碼(終端,linux,數據庫)

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【C/C++10】天气APP:MySQL/PostgreSQL,环境变量/动静态库,Linux/Oracle字符集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。