熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

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

2013-11-23 20:58:52  來源: MySQL 

  與PostgreSQL相似可使用許多不同的語言來訪問MySQL包括CC++Java和Perl從Professional Linux Programming中第章有關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的文本字符串與命令行工具不同將不使用結束分號成功之後返回在需要包含二進制數據的特殊情況下可以使用相關的函數mysql_real_query雖然出於本章的目的我們僅需要討論mysql_query
  
  不返回數據的SQL語句
  
  我們將先討論UPDATEDELETE和INSERT語句因為它們不返回數據所以更易於使用
  
  這裡我們將介紹的另一個重要函數是檢查受影響的行數的函數
  
  my_ulonglong mysql_affected_rows(MYSQL *connection);
  
  可能關於這一函數的最顯而易見的事就是其非同尋常的返回結果由於可移植性原因這是一個特殊的無符號類型為了在printf中使用建議將其強制轉換成使用%lu格式規范的無符號長整數這個函數返回受以前的UPDATEINSERT或DELETE查詢影響的行數這些查詢是使用mysql_query執行的
  
  通常對於mysql_函數返回碼表示沒有行受影響正數表示實際結果通常是受影響的行數
  
  如前所述當使用mysql_affected_rows時可能出現未期望的結果讓我們先討論受INSERT語句影響的行數它將按預期進行操作將下列代碼添加到程序 connectc 中並且稱其為insertc
  
  #include
  #include
  #include mysqlh
  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 NULL )) {
  printf(Connection success\n);
  
  res = mysql_query(&my_connection
  INSERT INTO children(fnameage)
  VALUES(Ann));
  if (!res) {
  printf(Inserted %lu rows\n
  (unsigned long)mysql_affected_rows(&my_connection));
  } else {
  fprintf(stderr Insert error %d: s\nmysql_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;
  }
  
  正如預期插入的行數為
  
  現在我們更改代碼所以 insert 部分被替換成
  
  mysql_errno(&my_connection) mysql_error(&my_connection));
  }
  }
  
  res = mysql_query(&my_connection UPDATE children SET AGE =
  
  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));
  }
  
  現在假設子表中有的數據如下
  
  childno fname age
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  Jenny
  Andrew
  
  Gavin
  
  Duncan
  
  Emma
  
  Alex
  
  Adrian
  
  Ann
  
  Ann
  
  Ann
  
  Ann
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  如果我們執行update希望報告的受影響行數為但是實際上程序報告因為它僅必須更改雖然WHERE子句標識了如果想讓mysql_affected_rows報告的結果為這可能是熟悉其它數據庫的人所期望的)則需要記住將CLIENT_FOUND_ROWS標志傳遞到mysql_real_connect在 updatec中的程序如下
  
  if (mysql_real_connect(&my_connection localhost
  rick bar rick NULL CLIENT_FOUND_ROWS)) {
  
  如果我們在數據庫中復位數據然後運行帶有這種修改的程序則它報告的行數為
  
  函數mysql_affected_rows還有最後一個奇怪之處它發生在從數據庫中刪除數據時如果使用WHERE子句則mysql_affected_rows將按預期返回刪除行數但是如果沒有WHERE子句則刪除所有行報告受影響的行數卻為這是因為由於效率原因優化刪除整個表這種行為不受CLIENT_FOUND_ROWS選項標志的影響
  
  返回數據的語句
  
  現在是時候討論SQL的最普遍用法了從數據庫檢索數據的SELECT語句
  
  MySQL 還支持返回結果的SHOWDESCRIBE和EXPLAIN SQL語句但是這裡不考慮它們按慣例手冊中包含這些語句的說明
  
  您將會從PostgreSQL章記起可以從PQexec中的SQL SELECT 語句檢索數據這裡馬上獲取所有數據或者使用游標從數據庫中逐行檢索數據以便搞定大數據
  
  由於完全相同的原因MySQL的檢索方法幾乎完全相同雖然它實際上不用游標的形式描述逐行檢索但是它提供了縮小這兩種方法間差異的API如果需要它通常使兩種方法的互換更加容易
  
  通常從MySQL數據庫中檢索數據有個階段
  
  發出查詢
  
  檢索數據
  
  處理數據
  
  執行所需的任何整理
  
  象以前一樣我們使用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並且檢索實際返回的行數它當然可能是
  
  my_ulonglong mysql_num_rows(MYSQL_RES *result);
  
  它從mysql_store_result取得返回的結果結構並且在該結果集中返回行數行數可能為如果mysql_store_result成功則mysql_num_rows也總是成功的
  
  這種mysql_store_result和mysql_num_rows的組合是檢索數據的一種簡便並且直接的方法一旦mysql_store_result成功返回則所有查詢數據都已經存儲在客戶機上並且我們知道可以從結果結構中檢索它而不用擔心會發生數據庫或網絡錯誤因為對於程序所有數據都是本地的還可以立即發現返回的行數它可以使編碼更簡便如前所述它將所有結果立即地發送回客戶機對於大結果集它可能耗費大量的服務器網絡和客戶機資源由於這些原因使用更大的數據集時最好僅檢索需要的數據不久我們將討論如何使用mysql_use_result函數來完成該操作
  
  一旦檢索了數據則可以使用mysql_fetch_row來檢索它並且使用mysql_data_seekmysql_row_seekmysql_row_tell操作結果集在開始檢索數據階段之前讓我們先討論一下這些函數
  
  MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  
  這個函數采用從存儲結果中獲取的結果結構並且從中檢索單一行在行結構中返回分配給您的數據當沒有更多數據或者發生錯誤時返回NULL稍後我們將回來處理這一行中的數據
  
  void mysql_data_seek(MYSQL_RES *result my_ulonglong offset);
  
  這個函數允許您進入結果集設置將由下一個獲取操作返回的行offset是行號它必須在從到結果集中的行數減 的范圍內傳遞將導致在下一次調用mysql_fetch_row時返回第一行
  
  MYSQL_ROW_OFFEST mysql_row_tell(MYSQL_RES *res
From:http://tw.wingwit.com/Article/program/MySQL/201311/29372.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.