SQLiteは軽量で扱いやすい反面、特有のエラーやトラブルにハマりやすいデータベースです。 この記事では、現場でよく遭遇する問題を原因 → 解決策の順でまとめています。
この記事でわかること
・syntax error の原因
・database is locked の対処法
・no such table の原因
・パス・権限エラー
・型エラー(NULL / GetInt32)
・バックアップ時の注意点
・業務アプリ向けベストプラクティス
・syntax error の原因
・database is locked の対処法
・no such table の原因
・パス・権限エラー
・型エラー(NULL / GetInt32)
・バックアップ時の注意点
・業務アプリ向けベストプラクティス
1. 「near 'xxx': syntax error」
原因
- SQL文の前後に余計な文字がある
- スペース抜けでSQLがつながっている
- カンマ・括弧の閉じ忘れ
例(スペース抜け)
"SELECT * FROM Users" + "WHERE Age > 20"
対処法
- SQLは1行 or @"" の複数行文字列で書く
- 連結する場合は必ずスペースを入れる
2. 「database is locked」
原因
- 同じDBを複数接続が同時に開いている
- reader を閉じていない
- using を使っていない
対処法
- 接続は必ず using で閉じる
- reader も using で閉じる
- 同時書き込みを避ける
3. 「no such table: xxx」
原因
- テーブルが存在しない
- DBファイルのパスが違う(別DBを見ている)
- 相対パスで実行フォルダが変わっている
対処法
- CREATE TABLE を実行したか確認
- 絶対パスで指定してみる
- 実行時のカレントディレクトリを確認
4. 「unable to open database file」
原因
- パスが存在しない
- 権限がないフォルダに置いている
- 相対パスで実行フォルダが変わっている
対処法
- 絶対パスで確認する
- Program Files に置かない
- 書き込み可能なフォルダに置く
5. 「constraint failed」
原因
- PRIMARY KEY の重複
- NOT NULL に NULL を入れた
- UNIQUE 制約に違反
対処法
- INSERT前に存在チェック
- NOT NULL の列に値を入れる
6. NULLによる型エラー(GetInt32 / GetString)
原因
GetInt32 / GetString は NULL を許容しない。
対処法
var age = reader.IsDBNull(2) ? (int?)null : reader.GetInt32(2);
7. バックアップ時のトラブル
■ ファイルコピーで壊れるケース
- 書き込み中にコピーした
- ロック中にコピーした
■ 安全なバックアップ方法
- SQLiteのオンラインバックアップAPIを使う
- VACUUM INTO を使う
オンラインバックアップAPI(C#)
using var src = new SqliteConnection("Data Source=app.db");
using var dst = new SqliteConnection("Data Source=backup.db");
src.Open();
dst.Open();
src.BackupDatabase(dst);
8. パフォーマンス低下(遅い)
原因
- インデックスが無い
- 大量データを全件SELECTしている
- VACUUMしていない
対処法
- WHERE句に使う列にインデックスを貼る
- LIMIT / OFFSET を使う
- VACUUMで最適化
9. 業務アプリでのベストプラクティス
- 接続・reader は必ず using で閉じる
- SQLは必ずパラメータ化する
- DBファイルは Program Files に置かない
- バックアップはオンラインバックアップAPIが最も安全
- 大量データはインデックス必須
- 世代管理(複数バックアップ)を行う
まとめ:SQLiteのトラブルは原因が決まっている
- syntax error → SQLの前後が壊れている
- locked → 接続/readerを閉じていない
- no such table → パス違い or テーブル未作成
- NULL → IsDBNullでチェック
- パスエラー → 絶対パスで確認
- バックアップ → オンラインバックアップAPIが最強
SQLiteは軽量で扱いやすい反面、 トラブルの原因はほぼパターン化されています。 この記事を参考にすれば、ほとんどの問題はすぐ解決できます。