【问题标题】:C# local database update errorC#本地数据库更新错误
【发布时间】:2015-01-21 02:11:03
【问题描述】:

问题是我正在尝试写入一个名为Login 的表。它有几列,有一列(空)中没有数据,我正在尝试插入/更新该列是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,错误令牌=Key]

有什么帮助吗?谢谢!

【问题讨论】:

  • 你正在使用 Sql Server Compact 那么不要用 MySql 标记这个问题

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


【解决方案1】:

密钥是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 release1 中。大多数生成(“动态”)查询的 ORM 等默认情况下都会转义这些值,只是为了“安全起见”。

1 即使关键字当前不在该列表中,也可能会在未来的版本中添加。使用CustomerIdMyVerySpecificName 之类的名称可能是安全的,但Key 之类的通用词(您刚刚发现)GUIDVersionDescending,虽然目前没有保留,但使用起来并不(未来)安全。

【讨论】:

    【解决方案2】:

    Key 是一个保留关键字

    使用括号将其转义[key]

    查看完整列表Reserved Keywords (Transact-SQL)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多