C言語+MySQL入門|今回作成する在庫管理アプリ

C言語+MySQL入門|今回作成する在庫管理アプリ

これから作るのは、商品の情報と在庫の増減を、C言語とMySQLで管理する在庫管理アプリです。

商品を登録して一覧表示するところから始め、入庫や出庫によって在庫数を更新し、その履歴を確認できるようにしていきます。

最初は、文字のメニューから操作するコンソール版を作ります。その後、GTK 4を使って、入力欄やボタンで操作できるGUI版へ進みます。

この記事では、完成するアプリの機能、管理するデータ、実際の操作の流れを紹介します。画面やデータは完成イメージを説明するための例です。まだプログラムの実装は行わず、これから何を作るのかを具体的に思い描いていきましょう。

商品と在庫の動きを管理するアプリを作ろう

在庫管理では、商品名や単価だけでなく、現在いくつあるのか、いつ増えたり減ったりしたのかを把握する必要があります。

たとえば、文房具を扱う小さな倉庫を考えてみましょう。

  • 新しく扱う商品を登録する
  • 届いた商品を入庫する
  • 必要な数量を出庫する
  • 現在の在庫数を確認する
  • 過去の入出庫を振り返る

今回のアプリでは、このような基本的な操作をできるようにします。

完成を目指す機能

機能できること操作の例
商品登録新しい商品を追加するノートを登録する
商品一覧登録済みの商品を確認する商品名、単価、在庫数を表示する
商品変更商品の基本情報を変更するノートの単価を変更する
商品削除条件を確認して商品を削除する誤って登録した商品を削除する
入庫在庫を増やして履歴を残すノートを30個入庫する
出庫在庫を減らして履歴を残すノートを6個出庫する
在庫履歴表示入出庫の記録を確認するノートがいつ何個動いたかを表示する

商品IDによる検索も、変更や削除、入出庫の対象を確認するために使います。

商品そのものの情報を管理する機能と、商品の数量の動きを管理する機能を組み合わせることが、今回のアプリの中心です。

アプリの操作とMySQLの保存データをつなぐ

利用者は、アプリのメニューやボタンを使って操作します。

その裏側では、Cプログラムが入力を確認し、Connector/Cを通してMySQL Serverへ処理を要求します。MySQL Serverは、商品情報や在庫履歴をデータベースへ保存します。

担当在庫管理アプリで行うこと
Cプログラム入力確認、処理の呼び出し、結果の表示
MariaDB Connector/CMySQLへの接続やSQLの実行を支える
MySQL Server商品情報と在庫履歴を管理する
GTK 4GUI版のウィンドウ、入力欄、ボタンなどを作る

たとえば、入庫の操作をした場合、アプリの画面にある数字だけを増やすのではありません。MySQLへ変更を保存し、その結果を画面へ反映します。

保存・確定した情報は、アプリを終了して再び起動したあとも、データベースから取得して利用できます。

図1:在庫管理アプリでできること

この図から分かること

今回のアプリでは、商品の基本情報と、入庫・出庫による数量の変化を管理します。

アプリは操作を受け付ける窓口となり、商品情報や履歴はMySQLに保存します。

利用者の操作、Cプログラムの処理、データベースへの保存がつながることで、在庫管理の機能が実現します。

商品情報として何を保存するのか

商品を管理するには、どのような項目を保存するかを決めます。

今回の教材では、次の情報を基本にします。

項目意味例
商品ID商品を識別する番号101
商品名商品の名前ノート
単価商品1個当たりの金額180円
在庫数現在管理している数量24個
登録日時商品を登録した日時2026-10-01 09:00:00

以降の金額は、円単位の例で説明します。日時も操作の流れを示すための例です。

商品IDで操作対象を特定する

商品名だけで商品を選ぶと、似た名前や同じ名前の商品がある場合に、どれを操作しているのか分かりにくくなります。

そこで、商品IDを使って対象を特定します。

商品ID商品名単価
101ノート180円
102ボールペン120円
103クリアファイル90円

単価の変更、削除、入庫、出庫などでは、対象の商品IDを確認して処理します。

GUI版では、一覧で選んだ行に対応する商品IDをアプリが保持することで、対象を指定できるようにします。

商品の登録・一覧・変更・削除を作る

データベースを使うアプリの基本操作は、CRUDと呼ばれることがあります。

操作英語今回のアプリでの機能
作成Create商品登録
読み取りRead商品一覧や商品検索
更新Update商品名や単価の変更
削除Delete商品削除

まずは、この4つの操作を動かせるようにして、在庫管理アプリの土台を作ります。

商品を登録する

商品登録では、商品名と単価を入力します。

完成イメージでは、在庫数を0から始め、実際に商品が入ってきた数量を入庫機能で記録します。こうすると、最初の在庫がどのように増えたかも履歴に残せます。

入力・処理する項目例
商品名ノート
単価180円
登録直後の在庫数0個
登録結果商品IDが割り当てられ、商品として保存される

商品IDの割り当て方法など、具体的なテーブルの定義は第3章で扱います。

