我正在开发一个与Compact SQL Server(.sdf)接口的小型费用/收入跟踪C#控制台程序。数据库存储费用,简单的命令行输入允许用户根据DB中的索引号删除条目。这是我得到的错误。
“解析查询时出错。[令牌行号= 1,令牌行偏移= 32,错误令牌=索引]”
以下是删除条目的代码。
else if (ans.Equals("REMOVE"))
{
Console.WriteLine("Which entry?");
deleteTrans(Console.ReadLine(), conn);
displayDB(conn);
}
}
static void deleteTrans(string index, SqlCeConnection conn)
{
SqlCeCommand deleteCmd = new SqlCeCommand("DELETE FROM Transactions WHERE Index=" + index, conn);
try
{
deleteCmd.ExecuteNonQuery();
}
catch (SqlCeException ex)
{
Console.WriteLine("You failed!\n" + ex.Message);
}
}
数据库有5列(日期,描述,金额,代码,索引)
日期 - 数据类型(bigint) - 长度(8) - 允许空(是) - 唯一(否) - 主键(否)
描述 - 数据类型(ncarchar) - 长度(50) - 允许空(是) - 唯一(否) - Prim Key(No)
金额 - 数据类型(金钱) - 长度(19) - 允许空(否) - 唯一(否) - 主键(否)
代码 - 数据类型(nvarchar) - 长度(4) - 允许空(否) - 唯一(否) - Prim键(否)
索引 - 数据类型(bigint) - 长度(8) - 允许空(否) - 唯一(是) - Prim Key(No)
答案 0 :(得分:0)
Index
是reserved word in SQL CE,因此您需要将其放在方括号中,或者(更好)将列重命名为不使用保留字。
此外,您应该参数化您的查询而不是动态生成它,如下所示:
SqlCeCommand deleteCmd = new SqlCeCommand("DELETE FROM Transactions WHERE [Index]=@Index", conn);
var indParam = new SqlCeParameter("@Index", SqlDbType.BigInt, int.Parse(index));
deleteCmd.Parameters.Add(indParam);
try
{
deleteCmd.ExecuteNonQuery();
}
catch (SqlCeException ex)
{
Console.WriteLine("You failed!\n" + ex.Message);
}