よろしくお願いします。
とあるDBを、c#でSQLiteを使って作りたいです。
WindowsFormアプリケーションで使用するので、
VisualStdio Community 2015 で作成しています。
Windows8.1です。
テーブルを作成するクリエイト文で、
型 'System.Data.SQLite.SQLiteException' のハンドルされていない例外が
System.Data.SQLite.dll で発生しました追加情報:SQL logic error or missing database
near "(": syntax error
というエラーが発生します。
コードは以下の通りです。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
/****** DB,TABLE,レコード作成のソースコード******/
//dbファイル名
string db_file = "test.db";
//db接続
using (var conn = new SQLiteConnection("Data Source=" + db_file))
{
//dbを開く
conn.Open();
//コマンド生成宣言
using (SQLiteCommand command = conn.CreateCommand())
{
//create文格納
command.CommandText = "create table AAA(aaa_cd TEXT(2) PRIMARY KEY NOT NULL, aaa_nm TEXT(40) NOT NULL)";
//コマンド実行
command.ExecuteNonQuery();
}
//コマンド生成宣言
using (SQLiteCommand command1 = conn.CreateCommand())
{
command1.CommandText = "create table BBB(bbb_cd TEXT(4) PRIMARY KEY NOT NULL, bbb_nm(40) TEXT NOT NULL)";
command1.ExecuteNonQuery();
}
//コマンド生成宣言
using (SQLiteCommand command2 = conn.CreateCommand())
{
command2.CommandText = "create table CCC(aaa_cd TEXT(2) PRIMARY KEY NOT NULL, bbb_cd TEXT(4) NOT NULL)";
command2.ExecuteNonQuery();
}
//トランザクション処理
using (SQLiteTransaction sqlt = conn.BeginTransaction())
{
//コマンド生成宣言
using (SQLiteCommand command = conn.CreateCommand())
{
//List<AAA>のレコード一覧をforeachで回しながらTABLEに格納する処理
foreach (AAATable m in mList)
{
//insert文格納
command.CommandText = "insert into AAA(aaa_cd,aaa_nm) values('" + m.aaa_cd + "', '" + m.aaa_nm + "')";
//コマンド実行
command.ExecuteReader();
}
//List<BBBTable>のレコード一覧をforeachで回しながらTABLEに格納する処理
foreach (BBBTable m in mList2)
{
//insert文格納
command.CommandText = "insert into BBB(bbb_cd,bbb_nm) values('" + m.bbb_cd + "', '" + m.bbb_nm + "')";
//コマンド実行
command.ExecuteReader();
}
//List<CCCTable>のレコード一覧をforeachで回しながらTABLEに格納する処理
foreach (CCCTable m in mList3)
{
//insert文格納
command.CommandText = "insert into CCC(aaa_cd,bbb_cd) values('" + m.aaa_cd + "', '" + m.bbb_cd + "')";
//コマンド実行
command.ExecuteReader();
}
}
//トランザクション処理終了
sqlt.Commit();
}
//dbを閉じる
conn.Close();
}
/**************************************
ここから各Tableのダミーデータ作成
**************************************/
//AAATableのダミーデータ作成
private class AAATable
{
public string aaa_cd;
public string aaa_nm;
public AAATable(string _aaa_cd, string _aaa_nm)
{
aaa_cd = _aaa_cd;
aaa_nm = _aaa_nm;
}
}
//BBBTableのダミーデータ作成
private class BBBTable
{
public string bbb_cd;
public string bbb_nm;
public BBBTable(string _bbb_cd, string _bbb_nm)
{
bbb_cd = _bbb_cd;
bbb_nm = _bbb_nm;
}
}
//CCCTableのダミーデータ作成
private class CCCTable
{
public string aaa_cd;
public string bbb_cd;
public CCCTable(string _aaa_cd, string _bbb_cd)
{
aaa_cd = _aaa_cd;
bbb_cd = _bbb_cd;
}
}
/************* ここまで **************/
/**************************************
ここから格納するレコード一覧
**************************************/
//AAATablに格納するレコード一覧
List<AAATable> mList = new List<AAATable>()
{
new AAATable(@"xx",@"あああ"),
new AAATable(@"yy",@"いいい"),
new AAATable(@"zz",@"ううう"),
};
//BBBTableに格納するレコード一覧
List<BBBTable> mList2 = new List<BBBTable>()
{
new BBBTable(@"u",@"わ"),
new BBBTable(@"v",@"を"),
new BBBTable(@"w",@"ん"),
};
//CCCTableに格納するレコード一覧
List<CCCTable> mList3 = new List<CCCTable>()
{
new CCCTable(@"xx",@"u"),
new CCCTable(@"yy",@"v"),
new CCCTable(@"zz",@"w"),
};
/************* ここまで **************/
}
}
この中で、
//コマンド生成宣言
using (SQLiteCommand command1 = conn.CreateCommand())
{
command1.CommandText = "create table BBB(bbb_cd TEXT(4) PRIMARY KEY NOT NULL, bbb_nm(40) TEXT NOT NULL)";
command1.ExecuteNonQuery();
}
2つ目のクリエイト文を実行するExecuteNonQuery();でエラーが発生しています。
最後の } にブレークポイントを設定し実行するとエラーが発生し、
ExecuteNonQuery();の行にブレークポイントを設定して実行すると、ブレークポイントで止まります。(ブレークが実行される?)
エラー文の通りの原因ではなく、恐らく複数のテーブルを作成するコードの書き方自体が間違っているのではないかと思ってはいるのですが、調べてみても予約語が使われていた例やDBのパスがちゃんと設定されていないだとかといった物しか出てきませんでした。
参考になるサイトや原因、解決策等何でも良いので意見がほしいです。
よろしくお願いします。
/****追記****/
一部コードを変えてもダメでした。
//コマンド生成宣言
using (SQLiteCommand command = conn.CreateCommand())
{
//create文格納
command.CommandText = "create table AAA(aaa_cd TEXT(2) PRIMARY KEY NOT NULL, aaa_nm TEXT(40) NOT NULL)";
//コマンド実行
command.ExecuteNonQuery();
}
//コマンド生成宣言
using (SQLiteCommand command1 = conn.CreateCommand())
{
command1.CommandText = "create table BBB(bbb_cd TEXT(4) PRIMARY KEY NOT NULL, bbb_nm(40) TEXT NOT NULL)";
command1.ExecuteNonQuery();
}
//コマンド生成宣言
using (SQLiteCommand command2 = conn.CreateCommand())
{
command2.CommandText = "create table CCC(aaa_cd TEXT(2) PRIMARY KEY NOT NULL, bbb_cd TEXT(4) NOT NULL)";
command2.ExecuteNonQuery();
}