今日の情報化時代において、アプリケーションとデータベース間の相互作用は一般的な問題であるだけでなく、必要な問題でもあります。 C は高級プログラミング言語として、さまざまなプログラム開発に広く使用されています。では、C を使用してデータベースと対話するにはどうすればよいでしょうか?この記事では、C がデータベースと対話するために必要な手順と基本原則を紹介します。
1. C でデータベースに接続するにはどうすればよいですか?
C データベースに接続するには、ODBC、ADO、JDBC など、さまざまな方法があります。ここでは、ODBC を例として、C とデータベースの間で対話する方法を説明します。 ODBC (Open Database Connectivity) は、データベースに接続するための標準インターフェイスであり、ODBC を使用すると、異なるアプリケーションが同じデータベースを使用できます。
ODBC ドライバーは、異なるデータベースに異なる方法で接続します。ここでは、例として MySQL を取り上げます。コンピュータに MySQL ODBC ドライバをインストールする必要があります。MySQL 公式 Web サイトから ODBC ドライバ インストール パッケージをダウンロードしてインストールできます。インストールが完了すると、コンピュータの ODBC データ ソース マネージャでドライバが表示されます。
C は、ODBC がデータベース操作を実行する方法を提供します。Windows API によって提供される ODBC API を使用して、対話を完了できます。データベースと一緒に。 ODBC を使用するには、ヘッダー ファイル #include
#include <windows.h> #include <sql.h> int main(int argc, char* argv[]) { SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; SQLRETURN retCode; char buff[512]; /*声明句柄并打开ODBC环境*/ SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); /*连接数据库*/ SQLConnect(dbc, "database_name", SQL_NTS, "user_name", SQL_NTS, "password", SQL_NTS); /*执行SQL语句*/ SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLExecDirect(stmt, "SELECT * FROM table_name", SQL_NTS); /*处理结果*/ while(SQLFetch(stmt) == SQL_SUCCESS) { SQLGetData(stmt, 1, SQL_C_CHAR, buff, sizeof(buff), NULL); cout << "Column1 = " << buff << endl; } /*释放资源*/ SQLFreeHandle(SQL_HANDLE_ENV, env); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_STMT, stmt); return 0; }
2. データベース操作を実行するにはどうすればよいですか?
データベースに接続すると、データベースを操作できるようになります。データベース対話に ODBC を使用する場合、主に次の 4 つの関数が関係します:
1. SQLAllocHandle(): ODBC ハンドルを割り当てます。
2. SQLConnect(): データベースに接続します。
3. SQLExecDirect(): SQL ステートメントを実行します。
4. SQLFetch(): 結果を取得します。
以下では、いくつかの重要な関数を呼び出す方法を示すために、データの一部を挿入する例を示します。
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); retCode = SQLExecDirect(stmt, (SQLCHAR*)"INSERT INTO table_name (Column1, Column2) VALUES ('value1', 'value2')", SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); retCode = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM table_name", SQL_NTS); while(SQLFetch(stmt) == SQL_SUCCESS) { SQLGetData(stmt, 1, SQL_C_CHAR, buff, sizeof(buff), NULL); cout << "Column1 = " << buff << endl; }
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); retCode = SQLExecDirect(stmt, (SQLCHAR*)"UPDATE table_name SET Column1='value3' WHERE Column2='value2'", SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); retCode = SQLExecDirect(stmt, (SQLCHAR*)"DELETE FROM table_name WHERE Column2='value2'", SQL_NTS);
3. SQL インジェクションを回避するにはどうすればよいですか?
SQL インジェクション攻撃は一般的な攻撃方法であり、データベースに損傷を与える可能性があります。 SQL インジェクションを回避するために、C プログラムはユーザーが入力したデータを前処理してフィルタリングする必要があります。 SQL ステートメントを直接結合するのではなく、パラメーター化されたクエリを使用することをお勧めします。次はパラメーター化されたクエリの例です:
/*保证输入合法*/ string id = "123"; string name = "Tom' OR '1'='1"; /*SQL注入代码*/ /*通过参数化进行查询*/ SQLCHAR query[255]; sprintf((char*)query, "SELECT * FROM table_name WHERE id=? AND name=?"); /*使用占位符*/ SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLPrepare(stmt, query, SQL_NTS); SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, id.size(), 0, (void*)id.c_str(), 0, NULL); SQLBindParameter(stmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, name.size(), 0, (void*)name.c_str(), 0, NULL); retCode = SQLExecute(stmt);
4. 結論
この記事では、C とデータベースへの接続と基本的なデータベース操作のコード例を提供し、SQL インジェクションの基本概念とインジェクション攻撃を回避する方法も紹介します。 C プログラマーの場合、データベース操作を実行する前に、データベース接続プロセス、データベース操作手順、および SQL インジェクション攻撃の基礎知識を理解する必要があります。この知識をより徹底的に研究し、応用することによってのみ、より安全で信頼性の高いプログラムを開発できるようになります。
以上がC++ とデータベースを操作するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。