商品を一覧表示する

商品一覧では、登録済みの商品を表形式で表示します。

次の表は、各商品を登録し、入出庫を行ったあとの表示例です。

商品ID商品名単価在庫数
101ノート180円24個
102ボールペン120円50個
103クリアファイル90円35個

利用者は、この一覧から商品IDや現在の在庫数を確認できます。

商品がまだ登録されていない場合は、空の画面だけを出すのではなく、商品が登録されていないことが分かるメッセージを表示します。

商品名や単価を変更する

商品変更では、商品名の修正や単価の変更を行います。

たとえば、ノートの単価を180円から200円へ変更する場合です。

項目変更前変更後
商品ID101101
商品名ノートノート
単価180円200円
在庫数24個24個

単価を変更しても、在庫数は変えません。

今回のアプリでは、商品の基本情報の変更と、入出庫による数量の変更を別の操作として扱います。

商品の削除では履歴との関係も確認する

商品削除では、削除対象を確認してから処理します。

ここで考える必要があるのが、過去の入出庫履歴です。

商品だけを削除すると、その商品に関する履歴をどう表示するのか、という問題が生じます。また、在庫が残っている商品を削除してよいかも決める必要があります。

  • 削除しようとしている商品は正しいか
  • 在庫が残っていないか
  • 過去の入出庫履歴があるか
  • 削除後も履歴との関係が保たれるか

具体的な削除条件と、履歴がある商品の扱いは、第3章のテーブル設計と第10章のアプリ設計で決めます。

削除ボタンを押せば何でも消せるようにするのではなく、データの関係を確認したうえで処理する機能として作っていきます。

入庫と出庫で在庫数を管理する

在庫管理アプリらしい機能が、入庫と出庫です。

入庫は在庫を増やす操作、出庫は在庫を減らす操作です。どちらも、対象の商品と数量を指定します。

入庫では在庫を増やす

登録直後のノートの在庫数が0個だったとします。

ノートが30個届いたら、商品IDと入庫数量を指定して入庫処理を行います。

項目内容
対象商品商品ID 101のノート
入庫前の在庫数0個
入庫数量30個
入庫後の在庫数30個

このとき、在庫数を増やすだけでなく、30個を入庫したという履歴も保存します。

出庫では在庫を減らす

続いて、ノートを6個出庫します。

項目内容
対象商品商品ID 101のノート
出庫前の在庫数30個
出庫数量6個
出庫後の在庫数24個

出庫でも、在庫数の変更と履歴の保存を行います。

数量には正の整数を入力し、入庫・出庫のどちらを行うかで増減を区別する形を基本にします。

在庫より多い数量は出庫しない

現在の在庫が24個なのに、25個の出庫を要求された場合は、処理を成立させないようにします。

項目内容
現在の在庫数24個
要求された出庫数量25個
操作結果在庫不足として出庫を受け付けない
操作後の在庫数24個

この場合、在庫数を変更せず、成功した出庫としての履歴も追加しません。

利用者には、在庫が不足していることを伝え、数量を確認できるようにします。

図2:入庫・出庫と在庫数の変化

この図から分かること

商品の登録後、入庫によって在庫が増え、出庫によって在庫が減ります。

この例では、0個から30個入庫し、6個出庫した結果、在庫数が24個になります。

在庫より多い数量の出庫は受け付けず、数量を変えないようにします。また、成功した入出庫については、在庫の変化を履歴へ残します。

在庫履歴で数量が変わった理由を確認する

現在の在庫数だけでは、どうしてその数量になったのかが分かりません。

そこで、入庫や出庫を行うたびに、その記録を在庫履歴として保存します。

項目記録する内容
履歴ID履歴を識別する番号
商品IDどの商品を操作したか
種別入庫か出庫か
数量何個動かしたか
記録日時いつ処理したか

ノートの履歴を表示する例

先ほどの操作を履歴として表示すると、次のようになります。

履歴ID商品ID商品名種別数量記録日時
1101ノート入庫30個2026-10-01 09:10:00
2101ノート出庫6個2026-10-01 10:30:00

この例では、初期在庫が0個なので、30個の入庫と6個の出庫から、現在の在庫24個につながっていることが分かります。

画面の商品名は、商品IDを使って商品テーブルと対応付けて表示します。履歴テーブルに商品情報をすべて重複して保存する必要はありません。

在庫履歴と商品情報の変更は区別する

今回の在庫履歴は、入庫・出庫による数量の動きを記録するものです。

商品名や単価の変更履歴まで、自動的に記録されるわけではありません。

操作今回の在庫履歴への記録
ノートを30個入庫する入庫として記録する
ノートを6個出庫する出庫として記録する
単価を180円から200円へ変更する入出庫履歴には記録しない
在庫不足で出庫できなかった成功した出庫としては記録しない

何を履歴として残しているかを明確にしておくと、画面に表示された記録を正しく読み取れます。

在庫の更新と履歴の保存を一緒に扱う

