SQL DELETE - 解析查询时出错

时间:2013-11-12 15:29:43

标签: sql parsing token offset sql-delete

我正在开发一个与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)

1 个答案:

答案 0 :(得分:0)

Indexreserved 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);
}