我有一个我为新项目创建的SQLite表。
表的 CREATE 和 INSERT 命令定义如下:
public const string SQL_CREATE = "CREATE TABLE Tanks " +
"(LocID INTEGER, InUse INTEGER, Text1 TEXT, Description1 TEXT);";
public const string SQL_INSERT = "INSERT INTO Tanks " +
"(LocID, InUse, Text1, Description1) " +
"VALUES " +
"@LocID, @InUse, @Text, @Description); ";
每当我尝试将我的第一个值保存到表中时,我收到了无用的消息,“ SQLite错误附近的”@LocID“语法错误。”
这是我的插入例程:
public static Tank New(Tank tank) {
tank.Result = 0;
using (SQLiteConnection con = GetConnection) {
try {
con.Open();
using (SQLiteCommand cmd = new SQLiteCommand(Tank.SQL_INSERT, con)) {
cmd.Parameters.AddWithValue("@LocID", tank.LocationID); // = 1
cmd.Parameters.AddWithValue("@InUse", tank.InUse); // = 1 (for true)
cmd.Parameters.AddWithValue("@Text", tank.Text); // says "New Tank"
cmd.Parameters.AddWithValue("@Description", DBNull.Value); // I've tried "New Tank" and DBNull.Value
try {
tank.Result = cmd.ExecuteNonQuery();
} catch (SQLiteException err) {
tank.Result = -1;
LogError("New(Tank)", err);
throw err;
}
}
} finally {
con.Close();
}
}
return tank;
}
我没有使用索引创建数据库,我没有插入索引值,因为文档说:“每个表的每一行都有一个64位有符号整数ROWID。每行的ROWID是唯一的在同一个表中的所有行中。“在同一页面中稍微向下,它说,”如果在插入上没有指定ROWID,或者如果指定的ROWID的值为NULL,则自动创建适当的ROWID。“来源:sqlite.org/autoinc
错误发生在ExecuteNonQuery()
。
我做错了什么?
在Win7 Visual Studio 2008(C#)中使用SQLite 3,以Windows Mobile 5(Pocket PC)为目标。
答案 0 :(得分:4)
你错过了SQL_INSERT字符串中@LocID之前的左括号。
public const string SQL_INSERT = "INSERT INTO Tanks " +
"(LocID, InUse, Text1, Description1) " +
"VALUES " +
"(@LocID, @InUse, @Text, @Description); ";
答案 1 :(得分:2)
您错过了(
。这样做:
public const string SQL_INSERT = "INSERT INTO Tanks " +
"(LocID, InUse, Text1, Description1) " +
"VALUES " +
"(@LocID, @InUse, @Text, @Description); ";