【发布时间】: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