C#本地数据库更新错误

时间:2015-01-20 17:44:15

标签: c# database runtime-error sql-server-ce

问题是我正在尝试写入一个名为Login的表。它有几列,有一个没有数据的列(null),我试图插入/更新列是SuperSecretKey - nvarchar(100)

下面是代码:

public void InsertSecretKey(String SuperKey, int IDKey)
{
    conn = new SqlCeConnection(@"Data Source=|DataDirectory|\Database1.sdf");
    conn.Open();

    SqlCeCommand cmd = new SqlCeCommand();
    cmd.CommandText = "UPDATE Login SET SuperSecretKey = @SuperKey WHERE Key=@IDKEY;";
    cmd.Connection = conn;

    cmd.Parameters.AddWithValue("@SuperKey", SuperKey);
    cmd.Parameters.AddWithValue("@IDKey", IDKey);

    cmd.ExecuteNonQuery();
    conn.Close();
}

这是错误:

  

解析查询时出错   [令牌行号= 1,令牌行偏移= 51,令牌错误=密钥]

有任何帮助吗?谢谢!

2 个答案:

答案 0 :(得分:5)

键是reserved word。该错误非常具体:offset = 51 =>在第51位,有key这个词。它实际上告诉你:Token in error = Key

你需要逃避它,例如[key]。逃离所有你的字段名,表等是一个好习惯:

cmd.CommandText = "UPDATE [Login] SET [SuperSecretKey] = @SuperKey WHERE [Key]=@IDKEY;";

当前版本的SQL Server中的保留关键字可能位于new/future release 1 中。生成("动态")查询的大多数ORM等在默认情况下都会逃避这些值,只是为了安全起见""。

1 即使关键字不在目前列表中,也可以在将来的版本中添加。使用CustomerIdMyVerySpecificName等名称可能会安全,但Key 之类的通用词(您刚刚发现),{{1} },GUIDVersion,虽然目前尚未保留,但不会(未来)安全使用。

答案 1 :(得分:3)

Key是保留关键字

使用括号来转义它[key]

有关完整列表,请检查Reserved Keywords (Transact-SQL)