2012-08-13 53 views
3

我在我的SQL delete查询逻辑错误,不会给任何错误在Visual Studio和数据库中DELETE语句的查询工作不正常

这里没有删除该纪录是我的代码片段

SqlCommand cmd = new SqlCommand(
    @"DELETE FROM table_name 
    WHERE item_id=" + itmIDs + 
     " AND vendor_id=" + vendIDs + 
     " AND dozen=" + selectedItmDzn + 
     " AND quantity=" + selectedItmQty + 
     " AND total_price=" + selectedItmTotPrc + "", 
    con); 
cmd.ExecuteNonQuery(); 

这里是我的conString

SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=InvenotyBB;Integrated Security=SSPI")

我已经证实,其他动词选择更新工作,只是不适合特定命令删除

+2

你可以将SQL存储在变量中并显示'Console.WriteLine(sql)'的结果吗?你也可以检查你的连接字符串,并确认你没有使用像'User Instance'和'AttachDbFileName'这样的愚蠢和误导性的功能? – 2012-08-13 16:02:23

+0

如果你粘贴到sql server中,那个查询是否运行?如果你通过它,所有的变量得到正确填写? – Adam 2012-08-13 16:02:30

+4

数据库中的表名为'table_name'吗? – 2012-08-13 16:02:42

回答

2

鉴于这种原代码(通过我的格式):

SqlCommand cmd = new SqlCommand(
    @"DELETE FROM table_name 
    WHERE item_id=" + itmIDs + 
     " AND vendor_id=" + vendIDs + 
     " AND dozen=" + selectedItmDzn + 
     " AND quantity=" + selectedItmQty + 
     " AND total_price=" + selectedItmTotPrc + "", 
    con); 
cmd.ExecuteNonQuery(); 

让我们将其更改为:

string deleteQuery = 
    @"DELETE FROM table_name 
    WHERE item_id=" + itmIDs + 
     " AND vendor_id=" + vendIDs + 
     " AND dozen=" + selectedItmDzn + 
     " AND quantity=" + selectedItmQty + 
     " AND total_price=" + selectedItmTotPrc + ""; 
SqlCommand cmd = new SqlCommand(deleteQuery, con); /* set a breakpoint here */ 
cmd.ExecuteNonQuery(); 

设置断点,然后复制粘贴该查询此评论,所以我们可以看到它。

+1

或者,你知道...'Console.WriteLine(deleteQuery);':) – swasheck 2012-08-13 18:25:27

+2

你假设他是有一个控制台可以写信给。大的假设。 – jcolebrand 2012-08-13 18:36:10

+0

因此是笑脸。我通常会在控制台中测试我的sql代码,然后再将它移动到应用程序中 - 通常是出于这个原因。 – swasheck 2012-08-13 18:56:42

3

我几乎可以保证你的连接字符串:

User Instance=true;AttachDbFileName=|Data Directory|...something.mdf; 

如果是这样的情况下,停止这样做。 AttachDbFileName功能实际上会创建数据库文件的副本。因此,您在Management Studio或Visual Studio中打开的应用程序与您的应用程序通过连接字符串创建的应用程序不同。你的应用程序从副本中删除,没有例外(因为它工作),你刷新原来的,它看起来不起作用。

看到答案来自@ marc_s在这里:

https://stackoverflow.com/a/7222952/61305

如果不是它的话,我怀疑是(a)被忽略的错误是由于try/catch某处,或(b)你的方法用于检查命令是否有效。例如,如果您依赖计数,并且where子句匹配零行,则命令可以工作,但它不会删除任何内容,因此计数保持不变。

如果这些都不是真的,那么转到我的答案的第1行。这里没有魔法,删除命令会影响0行或更多行,否则会返回异常。其他任何事情只能通过不正确的故障排除/调试来解释。