?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

誰有可靠的網賭網站:在MySQL數據庫中使用C執行SQL語句SQL語句

?

與PostgreSQL相似,可應用許多不合的說話來造訪MySQL,包括C、C++、Java和Perl。從下列章節中,Neil Matthew和RichardStones應用詳盡的MySQLC接口向我們先容了若何在MySQL數據庫中履行SQL語句。他們將評論爭論返回數據的語句,例如INSERT以及不返回數據的語句,例如UPDATE和DELETE。然后,他們將編寫從數據庫檢索數據的簡單法度榜樣。

履行SQL語句

現在,我們已經有了一個連接,并且知道若何處置懲罰差錯,是時刻評論爭論應用我們的數據庫來作一些實誰有可靠的網賭網站際事情了。履行所有類型的SQL的主關鍵字是mysql_query:

int mysql_query(MYSQL *connection, const char *query)

正如您所見,它異常簡單。它取一個指向連接布局的指針和包孕要履行的SQL的文本字符串;與敕令行對象不合,將不應用停止分號。成功之后,返回0。在必要包孕二進制數據的特殊環境下,可以應用相關的函數,mysql_real_query。雖然出于本章的目的,我們僅必要評論爭論mysql_query。

不返回數據的SQL語句

我們將先評論爭論UPDATE、DELETE和INSERT語句。由于它們不返回數據,以是更易于應用。

這里我們將先容的另一個緊張函數是反省受影響的行數的函數:

my_ulonglong mysql_affected_rows(MYSQL *connection);

可能關于這一函數的最顯而易見的事便是其非同平常的返回結果。因為可移植性緣故原由,這是一個特殊的無符號類型。為了在printf中應用,建議將其強制轉換成應用%lu款式規范的無符號長整數。這個函數返回受曩昔的UPDATE、INSERT或DELETE查詢影響的行數,這些查詢是應用mysql_query履行的。

平日對付mysql_函數,返回碼0表示沒有行受影響;正數表示實際結果,平日是受影響的行數。

如前所述,當應用mysql_affected_rows時可能呈現未期望的結果。讓我們先評論爭論受INSERT語句影響的行數,它將按預期進行操作。將下列代碼添加到法度榜誰有可靠的網賭網站樣connect2.c 中,并且稱其為insert1.c:

#include

#include

#include

"mysql.h"int main(int argc, char *argv[])

{MYSQL my_connection;

int res;mysql_init(&my_connection);

if (mysql_real_connect(&my_connection, "localhost",

"rick", "bar", "rick", 0, NULL, 0)) {

printf("Connection success\n");

res = mysql_query(&my_connection,

"INSERT INTO children(fname,age),

VALUES('Ann',3)");if (!res)

{printf("Inserted %lu rows\n",

(unsigned long)mysql_affected_rows(&my_connection));

} else {

fprintf(stderr, "Insert error %d: s\n",mysql_errno ,

(&my_connection),

mysql_error(&my_connection));}

mysql_close(&my_connection);} else

{fprintf(stderr, "Connection failed\n");

if (mysql_errno(&my_connection))

{fprintf(stderr, "Connection error

%d: %s\n",mysql_errno(&my_connection),mysql_error&my_connection));

}}

return EXIT_SUCCESS;}

正如預期,插入的行數為1。

現在,我們變動代碼,以是 'insert' 部分被調換成:

mysql_errno(&my_connection),

mysql_error(&my_connection));

}}

res = mysql_query(&my_connection,

"UPDATE children SET AGE = 4

WHERE fname = 'Ann'");

if (!res) {printf("Updated %lu rows\n",

(unsigned long)mysql_aff誰有可靠的網賭網站ected_rows(&my_connection));

} else {fprintf(stderr, "Update error %d:

%s\n",mysql_errno(&my_connection),

mysql_error(&my_connection));

}

現在假設子表中有的數據,如下:

childno

fname

age

1

2

3

4

5

6

7

8

9

10

11

Jenny

Andrew

Gavin

Duncan

Emma

Alex

Adrian

Ann

Ann

Ann

Ann

14

10

4

2

0

11

5

3

4

3

4

假如我們履行update1,盼望申報的受影響行數為4,然則實際上法度榜樣申報2,由于它僅必須變動2行,雖然WHERE子句標識了4行。假如想讓mysql_affected_rows申報的結果為4這可能是認識其它數據庫的人所期望的),則必要記著將CLIENT_FOUND_ROWS標志通報到mysql_real_connect,在update2.c中的法度榜樣如下:

