【问题标题】:Error trying to dynamically delete a row from a sql server ce database using WebMatrix [closed]尝试使用 WebMatrix 从 sql server ce 数据库中动态删除行时出错 [关闭]
【发布时间】:2012-12-31 19:46:24
【问题描述】:

每当更新主键值时,我都会尝试从 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 语句之前我的代码可能还有其他问题。

-----------------更新----------------- 如果您想查看 db 声明语句:

var db = Database.Open("Vaccinations");

是的,Vaccinations 是数据库的名称和该数据库中的(唯一)表。

【问题讨论】:

  • VoidKing 我认为如果没有发布错误,发布此代码所在的方法可能会有所帮助,问题可能是您没有进行正确的错误处理..请显示您如何连接到数据库它会让其他人了解您可能在哪里犯了错误也尝试更改您的查询在执行插入时您应该使用参数化查询以及@0 是数据库中的一个参数,如果现在那么您需要使用@Paramater Names 这将利用 Parameters.AddWithValues() 方法...
  • @DJKRAZE 感谢您的帮助,但我在这个站点中有几个 db.Execute 和 db.Query 语句(一个直接在此处尝试的 DELETE 语句上方),所以我知道连接很好。另外,我并没有尝试插入语句,如果您阅读我的示例,您会发现我多次尝试使用参数化查询。
  • 我的意思是写 Delete 而不是 Insert..但是使用通常用于 Select 语句的 Execute Query 与 ExecuteNonQuery.. 之间存在差异。
  • 您尝试使用参数化查询实际上是不正确的..
  • @DJKRAZE 实际上,代码显示了一个使用 ASP.NET Web Pages Database Helper 的有效参数化查询。

标签: c# sql-server sql-server-ce webmatrix


【解决方案1】:

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

【讨论】:

  • 再一次,你是对的。我意识到问题所在只会让我听起来更笨,但是,我在页面开头声明了变量字符串 originalCTag = "",而只在 (!IsPost) 分支中为其分配了我想要的实际值(愚蠢,因为在发布后它会将其重置为空字符串,并且由于它是一个帖子,因此永远不会重新分配)。对此感到抱歉。
【解决方案2】:

VoidKing 这是你应该如何做/构建参数化查询的方式,正如我之前问过你的那样,你是否可以将一个部分的方法粘贴到你尝试删除的代码中。我希望这个例子可以帮助您应该如何设置查询的..还请注意我如何使用ExecuteNonQuery vs 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();
  }
}

【讨论】:

  • 我建议您阅读 ASP.NET 网页框架 - 特别是数据访问:asp.net/web-pages/tutorials/data/5-working-with-data
  • Mike 这是对我的建议还是对 OP..?而且我很清楚访问数据库的许多不同方式,无论是 asp.net 还是 C# winforms、webservices、window services、wcf 等......
  • 这是针对您的建议。 OP 已经知道 Database Helper。您似乎对它或 Web Pages 框架一无所知。
  • LOL Mike .. 我认为如果您不知道数据库连接性,无论它是否是帮助程序.. 如果您认为只有一种方法可以连接到数据库.. 那么我认为你似乎对网页一无所知,它是.NET Framework btw ..
  • @DJKRAZE 我不相信我的任何一个 cmets 不专业,但如果你被他们中的任何一个冒犯了,那当然不是我的意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多