SQLExecDirect 関数

準拠
導入されたバージョン: ODBC 1.0 標準準拠: ISO 92

まとめ
SQLExecDirect は 、ステートメント内にパラメーターが存在する場合は、パラメーター マーカー変数の現在の値を使用して、準備可能なステートメントを実行します。 SQLExecDirect は、1 回限りの実行のために SQL ステートメントを送信する最も高速な方法です。

構文

  
SQLRETURN SQLExecDirect(  
     SQLHSTMT     StatementHandle,  
     SQLCHAR *    StatementText,  
     SQLINTEGER   TextLength);  

引数

StatementHandle
[入力]ステートメント ハンドル。

StatementText
[入力]実行する SQL ステートメント。

TextLength
[入力]*StatementText の長さ (文字単位)。

戻り値

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_NEED_DATA、SQL_STILL_EXECUTING、SQL_ERROR、SQL_NO_DATA、SQL_INVALID_HANDLE、またはSQL_PARAM_DATA_AVAILABLE。

診断

SQLExecDirect が SQL_ERROR または SQL_SUCCESS_WITH_INFO を返す場合は、関連付けられている SQLSTATE 値を取得するには、SQL_HANDLE_STMT の HandleTypeStatementHandleハンドルを使用して SQLGetDiagRec を呼び出します。 次の表に、 SQLExecDirect によって一般的に返される SQLSTATE 値の一覧を示し、この関数のコンテキストでそれぞれについて説明します。ドライバー マネージャーによって返される SQLSTATEs の説明の前に表記 "(DM)" が付きます。 特に記載がない限り、各 SQLSTATE 値に関連付けられている戻りコードはSQL_ERRORされます。

SQLSTATE エラー 説明
01000 一般的な警告 ドライバー固有の情報メッセージ。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01001 カーソル操作の競合 *StatementText には、位置指定された更新ステートメントまたは delete ステートメントが含まれており、行または複数の行が更新または削除されませんでした。 (複数の行の更新の詳細については、SQLSetStmtAttr のSQL_ATTR_SIMULATE_CURSOR属性の説明を参照してください)。