if (mysql_real_connect(&my_connection, "localhost","rick", "bar", "rick", 0, NULL, CLIENT_FOUND_ROWS)) {

假如我們在數據庫中復位數據,然后運行帶有這種改動的法度榜樣,則它申報的行數為4。

函數mysql_affected_rows還有著末一個稀罕之處,它發生在從數據庫中刪除數據時。假如應用WHERE子句,則mysql_affected_rows將按預期返回刪除行數。然則,假如沒有WHERE子句,則刪除所有行,申報受影響的行數卻為0。這是由于因為效率緣故原由優化刪除全部表。這種行徑不受CLIENT_FOUND_ROWS選項標志的影響。

返回數據的語句

現在是時刻評論爭論SQL的最普遍用法了,從數據庫檢索數據的SELECT語句。

MySQL還支持返回結果的SHOW、DESCRIBE和EXPLAINSQL語句,然則這里不斟酌它們。按常規,手冊中包孕這些語句的闡明。

您將會從PostgreSQL章記起,可以從PQexec中的SQL SELECT語句檢索數據,這里頓時獲取所稀有據,或者應用游標從數據庫中逐行檢索數據,以便搞定大年夜數據。

因為完全相同的緣故原由,MySQL的檢索措施險些完全相同,雖然它實際上不用游標的形式描述逐行檢索。然則,它供給了縮小這兩種措施間差異的API,假如必要,它平日使兩種措施的交換加倍輕易。

平日,從MySQL數據庫中檢索數據有4個階段:

發出查詢

檢索數據

處置懲罰數據

履行所需的任何收拾

象曩昔一樣,我們應用mysql_query發出查詢。數據檢索是應用mysql_store_result或mysql_use_result完成的,這取決于想若何檢索數據,隨后應用mysql_fetch_row調用序列來處置懲罰數據。著末,必須調用mysql_free_result以容許MySQL履行任何所需的收拾。

整個急速數據檢索的函數

可以從SELECT語句(或其他返回數據的語句)中檢索完所稀有據,在單一調用中,應用mysql_store_result:

MYSQL_RES *mysql_store_result(MYSQL *connection);

必須在mysql_query檢索數據后才能調用這個函數,以在結果集中存儲該數據。這個函數從辦事器中檢索所稀有據并急速將它存儲在客戶機中。它返回一個指向曩昔我們從未碰到過的布局(結果集布局)的指針。假如語句掉敗,則返回NULL。

應用等價的PostgreSQL時,應該知道返回NULL意味著已經發生了差錯,并且這與未檢索到數據的環境不合。縱然,返回值不是NULL,也不料味著當前稀有據要處置懲罰。

假如未返回NULL,則可以調用mysql_num_rows并且檢索實際返回的行數,它當然可能是0。

my_ulonglong mysql_num_rows(MYSQL_RES *result);

它從mysql_store_result取得返回的結果布局,并且在該結果集中返回行數,行數可能為0。假如mysql_store_result成功,則mysql_num_rows也老是成功的。

這種mysql_store_result和mysql_num_rows的組合是檢索數據的一種簡便并且直接的措施。一旦mysql_store_result成功返回,則所有查詢數據都已經存儲在客戶機上并且我們知道可以從結果布局中檢索它,而不用擔心會發生數據庫或收集差錯,由于對付法度榜樣所稀有據都是本地的。還可以急速發明返回的行數,它可以使編碼更簡便。如前所述,它將所有結果急速地發送回客戶機。對付大年夜結果集,它可能消費大年夜量的辦事器、收集和客戶機資本。因為這些緣故原由,應用更大年夜的數據集時,最好僅檢索必要的數據。不久,我們將評論爭論若何應用mysql_use_result函數來完成該操作。

一旦檢索了數據,則可以應用mysql_fetch_row來檢索它,并且應用mysql_data_seek、mysql_row_seek、mysql_row_tell操作結果集。在開始檢索數據階段之前,讓我們先評論爭論一下這些函數。

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

這個函數采納從存儲結果中獲取的結果布局,并且從中檢索單一行,在行布局中返回分配給您的數據。當沒有更多半據或者發生差錯時,返回NULL。稍后,我們將回來處置懲罰這一行中的數據。

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);

