问题是我正在尝试写入一个名为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,令牌错误=密钥]
有任何帮助吗?谢谢!
答案 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 即使关键字不在目前列表中,也可以在将来的版本中添加。使用CustomerId
和MyVerySpecificName
等名称可能会安全,但Key
之类的通用词(您刚刚发现),{{1} },GUID
或Version
,虽然目前尚未保留,但不会(未来)安全使用。
答案 1 :(得分:3)