每当更新主键值时,我都会尝试从sql-server-ce数据库中删除旧行(基于主键值)。
目标是(一旦提供新id)添加带有insert语句的新条目,然后删除旧条目。重要的是要知道数据库本身的主键(城市标签号)的数据类型是int,并且C#变量originalCTag被声明为var,但在声明时分配了“”(空字符串),然后分配所需目标主键值的字符串表示形式。
虽然这应该是一项简单的任务,但问题是:
为什么sql动作查询不起作用?在WebMatrix中使用C#,这是我尝试过的:
db.Execute("DELETE FROM Vaccinations WHERE [City Tag Number] = " + originalCTag);
^这表明在等号的索引处解析查询时出错。
db.Execute("DELETE FROM Vaccinations WHERE [City Tag Number] = @0", originalCTag);
^这表明输入字符串的格式不正确。
db.Execute("DELETE FROM Vaccinations WHERE [City Tag Number] = @0", int.Parse(originalCTag));
^这表明输入字符串的格式不正确。
db.Execute("DELETE FROM Vaccinations WHERE [City Tag Number] = @0", originalCTag.ToString());
^这(再次)说明输入字符串格式不正确(我们不能用DELETE语句参数化查询)吗?
所以......最后,我试过了:
db.Execute("DELETE FROM Vaccinations WHERE [City Tag Number] = '" + originalCTag + "'");
^这不会产生任何错误,但也没有做到它应该做的事情(例如,删除行)。
此时,我有点不知所措。我希望这些语句中至少有一个能够执行所需的功能,如果不是其中的几个。
显然,我错过了一些东西(如果有什么东西显而易见,我不会感到惊讶)。如果这些语句中的任何一个“应该有效”,那么在db.Execute语句之前我的代码可能还有其他问题。------------------- UPDATE ----------------- 如果您想查看db声明语句:
var db = Database.Open("Vaccinations");
是的,Vaccinations是数据库的名称和该数据库中的(唯一)表。
答案 0 :(得分:1)
组合的错误消息表明originalCTag持有的值不是数字。它很可能仍然是一个空字符串,因为这是你说你第一次指定它。您应该检查用于为其分配有效值的代码是否符合您的预期。
答案 1 :(得分:0)
VoidKing这就是你应该如何进行/构建参数化查询,因为我之前已经问过你是否可以在代码中粘贴一个部分的方法来尝试删除..我希望这个例子可以帮助你关于你应该如何设置你的查询..你还注意到我如何使用ExecuteNonQuery
vs执行
using (SqlCeConnection sqlConn = new SqlCeConnection("Your ConnectionString"))
{
sqlConn.Open();
using (SqlCeCommand sqlComm = new SqlCeCommand("Vaccinations WHERE [City Tag Number] = (@CityTagNumber)", sqlConn))
{
sqlComm.Parameters.AddWithValue("@CityTagNumber", originalCTag);
sqlComm.ExecuteNonQuery();
}
}