這個函數容許您進入結果集,設置將由下一個獲取操作返回的行。offset是行號,它必須在從0到結果集中的行數減1 的范圍內。通報0將導致鄙人一次調用mysql_fetch_row時返回第一行。

MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *result);

這個函數返回一個偏移值,它表示結果集中確當前位置。它不是行號,不能將它用于mysql_data_seek。然則,可將它用于:

MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset);

它移動結果集中確當前位置,并返回曩昔的位置。

無意偶爾,這一對函數對付在結果集中的已知點之間跳轉很有用。請留意,不要將rowtell和row seek應用的偏移值與data_seek應用的行號肴雜。這些是弗成互換的,結果將是您所盼望看到的。

void mysql_free_result(MYSQL_RES *result);

完成結果集時,必須老是調用這個函數,以容許MySQL庫收拾分配給它的工具。

檢索數據

現在開始編寫從數據庫中檢索數據的第一個法度榜樣。我們將選擇所豐年歲大年夜于5的行的內容。不幸的是我們還不知道若何處置懲罰這個數據,以是我們能做的只有輪回檢索它。這就是select1.c:

#include

#include

#include "mysql.h"

MYSQL my_connection;

MYSQL_RES *r誰有可靠的網賭網站es_ptr;MYSQL_ROW sqlrow;

int main(int argc, char *argv[]) {int res;

mysql_init(&my_connection);

if (mysql_real_connect(&my_connection, "localhost", "rick",

"bar", "rick", 0, NULL, 0)) {printf("Connection success\n");

res = mysql_query(&my_connection, "SELECT childno,

fname, age FROM children WHERE age > 5");

if (res) {

printf("SELECT error: %s\n", mysql_error(&my_connection));

} else {res_ptr = mysql_store_result(&my_connection);

if (res_ptr) {

printf("Retrieved %luows\n",(unsignedlong)mysql_num_rows(res_ptr));

while ((sqlrow = mysql_fetch_row(res_ptr)))

{printf("Fetched data...\n");

}if (mysql_errno(&my_connection))

{fprintf(stderr,

"Retrive error: s\n",mysql_error

&my_connection));}

}mysql_free_result(res_ptr);

}mysql_close(&my_connection);

} else {fprintf(stderr, "Connection failed\n");

if (mysql_errno(&my_connection))

{fprintf(stderr, "Connection error %d: %s\n",

mysql_errno(&my_connection),mysql_error(&my_connection));

}}return EXIT_SUCCESS;}

檢索結果集并輪回經由過程已檢索的數據的緊張部分都已凸起顯示。

一次檢索一行數據

要按必要逐行檢索數據,而不是急速獲取整個數據并將它存儲在客戶機中,可以將mysql_store_result調用調換成mysql_use_result:

MYSQL_RES *mysql_use_result(MYSQL *connection);

這個函數還取得一個誰有可靠的網賭網站連接工具并返回結果結合指針,或者掉足時返回NULL。與mysql_store_result相似,它返回指向結果集工具的指針;關鍵的不合點在于返回時,實際上沒有將任何數據檢索到結果集,只是初始化結果集以籌備好檢索數據。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

河北十一选五开奖的 全球股市估值 最好看的无码大桥未久 郑州小姐qq电话 橄榄球明星 四人打麻将3366 江苏快三 29选7彩票中奖数字必须顺序 麻生希在线电影 内蒙古本地麻将 中国伊朗足球直播 火箭vs勇士2018决赛 冲田杏梨中文字幕在线播放 股票指数有门槛吗 吉林乐透麻将游戏大厅手机版 va哇嘎画av女优 内蒙古十一选五的走