本文目錄一覽:
- 1、如何在vs2010中添加mysql 5.1數據庫 api方法
- 2、mysql 官方文檔和api的區別
- 3、用C語言如何對MySQL數據庫進行操作
- 4、mysql的C API編程
- 5、mysql怎麼打開啊?
如何在vs2010中添加mysql 5.1數據庫 api方法
通過MySQL自定義的API函數進行連接
1、使用API的方式連接,需要加載mysql的頭文件和lib文件。
在VS2010的附加包含目錄中添加\MySQL\MySQL Server 5.1\include。在安裝MySql的目錄下找。 把libmysql.dll和libmysql.lib文件拷貝到所建的工程目錄下。然後在頭文件里包含以下內容:
//mysql所需的頭文件和庫文件
#include “winsock.h”
#include “mysql.h”
#pragma comment(lib,”libmySQL.lib”)
2、進行編碼
(1)連接mysql數據庫
頭文件里定義數據源指針 MYSQL m_sqlCon;
//連接MySql數據庫
try
{
mysql_init(m_sqlCon);
// localhost:服務器 root為賬號密碼 test為數據庫名 3306為端口
if(!mysql_real_connect(m_sqlCon, “localhost”,”root”,”root”,”test”,3306,NULL,0))
{
AfxMessageBox(_T(“數據庫連接失敗!”));
return FALSE;
}
return TRUE;
}
catch (…)
{
return FALSE;
}
(2)關閉數據庫
mysql_close(m_sqlCon);
(3)創建表
char* pQuery = “create table if not exists DS_Building( ID VARCHAR(10),Name VARCHAR(255),Descs VARCHAR(255),PRIMARY KEY (ID))”
if(mysql_real_query(m_sqlCon,pQuery,(UINT)strlen(pQuery))!=0)
{
const char* pCh = mysql_error(m_sqlCon);
return FALSE;
}
附MySQL的API接口:
mysql_affected_rows() 返回被最新的UPDATE, DELETE或INSERT查詢影響的行數。
mysql_close() 關閉一個服務器連接。
mysql_connect() 連接一個MySQL服務器。該函數不推薦;使用mysql_real_connect()代替。
mysql_change_user() 改變在一個打開的連接上的用戶和數據庫。
mysql_create_db() 創建一個數據庫。該函數不推薦;而使用SQL命令CREATE DATABASE。
mysql_data_seek() 在一個查詢結果集合中搜尋一任意行。
mysql_debug() 用給定字符串做一個DBUG_PUSH。
mysql_drop_db() 拋棄一個數據庫。該函數不推薦;而使用SQL命令DROP DATABASE。
mysql_dump_debug_info() 讓服務器將調試信息寫入日誌文件。
mysql_eof() 確定是否已經讀到一個結果集合的最後一行。這功能被反對; mysql_errno()或mysql_error()可以相反被使用。
mysql_errno() 返回最近被調用的MySQL函數的出錯編號。
mysql_error() 返回最近被調用的MySQL函數的出錯消息。
mysql_escape_string() 用在SQL語句中的字符串的轉義特殊字符。
mysql_fetch_field() 返回下一個表字段的類型。
mysql_fetch_field_direct () 返回一個表字段的類型,給出一個字段編號。
mysql_fetch_fields() 返回一個所有字段結構的數組。
mysql_fetch_lengths() 返回當前行中所有列的長度。
mysql_fetch_row() 從結果集合中取得下一行。
mysql_field_seek() 把列光標放在一個指定的列上。
mysql_field_count() 返回最近查詢的結果列的數量。
mysql_field_tell() 返回用於最後一個mysql_fetch_field()的字段光標的位置。
mysql_free_result() 釋放一個結果集合使用的內存。
mysql_get_client_info() 返回客戶版本信息。
mysql_get_host_info() 返回一個描述連接的字符串。
mysql_get_proto_info() 返回連接使用的協議版本。
mysql_get_server_info() 返回服務器版本號。
mysql_info() 返回關於最近執行得查詢的信息。
mysql_init() 獲得或初始化一個MYSQL結構。
mysql_insert_id() 返回有前一個查詢為一個AUTO_INCREMENT列生成的ID。
mysql_kill() 殺死一個給定的線程。
mysql_list_dbs() 返回匹配一個簡單的正則表達式的數據庫名。
mysql_list_fields() 返回匹配一個簡單的正則表達式的列名。
mysql_list_processes() 返回當前服務器線程的一張表。
mysql_list_tables() 返回匹配一個簡單的正則表達式的表名。
mysql_num_fields() 返回一個結果集合重的列的數量。
mysql_num_rows() 返回一個結果集合中的行的數量。
mysql_options() 設置對mysql_connect()的連接選項。
mysql_ping() 檢查對服務器的連接是否正在工作,必要時重新連接。
mysql_query() 執行指定為一個空結尾的字符串的SQL查詢。
mysql_real_connect() 連接一個MySQL服務器。
mysql_real_query() 執行指定為帶計數的字符串的SQL查詢。
mysql_reload() 告訴服務器重裝授權表。
mysql_row_seek() 搜索在結果集合中的行,使用從mysql_row_tell()返回的值。
mysql_row_tell() 返回行光標位置。
mysql_select_db() 連接一個數據庫。
mysql_shutdown() 關掉數據庫服務器。
mysql_stat() 返回作為字符串的服務器狀態。
mysql_store_result() 檢索一個完整的結果集合給客戶。
mysql_thread_id() 返回當前線程的ID。
mysql_use_result() 初始化一個一行一行地結果集合的檢索。
mysql 官方文檔和api的區別
1. MySQL Community Server 社區版本,開源免費,但不提供官方技術支持。
2. MySQL Enterprise Edition 企業版本,需付費,可以試用30天。
3. MySQL Cluster 集群版,開源免費。可將幾個MySQL Server封裝成一個Server。
4. MySQL Cluster CGE 高級集群版,需付費。
用C語言如何對MySQL數據庫進行操作
有時為了性能,我們會直接用C語言來開發相關的模塊,尤其在我們的web應用中,雖然PHP、JSP等腳本均提供了MySQL的接口,但是顯然直接使用C語言具有更好的安全性和性能,Michael以前用PHP開發的多個項目中就使用了C語言編寫的這類接口,然後再編譯到php裡面,供php腳本直接使用,這方面的話題就不多說了,下面主要說一下在Linux下如何用C語言連接MySQL數據庫,並且讀取裡面的數據返回,同時如何進行編譯。if defined(_WIN32) || defined(_WIN64)為了支持windows平台上的編譯#includewindows.h#endif#includestdio.h#includestdlib.h#includemysql.h我的機器上該文件在/usr/local/include/mysql下定義MySQL數據庫操作的宏,也可以不定義留着後面直接寫進代碼defineSELECT_QUERYselectusernamefromtbb_userwhereuserid=%dintmain(intargc,char**argv)char**argv相當於char*argv[]{MYSQL mysql,*sock;定義數據庫連接的句柄,它被用於幾乎所有的MySQL函數MYSQL_RES *res;查詢結果集,結構類型MYSQL_FIELD *fd ;包含字段信息的結構MYSQL_ROW row ;存放一行查詢結果的字符串數組char qbuf[160];存放查詢sql語句字符串if(argc!=2){//檢查輸入參數fprintf(stderr,usage:mysql_selectuserid\n\n);exit(1);}mysql_init(mysql);if(!(sock=mysql_real_connect(mysql,localhost,dbuser,dbpwd,9tmd_bbs_utf8,0,NULL,0))){fprintf(stderr,Couldn’tconnecttoengine!\n%s\n\n,mysql_error(mysql));perror();exit(1);}sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));if(mysql_query(sock,qbuf)){fprintf(stderr,Queryfailed(%s)\n,mysql_error(sock));exit(1);}if(!(res=mysql_store_result(sock))){fprintf(stderr,Couldn’tgetresultfrom%s\n,mysql_error(sock));exit(1);}printf(numberoffieldsreturned:%d\n,mysql_num_fields(res));while(row=mysql_fetch_row(res)){printf(Theruserid#%d’susernameis:%s\n,atoi(argv[1]),(((row[0]==NULL)(!strlen(row[0])))?NULL:row[0]));puts(queryok!\n);}mysql_free_result(res);mysql_close(sock);exit(0);return0;為了兼容大部分的編譯器加入此行}編譯的時候,使用下面的命令gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 後面兩個選項可選,根據您的環境情況運行的時候,執行下面的命令./mysql_select 1將返回如下結果:numberoffieldsreturned:1Theruserid#1’susernameis:Michaelqueryok!上面的代碼我想大部分都能看明白,不明白的可以參考一下MySQL提供的有關C語言API部分文檔源碼天空,各個函數都有詳細說明,有時間我整理一份常用的API說明出來。
mysql的C API編程
MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客戶端中用來設置讀取超時時間的參數。在 MySQL 的官方文檔中,該參數的描述是這樣的:
MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.
也就是說在需要的時候,實際的超時時間會是設定值的 3 倍。但是實際測試後發現實際的超時時間和設置的超時時間一致。
而具體什麼時候發生三倍超時,在文檔中沒有找到。所以對 MySQL 5.7.20 的源碼進行了一些分析。
使用 GDB 調試代碼找了實際與 mysql server 通信的代碼,如下:
其中 vio_read() 函數中,使用 recv 和 poll 來讀取報文和做讀取超時。net_should_retry() 函數只有在發生 EINTR 時才會返回 true。從這段代碼來看是符合測試結果的,並沒有對讀取進行三次重試。只有在讀取操作被系統中斷打斷時才會重試,但是這個重試並沒有次數限制。
從上面代碼的分析可以看出,代碼的邏輯和文檔的描述不符。於是在一頓搜索後,找到了一個 MySQL 的 BUG(Bug #31163)。該 BUG 報告了在 MySQL 5.0 中,MySQL c api 讀取的實際超時時間是設置的三倍,與現有文檔描述相符。於是對 MySQL 5.0.96 的代碼又進行分析。
同樣使用 GDB 找到了通信部分的代碼。這次找到了重試三次的代碼,如下:
這個版本的 MySQL api 的讀寫超時是直接使用的 setsockopt 設置的。第一次循環,在 A 點發生了第一次超時(雖然注釋寫的非阻塞,但是客戶端的連接始終是阻塞模式的)。然後在 B 點將該 socket 設置為阻塞模式,C 點這裡重置 retry 次數。由於設置了 alarm 第二次以後的循環會直接進入 D 點的這個分支,並且判斷循環次數。作為客戶端時net-retry_count 始終是 1,所以重試了兩次,共計進行了 3 次 vioread 後從 E 點退出函數。
由上面的分析可知,MySQL 文檔對於該參數的描述已經過時,現在的 MYSQL_OPT_READ_TIMEOUT 並不會出現三倍超時的問題。而 Bug #31163 中的處理結果也是將文檔中該參數的描述更新為實際讀取超時時間是設定時間的三倍。也許是 MySQL 的維護者們在後續版本更新時忘記更新文檔吧。
mysql怎麼打開啊?
1、 mysql安裝好後,在mysql的安裝目錄中有個bin目錄,裡面有很多客戶端軟件,如果是mysql的客戶端,找到mysql.exe,這個是用於操作數據庫的系統客戶端軟件。
2、 客戶端選擇:一般情況下,我們在學習的時候會通過使用Windows下的控制台進行訪問,即win + R 同時按住打開運行,輸入cmd命令進入控制台,然後進入到mysql的bin目錄(具體可以看一下Windows下控制器切換路徑(百度經驗));或者在開發的時候通常會使用一些集成工具,如Navicat之類。
3、 數據庫操作步驟:學習的時候客戶端和服務端是同時安裝的,都在一台電腦上,但是要理解,mysql的客戶端和服務端通常不會在一台機器上的(服務器在機房,客戶端就在個人電腦上),因此是需要進行一些步驟操作的。(下面以windows下的控制台為例)
① 連接認證:mysql/mysql.exe -h主機地址 -P端口 -u用戶名 -p密碼,其中h可以是ip地址也可以是主機名如-hlocalhost/-h127.0.0.1,本地可以省略;-P(大寫P)是端口,一般mysql是3306,默認可以省略;-u是用戶名,如果沒有匿名賬號,必填;-p(小寫p)是密碼,一般必填,最好是輸入-p後先回車,後輸入密碼(密文輸入密碼,更安全)
② 發送SQL指令,SQL(【百科】結構化查詢語言Structured Query Language結構化查詢語言)是mysql能識別的操作指令,這塊如果想深入學習理解可以參照MySQL的API文檔或者參考黑馬程序員下的6天玩轉MySQL,一般情況下分為幾大類:
DDL:Data Definition Language,數據定義語言,定義結構。如創建數據庫:create database `test` charset utf8;
DML:Data Manipulation Language,數據操作語言,進行數據操作。如增刪改查指令:insert into table values()/delete from table where condition/update table set key = value/select * from table
DCL:Data Controller Language,數據控制語言,進行權限管理。如給用戶授權:grant seletet on *.* to ‘root’@localhost
③ 解析:一般情況下客戶端會自動解析MySQL服務器執行返回的結果不需要我們進行額外操作,但是如果是其他編程語言需要使用MySQL執行的結果,那麼還需要額外的解析(參照黑馬程序員6天玩轉MySQL中的PHP操作mysql)
④ 斷開連接:數據庫用完之後,要養成主動斷開的習慣(被動也可以,但是如果被動沒有斷開,那麼就會“佔線”),mysql的客戶端可以使用\q | quit | exit,任意一個退出
原創文章,作者:BLXX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/132486.html