入庫や出庫では、少なくとも次の二つの変更が必要です。

  1. 商品テーブルの在庫数を更新する
  2. 在庫履歴テーブルに記録を追加する

どちらか片方だけ成功すると、データに食い違いが生じます。

起きたこと困ること
在庫数だけ減った何の操作で減ったのかを履歴から確認できない
履歴だけ追加された出庫した記録があるのに在庫数が変わっていない
両方が正しく反映された現在の在庫と入出庫の記録が対応する

この二つをひとまとまりとして扱うために、トランザクションを使う設計にします。

すべて成功したら確定し、途中で失敗したら変更を取り消す流れを作ります。複数のアプリが同じ商品を同時に操作する場面も考え、更新する時点で在庫不足を防ぐ処理を組み込みます。

詳しい実装は第8章で学び、完成版の入出庫機能へ組み込んでいきます。

最初は文字のメニューから操作する

コンソール版では、番号を選んで操作するメニューを用意します。

次は、完成イメージを表す表示例です。実行済みのプログラムの出力ではなく、これから作る画面の案として見てください。

コンソール版のメニュー表示例

在庫管理アプリ

1. 商品を登録する
2. 商品を一覧表示する
3. 商品情報を変更する
4. 商品を削除する
5. 入庫する
6. 出庫する
7. 在庫履歴を表示する
0. 終了する

操作を選んでください:

たとえば、入庫を選ぶと、商品IDと数量を入力する流れにします。

入庫操作の表示例

商品IDを入力してください:101

商品名:ノート
現在の在庫数:0個

入庫数量を入力してください:30

入庫しました。
入庫後の在庫数:30個

操作後は結果を表示し、メニューへ戻るようにします。

商品IDが存在しない場合や、数量の入力が適切でない場合は、その理由を表示して、データを変更せずに入力のやり直しやメニューへの復帰ができるようにします。

GUI版では入力欄やボタンから操作する

GUI版では、コンソール版で作った機能を、GTK 4の画面から呼び出します。

画面には、次のような部品を配置する予定です。

画面の部品用途
商品名の入力欄商品名を入力・編集する
単価の入力欄単価を入力・編集する
商品一覧商品を確認し、操作対象を選ぶ
数量の入力欄入庫・出庫する数量を指定する
操作ボタン登録、変更、削除、入庫、出庫などを実行する
履歴表示部分選択した商品の入出庫記録を確認する
メッセージ欄成功や入力エラーなどを伝える

商品が選択されていないときは、変更や削除などを実行できないようにすることも考えます。

ボタンを押したときに処理が動くだけでなく、今どの商品を操作しているか、操作が成功したかが分かる画面を目指します。

図3:コンソール版とGUI版で共通のDB処理を使う

この図から分かること

コンソール版とGUI版では、入力や表示の方法が異なります。

一方、商品登録や入出庫などのDB処理は、共通のC言語の関数として利用する方針です。画面ごとにデータベース操作をすべて書き直すのではなく、作った処理を再利用していきます。

図の共通のDB処理は、別のサーバーを表しているのではなく、各アプリに組み込む関数を表しています。

正しい操作と間違った操作の両方を確認する

アプリを完成させるときは、正しい入力で動くことに加えて、入力ミスや処理できない状況も確認します。

確認する場面期待する動き
正しい商品名と単価を入力する商品を登録する
商品名が空になっている入力を見直すように伝える
単価に負の値を入力する登録・変更を受け付けない
数量に文字や0、負の値を入力する入出庫を受け付けない
存在しない商品IDを指定する対象の商品がないことを伝える
在庫より多い数量を出庫する在庫を変えず、不足を伝える
履歴に関係する商品を削除しようとする決めた削除ルールに従って処理する
MySQL Serverへ接続できないDB操作ができないことを伝える

入力できる数値や文字列の上限も、データベースとCプログラムで扱える範囲に合わせて決めます。

また、失敗した操作に対して成功メッセージを表示しないことも重要です。処理結果を確認してから画面へ伝えるようにします。

一連の操作がつながることを完成の目標にする

機能を一つずつ作ったあと、商品登録から履歴確認までを通して操作します。

順序操作確認すること
1ノートを単価180円で登録する商品が保存され、在庫数が0になる
2ノートを30個入庫する在庫数が30になり、入庫履歴が残る
3ノートを6個出庫する在庫数が24になり、出庫履歴が残る
425個の出庫を試す在庫不足として処理され、在庫数が24のままになる
5単価を200円へ変更する単価だけが変わり、在庫数は変わらない
6在庫履歴を表示する30個の入庫と6個の出庫を確認できる
7アプリを終了して再起動する保存済みの商品と履歴を再び取得できる

個々の機能が動くだけでなく、操作を続けても商品情報・在庫数・履歴が対応していることを確かめます。

こうした確認を重ねながら、まずコンソール版を完成させ、そのDB処理をGUI版へつなげていきます。

次の記事では、なぜコンソール版から始めるのか、どの処理を共通化してGUI版へ進むのかを詳しく見ていきましょう。

Follow me!