(関数はSQL_SUCCESS_WITH_INFOを返します。
01003 set 関数で削除された NULL 値 引数 StatementText には SET 関数 (AVGMAXMIN など) が含まれていましたが、COUNT セット関数は含まれず、NULL 引数の値は関数が適用される前に削除されました。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01004 文字列データ、右切り捨て 入力/出力パラメーターまたは出力パラメーターに対して返される文字列またはバイナリ データは、非空白文字または NULL 以外のバイナリ データの切り捨てになります。 文字列値の場合は、右に切り捨てられました。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01006 権限が取り消されない *StatementText には REVOKE ステートメントが含まれており、ユーザーは指定された特権を持っていませんでした。 (関数はSQL_SUCCESS_WITH_INFOを返します。
01007 特権が付与されていません *StatementTextGRANT ステートメントであり、指定された特権をユーザーに付与できませんでした。
01S02 オプションの値が変更されました 指定されたステートメント属性は、実装の作業条件のために無効であるため、同様の値が一時的に置き換えられました。 (SQLGetStmtAttr を呼び出して、一時的に置き換えられる値が何であるかを判断できます)。置き換え値は、カーソルが閉じられるまで StatementHandle に対して有効です。この時点で、ステートメント属性は前の値に戻ります。 変更できるステートメント属性は次のとおりです。

SQL_ ATTR_CONCURRENCY SQL_ ATTR_CURSOR_TYPE SQL_ ATTR_KEYSET_SIZE SQL_ ATTR_MAX_LENGTH SQL_ ATTR_MAX_ROWS SQL_ ATTR_QUERY_TIMEOUT SQL_ ATTR_SIMULATE_CURSOR

(関数はSQL_SUCCESS_WITH_INFOを返します。
01S07 小数部の切り捨て 入力/出力または出力パラメーターに対して返されたデータは、数値データ型の小数部が切り捨てられたか、時刻、タイムスタンプ、または間隔データ型の時間コンポーネントの小数部が切り捨てられた場合に切り捨てられました。

(関数はSQL_SUCCESS_WITH_INFOを返します。
07002 COUNT フィールドが正しくありません SQLBindParameter で指定されたパラメーターの数が、*StatementText に含まれる SQL ステートメント内のパラメーターの数より少なかった。

SQLBindParameter は、 ParameterValuePtr が null ポインターに設定され、 StrLen_or_IndPtr SQL_NULL_DATA またはSQL_DATA_AT_EXECに設定されず、 InputOutputType がSQL_PARAM_OUTPUTに設定されていないため、 SQLBindParameter で指定されたパラメーターの数が *StatementText に含まれる SQL ステートメント内のパラメーターの数より大きくなっています。
07006 制限付きデータ型属性違反 バインドされたパラメーターの SQLBindParameterValueType 引数によって識別されるデータ値を、SQLBindParameterParameterType 引数で識別されるデータ型に変換できませんでした。

SQL_PARAM_INPUT_OUTPUTまたはSQL_PARAM_OUTPUTとしてバインドされたパラメーターに対して返されたデータ値は、SQLBindParameterValueType 引数で識別されるデータ型に変換できませんでした。

(1 つ以上の行のデータ値を変換できませんでしたが、1 つ以上の行が正常に返された場合、この関数はSQL_SUCCESS_WITH_INFOを返します)。
07007 制限付きパラメーター値違反 パラメーター型SQL_PARAM_INPUT_OUTPUT_STREAMは、パーツ内のデータを送受信するパラメーターにのみ使用されます。 このパラメーター型では、入力バインド バッファーは使用できません。

このエラーは、パラメーターの型がSQL_PARAM_INPUT_OUTPUTされ、SQLBindParameter で指定された *StrLen_or_IndPtr がSQL_NULL_DATA、SQL_DEFAULT_PARAM、SQL_LEN_DATA_AT_EXEC(len)、またはSQL_DATA_AT_EXECと等しくない場合に発生します。
07S01 既定のパラメーターの使用が無効です SQLBindParameter で設定されたパラメーター値がSQL_DEFAULT_PARAMされ、対応するパラメーターに既定値が設定されていませんでした。
08S01 通信リンクエラー ドライバーとドライバーが接続されているデータ ソース間の通信リンクは、関数の処理が完了する前に失敗しました。
21S01 値リストの挿入が列リストと一致しない *StatementText には INSERT ステートメントが含まれており、挿入する値の数が派生テーブルの次数と一致しませんでした。
21S02 派生テーブルの次数が列リストと一致しない *StatementText には CREATE VIEW ステートメントが含まれており、修飾されていない列リスト (SQL ステートメントの 列識別子 引数のビューに指定された列の数) には、SQL ステートメントの クエリ仕様 引数によって定義された派生テーブル内の列数よりも多くの名前が含まれていました。
22001 文字列データ、右切り捨て 列に文字またはバイナリ値を割り当てると、非空白文字データまたは null 以外のバイナリ データが切り捨てられました。
22002 インジケーター変数は必須ですが、指定されていません SQLBindParameter によって設定されたStrLen_or_IndPtrが null ポインターである出力パラメーターに NULL データがバインドされました。
22003 範囲外の数値 *StatementText には、バインドされた数値パラメーターまたはリテラルを含む SQL ステートメントが含まれており、この値により、関連付けられているテーブル列に割り当てられると、数値の部分全体 (小数部ではなく) が切り捨てられました。

1 つ以上の入力/出力パラメーターまたは出力パラメーターに対して数値 (数値または文字列) を返すと、数値の一部全体 (小数部ではなく) が切り捨てられます。
22007 datetime 形式が無効です *StatementText には、バインドされたパラメーターとして日付、時刻、またはタイムスタンプ構造を含む SQL ステートメントが含まれており、パラメーターはそれぞれ無効な日付、時刻、またはタイムスタンプでした。

入力/出力または出力パラメーターが日付、時刻、またはタイムスタンプ C 構造体にバインドされ、返されたパラメーターの値はそれぞれ無効な日付、時刻、またはタイムスタンプでした。 (関数はSQL_SUCCESS_WITH_INFOを返します)。
22008 Datetime フィールドオーバーフロー *StatementText には、計算時に無効な日付、時刻、またはタイムスタンプ構造を生成する datetime 式を含む SQL ステートメントが含まれていました。

入力/出力パラメーターまたは出力パラメーターに対して計算された datetime 式の結果、無効な日付、時刻、またはタイムスタンプ C 構造体が生成されました。
22012 0 で除算しました *StatementText には、0 による除算の原因となった算術式を含む SQL ステートメントが含まれていました。

入力/出力パラメーターまたは出力パラメーターに対して計算された算術式の結果、0 で除算されます。
22015 Interval フィールドのオーバーフロー *StatementText には、正確な数値または間隔パラメーターが含まれていました。このパラメーターを間隔 SQL データ型に変換すると、有効桁数が失われます。

*StatementText には、複数のフィールドを持つ間隔パラメーターが含まれていました。このパラメーターを列の数値データ型に変換すると、数値データ型に表現が含まれていませんでした。

*StatementText には、間隔 SQL 型に割り当てられたパラメーター データが含まれており、間隔 SQL 型に C 型の値の表現がありませんでした。

正確な数値または間隔の SQL 型であった入力/出力または出力パラメーターを間隔 C 型に割り当てると、有効桁数が失われます。

入力/出力または出力パラメーターが間隔 C 構造体に割り当てられた場合、間隔データ構造内のデータの表現はありませんでした。
22018 キャスト指定の文字値が無効です *StatementText には、正確または近似の数値、datetime、または間隔のデータ型である C 型が含まれていました。列の SQL 型は文字データ型でした。列の値が、バインドされた C 型の有効なリテラルではありません。

入力/出力または出力パラメーターが返されたとき、SQL 型は正確または近似数値、datetime、または間隔データ型でした。C型はSQL_C_CHARされました。列の値がバインドされた SQL 型の有効なリテラルではありません。
22019 エスケープ文字が無効です *StatementTextを含む SQL ステートメントに含まれている、LIKEの述語では、エスケープで、WHERE句とエスケープの長さ次の文字エスケープが 1 と等しくありません。
22025 エスケープ シーケンスが無効です *StatementTextを含む SQL ステートメントに含まれる"LIKEパターン値エスケープエスケープ文字"で、WHERE句、およびパターンの値のエスケープ文字の後の文字が「%」または「_」のいずれか。
23000 整合性制約違反 *StatementText には、パラメーターまたはリテラルを含む SQL ステートメントが含まれていました。 関連付けられたテーブル列で NOT NULL として定義された列に対してパラメーター値が NULL であったか、一意の値のみを含む列に重複する値が指定されたか、またはその他の整合性制約に違反しました。
24000 カーソル状態が無効 カーソルが SQLFetch または SQLFetchScroll によって StatementHandle に配置されました。 このエラーは、 SQLFetch または SQLFetchScroll がSQL_NO_DATAを返していない場合はドライバー マネージャーによって返され、 SQLFetch または SQLFetchScroll がSQL_NO_DATAを返した場合はドライバーによって返されます。

カーソルは開かれていましたが、 StatementHandle に配置されていません。

*StatementText には配置された更新ステートメントまたは delete ステートメントが含まれており、カーソルは結果セットの開始前または結果セットの末尾の後に配置されました。
34000 カーソル名が無効 *StatementText に配置された更新ステートメントまたは delete ステートメントが含まれており、実行中のステートメントによって参照されているカーソルが開いていません。
3D000 カタログ名が無効です StatementText で指定されたカタログ名が無効です。
3F000 スキーマ名が無効です StatementText で指定されたスキーマ名が無効です。
40001 シリアル化エラー 別のトランザクションでリソースのデッドロックが発生したため、トランザクションがロールバックされました。
40003 ステートメントの入力候補が不明です この関数の実行中に関連付けられた接続が失敗し、トランザクションの状態を特定できません。
42000 構文エラーまたはアクセス違反 *StatementText には、準備が不可能な SQL ステートメントや構文エラーが含まれていました。

*StatementText に含まれる SQL ステートメントを実行する権限がユーザーにありませんでした。
42S01 ベース テーブルまたはビューが既に存在する *StatementText には CREATE TABLE ステートメントまたは CREATE VIEW ステートメントが含まれており、指定されたテーブル名またはビュー名は既に存在します。
42S02 ベース テーブルまたはビューが見つかりません *StatementText には DROP TABLE または DROP VIEW ステートメントが含まれており、指定されたテーブル名またはビュー名が存在しませんでした。

*StatementTextALTER TABLE ステートメントが含まれており、指定されたテーブル名が存在しませんでした。

*StatementText には CREATE VIEW ステートメントが含まれており、クエリ仕様で定義されたテーブル名またはビュー名が存在しませんでした。

*StatementTextCREATE INDEX ステートメントが含まれており、指定されたテーブル名が存在しませんでした。

*StatementTextGRANT ステートメントまたは REVOKE ステートメントが含まれており、指定されたテーブル名またはビュー名が存在しませんでした。

*StatementTextSELECT ステートメントが含まれており、指定されたテーブル名またはビュー名が存在しませんでした。

*StatementTextDELETEINSERT、または UPDATE ステートメントが含まれており、指定されたテーブル名が存在しませんでした。

*StatementText には CREATE TABLE ステートメントが含まれており、制約で指定されたテーブル (作成されているテーブル以外のテーブルを参照する) は存在しませんでした。

*StatementTextCREATE SCHEMA ステートメントが含まれており、指定されたテーブル名またはビュー名が存在しませんでした。
42S11 インデックスは既に存在します *StatementText には CREATE INDEX ステートメントが含まれており、指定されたインデックス名は既に存在しています。

*StatementText には CREATE SCHEMA ステートメントが含まれており、指定されたインデックス名は既に存在しています。
42S12 インデックスが見つかりません *StatementTextDROP INDEX ステートメントが含まれており、指定されたインデックス名が存在しませんでした。
42S21 列は既に存在します *StatementTextALTER TABLE ステートメントが含まれており、 ADD 句で指定された列が一意ではないか、ベース テーブル内の既存の列を識別します。
42S22 列が見つかりません *StatementText には CREATE INDEX ステートメントが含まれており、列リストに指定された列名の 1 つ以上が存在しませんでした。

*StatementTextGRANT ステートメントまたは REVOKE ステートメントが含まれており、指定された列名が存在しませんでした。

*StatementTextSELECTDELETEINSERT、または UPDATE ステートメントが含まれており、指定された列名が存在しませんでした。

*StatementText には CREATE TABLE ステートメントが含まれており、制約で指定された列 (作成されているテーブル以外のテーブルを参照する) は存在しませんでした。

*StatementTextCREATE SCHEMA ステートメントが含まれており、指定された列名が存在しませんでした。
44000 WITH CHECK OPTION 違反 引数 StatementText には、INSERT ステートメントの影響を受ける 1 つ以上の行が表示テーブルに存在しないように、WITH CHECK OPTION を指定して作成された、表示テーブルまたは表示テーブルから派生したテーブルに対して実行される INSERT ステートメントが含まれていました。

引数 StatementText には、表示テーブルまたは WITH CHECK OPTION を指定して作成された表示テーブルから派生したテーブルに対して実行される UPDATE ステートメントが含まれていました。これにより、UPDATE ステートメントの影響を受ける 1 つ以上の行が表示テーブルに存在しなくなります。
HY000 一般的なエラー 特定の SQLSTATE がなく、実装固有の SQLSTATE が定義されていないエラーが発生しました。 *MessageText バッファー内の SQLGetDiagRec によって返されるエラー メッセージは、エラーとその原因について説明します。
HY001 メモリ割り当てエラー ドライバーは、関数の実行または完了をサポートするために必要なメモリを割り当てることができませんでした。
HY008 操作が取り消されました StatementHandle に対して非同期処理が有効になりました。 関数が呼び出され、実行が完了する前に、 SqlCancel または SQLCancelHandleStatementHandle で呼び出されました。 その後、 StatementHandle で関数が再び呼び出されました。

関数が呼び出され、実行が完了する前に、マルチスレッド アプリケーションの別のスレッドから StatementHandleSQLCancel または SQLCancelHandle が呼び出されました。
HY009 null ポインターの使用が無効です (DM) *StatementText は null ポインターでした。
HY010 関数シーケンス エラー (DM) StatementHandle に関連付けられている接続ハンドルに対して非同期に実行される関数が呼び出されました。 この非同期関数は、 SQLExecDirect 関数が呼び出されたときにまだ実行されていました。

(DM) SQLExecuteSQLExecDirect、または SQLMoreResultsStatementHandle に対して呼び出され、SQL_PARAM_DATA_AVAILABLE返されました。 この関数は、すべてのストリーミング パラメーターに対してデータが取得される前に呼び出されました。

(DM) 非同期で実行される関数 (この関数ではなく) が StatementHandle に対して呼び出され、この関数が呼び出されたときにまだ実行されていました。

(DM) SQLExecuteSQLExecDirectSQLBulkOperations、または SQLSetPosStatementHandle に対して呼び出され、SQL_NEED_DATA返されました。 この関数は、実行中のすべてのデータ パラメーターまたは列に対してデータが送信される前に呼び出されました。
HY013 メモリ管理エラー 基になるメモリ オブジェクトにアクセスできなかったため、メモリの状態が低いため、関数呼び出しを処理できませんでした。
HY090 文字列またはバッファーの長さが無効です (DM) 引数 TextLength は 0 以下でしたが、SQL_NTSと等しくありません。

SQLBindParameter で設定されたパラメーター値は null ポインターであり、パラメーターの長さの値は 0、SQL_NULL_DATA、SQL_DATA_AT_EXEC、SQL_DEFAULT_PARAM、または SQL_LEN_DATA_AT_EXEC_OFFSET 以下でした。

SQLBindParameter で設定されたパラメーター値が null ポインターではありません。C データ型がSQL_C_BINARYまたはSQL_C_CHAR。パラメーターの長さの値は 0 未満でしたが、SQL_NTS、SQL_NULL_DATA、SQL_DATA_AT_EXEC、SQL_DEFAULT_PARAM、またはSQL_LEN_DATA_AT_EXEC_OFFSET以下でした。

SQLBindParameter によってバインドされたパラメーター長の値がSQL_DATA_AT_EXECに設定されました。SQL 型は、SQL_LONGVARCHAR、SQL_LONGVARBINARY、または長いデータ ソース固有のデータ型でした。SQLGetInfo のSQL_NEED_LONG_DATA_LEN情報の種類は "Y" でした。
HY105 パラメーターの型が無効です SQLBindParameter の引数 InputOutputType に指定された値がSQL_PARAM_OUTPUTされ、パラメーターが入力パラメーターでした。
HY109 カーソル位置が無効です *StatementText には、位置指定された更新ステートメントまたは delete ステートメントが含まれており、カーソルが削除されたかフェッチできなかった行に ( SQLSetPos または SQLFetchScroll によって) 配置されました。
HY117 不明なトランザクション状態のため、接続が中断されます。 切断および読み取り専用の関数のみが許可されます。 (DM) 中断状態の詳細については、 SQLEndTran 関数を参照してください。
HYC00 省略可能な機能が実装されていません SQL_ATTR_CONCURRENCYとSQL_ATTR_CURSOR_TYPEステートメント属性の現在の設定の組み合わせは、ドライバーまたはデータ ソースではサポートされていませんでした。

SQL_ATTR_USE_BOOKMARKSステートメント属性がSQL_UB_VARIABLEに設定され、SQL_ATTR_CURSOR_TYPE ステートメント属性が、ドライバーがブックマークをサポートしていないカーソルの種類に設定されました。
HYT00 タイムアウトに達しました データ ソースが結果セットを返す前に、クエリのタイムアウト期間の有効期限が切れています。 タイムアウト期間は、 SQLSetStmtAttr (SQL_ATTR_QUERY_TIMEOUT) によって設定されます。
HYT01 接続のタイムアウト データ ソースが要求に応答する前に、接続タイムアウト期間の有効期限が切れています。 接続タイムアウト期間は、 SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr を介して設定されます。
IM001 ドライバーは、この関数をサポートしていません (DM) StatementHandle に関連付けられているドライバーは、関数をサポートしていません。
IM017 非同期通知モードでポーリングが無効になっている 通知モデルが使用されるたびに、ポーリングは無効になります。
IM018 SQLCompleteAsync は、このハンドルに対する前の非同期操作を完了するために呼び出されていません。 ハンドルの前の関数呼び出しがSQL_STILL_EXECUTINGを返し、通知モードが有効になっている場合は、処理後の処理を実行して操作を完了するには、そのハンドルで SQLCompleteAsync を呼び出す必要があります。

コメント

アプリケーションは SQLExecDirect を 呼び出して、SQL ステートメントをデータ ソースに送信します。 直接実行の詳細については、「 直接実行」を参照してください。 ドライバーは、データ ソースで使用される SQL の形式を使用するようにステートメントを変更し、データ ソースに送信します。 特に、ドライバーは、SQL で特定の機能を定義するために使用されるエスケープ シーケンスを変更します。 エスケープ シーケンスの構文については、 ODBC のエスケープ シーケンスに関するページを参照してください

アプリケーションは、SQL ステートメントに 1 つ以上のパラメーター マーカーを含めることができます。 パラメーター マーカーを含めるために、アプリケーションは疑問符 (?) を適切な位置にある SQL ステートメントに埋め込みます。 パラメーターの詳細については、「 ステートメント パラメーター」を参照してください。

SQL ステートメントが SELECT ステートメントであり、アプリケーションが SQLSetCursorName を呼び出してカーソルをステートメントに関連付ける場合、ドライバーは指定されたカーソルを使用します。 それ以外の場合、ドライバーはカーソル名を生成します。

データ ソースが手動コミット モード (明示的なトランザクション開始を必要とする) で、トランザクションがまだ開始されていない場合、ドライバーは SQL ステートメントを送信する前にトランザクションを開始します。 詳細については、「 手動コミット モード」を参照してください。

アプリケーションが SQLExecDirect を 使用して COMMIT ステートメントまたは ROLLBACK ステートメントを送信する場合、DBMS 製品間で相互運用することはできません。 トランザクションをコミットまたはロールバックするために、アプリケーションは SQLEndTran を呼び出します。

SQLExecDirect が実行時データ パラメーターを検出すると、SQL_NEED_DATAが返されます。 アプリケーションは、 SQLParamData と SQLPutData を 使用してデータ を送信しますSQLBindParameterSQLParamDataSQLPutData、および長いデータの送信に関するページを参照してください。

SQLExecDirect が、データ ソースの行に影響を与えない検索された更新、挿入、または削除のステートメントを実行すると、SQLExecDirect の呼び出しはSQL_NO_DATAを返します。

SQL_ATTR_PARAMSET_SIZE ステートメント属性の値が 1 より大きく、SQL ステートメントに少なくとも 1 つのパラメーター マーカーが含まれている場合、SQLExecDirectSQLBindParameter の呼び出しで ParameterValuePointer 引数によって指される配列からパラメーター値のセットごとに 1 回 SQL ステートメントを実行します。 詳細については、「 パラメーター値の配列」を参照してください。

ブックマークが有効になっていて、ブックマークをサポートできないクエリが実行された場合、ドライバーは属性値を変更し、SQLSTATE 01S02 (オプション値が変更されました) を返すことで、ブックマークをサポートする環境に強制する必要があります。 属性を変更できない場合、ドライバーは SQLSTATE HY024 (無効な属性値) を返す必要があります。

注意

接続プールを使用する場合、アプリケーションは、データベースまたはデータベースのコンテキストを変更する SQL ステートメント (SQL Server の USEdatabase ステートメントなど) を実行しないでください。このステートメントは、データ ソースで使用されるカタログを変更します。

コード例

SQLBindColSQLGetDataおよびサンプル ODBC プログラムを参照してください。

対象 解決方法については、
結果セット内の列へのバッファーのバインド SQLBindCol 関数
ステートメント処理の取り消し SQLCancel 関数
コミットまたはロールバック操作の実行 SQLEndTran 関数
準備された SQL ステートメントの実行 SQLExecute 関数
複数行のデータをフェッチする SQLFetch 関数
データブロックをフェッチする、または結果セットをスクロールする SQLFetchScroll 関数
カーソル名を返す SQLGetCursorName 関数
データの列の一部またはすべてをフェッチする SQLGetData 関数
データを送信する次のパラメーターを返す SQLParamData 関数
実行のためのステートメントの準備 SQLPrepare 関数
実行時のパラメーター データの送信 SQLPutData 関数
カーソル名の設定 SQLSetCursorName 関数
ステートメント属性の設定 SQLSetStmtAttr 関数

関連項目

ODBC API リファレンス
ODBC ヘッダー ファイル