2

每当更新主键值时,我都试图从 sql-server-ce 数据库中删除旧行(基于主键值)。

目标是(一旦提供了新 ID)使用插入语句添加新条目,然后删除旧条目。重要的是要知道数据库本身的主键(城市标记号)的数据类型是 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");

是的,疫苗接种是数据库的名称和该数据库中的(唯一)表。

4

2 回答 2

1

合并的错误消息表明 originalCTag 保存的值不是数字。它很可能仍然是一个空字符串,因为这是您所说的您首先将其分配给的字符串。您应该检查用于为其分配有效值的代码是否符合您的想法。

于 2012-12-31T20:10:33.167 回答
0

VoidKing 这是你应该如何做/构建你的参数化查询,因为我之前问过你是否可以将一个部分的方法粘贴到你尝试删除的代码中。我希望这个例子可以帮助你您应该如何设置查询的 .. 还要注意我是如何使用ExecuteNonQueryvs Execute

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();
  }
}
于 2012-12-31T20:17:34.760 回答