SQLite のテーブルにレコードを挿入する (INSERT文の実行) - C#

SQLite のテーブルにレコードを挿入するコードを紹介します。

概要

SQLiteのテーブルにレコードを挿入するには、SQLのINSERT文を実行します。

プログラム例

UI

下図のUIを作成します。ボタンとテキストボックスを配置します。今回は[button3]のみを利用します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;

namespace SimpleSQLiteDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
      SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;");
      con.Open();
      try {
        string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380);";
        sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250);";
        sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160);";

        SQLiteCommand com = new SQLiteCommand(sql, con);
        com.ExecuteNonQuery();
      }
      catch (SQLiteException exc) {
        System.Diagnostics.Debug.WriteLine(exc.Message);
      }
      finally {
        con.Close();
      }
    }
  }
}

解説

SQLiteConnectionオブジェクトを作成します。
  SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;");

SQLiteConnectionオブジェクトのOpenメソッドを呼び出しデータベースを開きます。開いたデータベースは確実に閉じる動作とするためfinallyブロックでSQLiteConnectionオブジェクトのCloseメソッドを呼び出し、必ずデータベースが閉じられる動作とします。
  con.Open();
  try {
    string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380);";
    sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250);";
    sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160);";

    SQLiteCommand com = new SQLiteCommand(sql, con);
    com.ExecuteNonQuery();
  }
  catch (SQLiteException exc) {
    System.Diagnostics.Debug.WriteLine(exc.Message);
  }
  finally {
    con.Close();
  }
tryブロック内でSQLの実行をします。実行するSQL文の文字列を準備します。SQLiteでは改行コードではSQL文の区切りとはみなされず、例外が発生し実行が停止するため、複数のSQL文を実行する場合は";"で区切り実行します。
INSERT文は結果レコードを返さないSQL文のため、ExecuteNonQuery メソッドを呼び出しSQL文を実行します。
  string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380);";
  sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250);";
  sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160);";

  SQLiteCommand com = new SQLiteCommand(sql, con);
  com.ExecuteNonQuery();

補足:エラーが発生するSQL文と実行可能なSQL文

下記のSQLは問題なく実行できます。
string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380);";
  sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250);";
  sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160);";

改行コードでSQL文を区切った下記SQLは例外が発生します。
string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380)\r\n";
  sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250)\r\n";
  sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160)\r\n";
例外がスローされました: 'System.Data.SQLite.SQLiteException' (System.Data.SQLite.dll の中)
SQL logic error
near "insert": syntax error
SQLite error (1): near "insert": syntax error

";"と改行コードで区切った場合は例外は発生せず、SQL文は正しく実行できます。
string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380);\r\n";
  sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250);\r\n";
  sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160);\r\n";

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button3]をクリックします。画面では特に反応はありません。


こちらの記事で実装した[button4]をクリックします。SQLのSELECT文を利用して、テーブルのレコードを取得してテキストボックスに表示します。[button3]で挿入したレコードがテキストボックスに表示されることが確認できます。


[button3]を複数回クリックすると、クリックした回数3レコードずつレコードが追加されます。

補足:usingを利用した記述方法

例外をキャッチしない場合は、usingを利用するとシンプルにコードを記述できます。

コード例

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;

namespace SimpleUsingSQLiteDemo
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
      using (SQLiteConnection con = new SQLiteConnection("Data Source=mydb.sqlite;Version=3;")) {
        con.Open();

        string sql = "insert into products (id, code, name, price) values (1,'C-001','ぺんぎんケーキ', 380);\r\n";
        sql += "insert into products (id, code, name, price) values (2,'C-002','らくだカステラ', 250);\r\n";
        sql += "insert into products (id, code, name, price) values (3,'C-003','くじらキャンディ', 160);\r\n";

        SQLiteCommand com = new SQLiteCommand(sql, con);
        com.ExecuteNonQuery();
      }

    }

    
  }
}

解説

SQLiteConnection オブジェクトを作成するコードをusingで囲むことにより、usingのブロックを抜けた際に自動的にSQLiteConnectionをCloseします。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-04-27
作成日: 2018-04-24
iPentec all rights reserverd.