MySQLデータベースにおいて、Cを使用してSQL文を実行する方法
9322 ワード
彼らは、データを返すステートメント、例えばINSERT、およびデータを返さないステートメント、例えばUPDATEとDELETEを議論します。そして、彼らはデータベースからデータを検索する簡単なプログラムを作成してSQL文を実行します。今はもう一つの接続があります。そしてエラーをどう処理するかを知っています。すべての種類のSQLを実行する主なキーワードはmysql_です。query:int mysql_query(MYSQL*connection、const char*query)はご覧の通り、とても簡単です。接続構造を指すポインタと実行するSQLを含むテキスト文字列を取ります。コマンドラインツールとは異なり、終了記号は使用されません。成功したら、0に戻ります。バイナリデータを含む特殊な場合には、関連する関数、mysql_を使用することができます。リアル.queryこの章の目的からですが、私達はmysqlを議論するだけです。queryデータに戻らないSQL文はUPDATE、DELETE、INSERT文を先に検討します。彼らはデータを返さないので、もっと使いやすいです。ここで紹介するもう一つの重要な関数は影響を受ける行数を調べる関数です。ulonglong mysql_affected_ローソン(MYSQL*connection);この関数に関する最も明白なことは、その異常なリターン結果であるかもしれない。これは、移植可能性のために特別な無記号タイプである。printfで使用するためには、%luフォーマット仕様を使用した符号無しの長い整数に強制的に変換することが推奨されています。この関数は以前のUPDATE、INSERTまたはDELETEクエリの影響を受けた行数を返します。これらのクエリはmysql_を使います。queryが実行します通常はmysqlに対して関数、戻り符号0は、行に影響がないことを表します。正数は実際の結果を表し、通常は影響を受ける行数です。前に述べたように、mysqlを使用します。affected_ローソンの場合は予期せぬ結果が出る場合があります。まず、INSERT文の影響を受けた行数について議論してみましょう。予想通りに動作します。下記のコードをプログラムconnect 2.cに追加し、insert 1.cと称する。
childno
fname
メッセージ
1
2
3
4
5
6
7
8
9
10
11
ジェニー
Andrew
Gavin
Duncan
エmma
アレックス
アドリアン
アンペア
アンペア
アンペア
アンペア
14
10
4
2
0
11
5
3
4
3
4 udate 1を実行すると、報告したい影響行数は4ですが、実際にはプログラムレポート2は2行しか変更しないので、WHERE子文は4行と表示されています。mysqlにしたいならaffected_ローソンレポートの結果は4であり、これは他のデータベースに詳しい人が望んでいる可能性があります。CLIENT_を記憶する必要があります。FOUND.ROWSマークがmysqlに届きます。リアル.connectでは、udate 2.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
");
res = mysql_query(&my_connection,
"INSERT INTO children(fname,age),
VALUES('Ann',3)");
if (!res) {
printf("Inserted %lu rows
",
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr, "Insert error %d: s
",mysql_errno ,
(&my_connection),
mysql_error(&my_connection));
}
mysql_close(&my_connection);
} else {
fprintf(stderr, "Connection failed
");
if (mysql_errno(&my_connection)) {
fprintf(stderr, "Connection error %d: %s
",
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
",
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr, "Update error %d: %s
",
mysql_errno(&my_connection),
mysql_error(&my_connection));
}
今はサブテーブルにあるデータを仮定して、次のようになります。childno
fname
メッセージ
1
2
3
4
5
6
7
8
9
10
11
ジェニー
Andrew
Gavin
Duncan
エmma
アレックス
アドリアン
アンペア
アンペア
アンペア
アンペア
14
10
4
2
0
11
5
3
4
3
4 udate 1を実行すると、報告したい影響行数は4ですが、実際にはプログラムレポート2は2行しか変更しないので、WHERE子文は4行と表示されています。mysqlにしたいならaffected_ローソンレポートの結果は4であり、これは他のデータベースに詳しい人が望んでいる可能性があります。CLIENT_を記憶する必要があります。FOUND.ROWSマークがmysqlに届きます。リアル.connectでは、udate 2.cのプログラムは以下の通りです。
if (mysql_real_connect(&my_connection, "localhost",
"rick", "bar", "rick", 0, NULL, CLIENT_FOUND_ROWS)) {
はデータベースでデータをリセットして、このような修正されたプログラムを実行すると、その報告の行数は4です。関数mysqlaffected_ローソンは最後のおかしいところがあります。データベースからデータを削除する時に発生します。WHERE子文を使えば、mysql_affected_ローソンは予定通り削除行数に戻ります。しかし、WHERE子文がない場合は、すべての行を削除し、報告の影響を受ける行数は0となります。これは効率のために表全体を最適化して削除するからです。このような行為はCLIENT_を受けない。FOUND.ROWSオプションマークの影響。データを返す文は今はSQLの最も一般的な使い方を議論する時です。データベースからデータを検索するSELECT文です。MySQLは結果のSHOW、DESCRIBE、EXPLAN SQL文もサポートしていますが、ここではそれらを考慮していません。マニュアルにはこれらの語句の説明が含まれています。PostgreSQL章から、PQexecのSQL SELECT文からデータを検索できます。ここですぐにすべてのデータを取得したり、ラベルを使ってデータベースからデータを逐行検索して、大きなデータを解決します。完全に同じ原因のため、MySQLの検索方法はほぼ同じです。実際には、プログレッシブ検索については、プログレッシブ形式で説明する必要はありません。しかし、これらの2つの方法間の違いを縮小するAPIが提供されており、必要であれば、通常は2つの方法の交換をより容易にする。通常、MySQLデータベースから検索データは4つの段階があります。検索データを送信してデータ処理を実行するために必要な整理は以前のように、私たちはmysqlを使用します。クエリを送信します。データ検索はmysqlを使っています。storeレスリングまたはmysqlアメリカ.レスリングが完成したのは、どのようにデータを検索したいのかによって決まります。その後、mysqlを使います。fetchrowシーケンスを呼び出してデータを処理します。最後に、mysqlを呼び出しなければなりません。free_ReseultはMySQLが任意の整理を実行できるようにする。すべての即時データ検索の関数はSELECT文(または他の返却データの文)からすべてのデータを検索し終わって、単一呼び出しでmysql_を使用します。storeresult:
MYSQL_RES *mysql_store_result(MYSQL *connection);
はmysql_にいなければなりません。Qeryはデータを検索してから、この関数を呼び出して、結果集にデータを格納することができます。この関数はサーバからすべてのデータを検索してすぐにクライアントに格納します。これは以前に会ったことのない構造(結果集合構造)を指す指針を返します。ステートメントが失敗したらNULLに戻ります。等価なPostgreSQLを使用すると、NULLに戻るということは、エラーが発生していることを意味し、データが検索されていない場合とは異なることを知るべきである。たとえ、戻り値がNULLではないとしても、現在データがあるとは限らない。NULLに戻らない場合は、mysql_を呼び出すことができます。numローソンは、実際に戻った行数を検索します。もちろん、0かもしれません。
my_ulonglong mysql_num_rows(MYSQL_RES *result);
mysqlからです。storeResultは、戻りの結果構造を取得し、その結果の集中的には、行数を返し、行数は0とすることができる。もしmysqlがstoreレスリングが成功すれば、mysqlnumローソンもいつも成功します。このmysqlstoreレスリングとmysqlnumローソンの組み合わせはデータを検索する簡単かつ直接的な方法である。一度はmysqlstoreresultが正常に戻りました。すべての照会データはすでにクライアントに格納されています。結果構造から検索できることを知っています。データベースやネットワークエラーが発生する心配はないです。プログラムに関するすべてのデータはローカルですから。戻りの行数は、符号化をより簡単にすることができます。前に述べたように、すべての結果をすぐにクライアントに送ります。大きな結果セットについては、サーバー、ネットワーク、クライアントのリソースを大量に消費する可能性があります。これらのため、より大きなデータセットを使う場合は、必要なデータだけを検索したほうがいいです。まもなく、mysqlをどう使うかを検討します。アメリカ.この操作を完了するためにresult関数が使用されます。いったんデータを検索したら、mysql_を使うことができます。fetchrowで検索し、mysqlを使う。data_seek、mysqlrow_seek、mysqlrow_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を呼び出します。fetchrow時に1行目に戻ります。
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);
は結果セットの現在位置を移動し、以前の位置に戻るために使用されてもよい。この一対の関数は、結果セットの既知の点間のジャンプに有用である場合がある。row tellとrow seekで使用されているオフセット値をdata_uとしないように注意してください。seekで使う行番号は混淆されます。これらは交換できません。結果はご希望のものになります。
void mysql_free_result(MYSQL_RES *result);
で結果セットが完了すると、常にこの関数を呼び出して、MySQLライブラリが割り当てられたオブジェクトを整理できるようにする必要があります。検索データは今からデータベースからデータを検索する最初のプログラムを作成します。すべての年齢が5より大きい行の内容を選択します。残念なことに、私達はまだこのデータをどうやって処理するか分かりません。だから私達ができるのは循環検索だけです。これはselect 1.c:
#include
#include
#include "mysql.h"
MYSQL my_connection;
MYSQL_RES *res_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
");
res = mysql_query(&my_connection, "SELECT childno, fname,
age FROM children WHERE age > 5");
if (res) {
printf("SELECT error: %s
", mysql_error(&my_connection));
} else {
res_ptr = mysql_store_result(&my_connection);
if (res_ptr) {
printf("Retrieved %luows
",(unsignedlong)mysql_num_rows(res_ptr));
while ((sqlrow = mysql_fetch_row(res_ptr))) {
printf("Fetched data...
");
}
if (mysql_errno(&my_connection)) {
fprintf(stderr, "Retrive error: s
",mysql_error(&my_connection));
}
}
mysql_free_result(res_ptr);
}
mysql_close(&my_connection);
} else {
fprintf(stderr, "Connection failed
");
if (mysql_errno(&my_connection)) {
fprintf(stderr, "Connection error %d: %s
",
mysql_errno(&my_connection),mysql_error(&my_connection));
}
}
return EXIT_SUCCESS;
}
で検索結果セットを検索して検索したデータの重要な部分を循環して強調表示しました。一度に一行のデータを検索するには、必要に応じて、一行ごとにデータを検索します。すぐにすべてのデータを取得して、クライアントに格納します。storeレスリングコールをmysqlに切り替えます。アメリカ.この関数はまた、接続対象を取得し、結果結合ポインタを返したり、エラーが発生したときにNULLに戻ります。mysqlとstore同じように、結果セットのオブジェクトを指すポインタを返します。重要な違いは、戻る時に、実際には何のデータも結果セットに検索されませんでした。検索データを準備するために、初期化結果セットだけです。参考資料は、本論文のdeveloperWorksグローバルサイトでの英文の原文を参照してください。本記事はWrox Professional Linuxから出版された第5章です。著者のRick Stnesはシステムデザイナーで、彼は大手の汎欧製薬の販売と分配会社のIT部門で働いています。1985年から様々な形のUNIXを使用していますが、初期の99 CD-ROM発売版のLinuxがあります。彼は各種の言語でUNIX、Linuxとその他のプラットフォームのソフトウェアを編纂して、同時にまたいくつのLinuxサーバーをインストールして管理します。彼は非常に限られた余暇の時間に彼のピアノ演奏のスキルを向上させるために努力した。大学時代からCとUNIX V 6に接触している時から、Neil MatthewはUNIXとLinuxに対して20年以上の経験をしています。彼はその時からITに従事しています。主に通信ソフトの開発に従事しています。深いプログラミング言語と開発技術に対する情熱を持っています。現在、彼はシステムデザイナーとして、技術戦略とQAに提案しています。彼は会社の企業内でLinuxビジネスのケースを作ることに熱心です。余暇の時間、作文や乗馬を楽しみにしています。Neilは妻と子供二人を誘って田舎を散歩させます。NeilはWrox Pressの発行する何冊かの本を編纂しました。一番有名なのはBeginning Linux ProgrammingとProfessional Linux Programmingです。