亚洲韩日午夜视频,欧美日韩在线精品一区二区三区,韩国超清无码一区二区三区,亚洲国产成人影院播放,久草新在线,在线看片AV色

您好,歡迎來到思海網絡,我們將竭誠為您提供優質的服務! 誠征網絡推廣 | 網站備案 | 幫助中心 | 軟件下載 | 購買流程 | 付款方式 | 聯系我們 [ 會員登錄/注冊 ]
促銷推廣
客服中心
業務咨詢
有事點擊這里…  531199185
有事點擊這里…  61352289
點擊這里給我發消息  81721488
有事點擊這里…  376585780
有事點擊這里…  872642803
有事點擊這里…  459248018
有事點擊這里…  61352288
有事點擊這里…  380791050
技術支持
有事點擊這里…  714236853
有事點擊這里…  719304487
有事點擊這里…  1208894568
有事點擊這里…  61352289
在線客服
有事點擊這里…  531199185
有事點擊這里…  61352288
有事點擊這里…  983054746
有事點擊這里…  893984210
當前位置:首頁 >> 技術文章 >> 文章瀏覽
技術文章

在MySQL數據庫中使用C執行SQL語句

添加時間:2013-1-19 17:52:08  添加: 思海網絡 
與PostgreSQL相似,可使用許多不同的語言來訪問MySQL,包括C、C++、Java和Perl。從Professional Linux Programming中第5章有關MySQL的下列章節中,Neil Matthew和Richard Stones使用詳盡的MySQL C接口向我們介紹了如何在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_affected_rows(&my_connection));      } else {        fprintf(stderr, "Update error %d: %s\n",mysql_errno(&my_connection),                                                  mysql_error(&my_connection));      }


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

childnofnameage1

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選項標志的影響。
關鍵字:MySQL、數據庫

分享到:

頂部 】 【 關閉
版權所有:佛山思海電腦網絡有限公司 ©1998-2024 All Rights Reserved.
聯系電話:(0757)22630313、22633833
中華人民共和國增值電信業務經營許可證: 粵B1.B2-20030321 備案號:粵B2-20030321-1
網站公安備案編號:44060602000007 交互式欄目專項備案編號:200303DD003  
察察 工商 網安 舉報有獎  警警  手機打開網站