2010-11-10 62 views
1

嘿,我在C#中使用SQL进行数据库连接,但是存在一些我想要覆盖的缺点。例如当我更新时即使有没有记录也不会显示错误也不会更新。与DELETE相同的情况。检查更新的行数

private void button3_Click(object sender, EventArgs e) 
{ 
    setData(); 
    bool flag = db.UpdateData("UPDATE trytb SET Name = '"+dc.Name+"' WHERE ID = '"+dc.ID+"'"); 
    if (flag) 
     MessageBox.Show("Record Updated"); 
    else 
     MessageBox.Show("Not Updated"); 
} 

public bool DeleteData(string qry) 
{ 
    try 
    { 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand(qry, conn); 
     cmd.ExecuteNonQuery(); 
     flag = true; 
     conn.Close(); 
     return flag; 
    } 
    catch 
    { 
     return flag; 
    } 
} 
+0

你是依靠标志为默认为false。这是行得通的,但这是不好的做法,很难理解/理解 – smirkingman 2010-11-10 08:00:18

+3

A旁注:请使用参数化查询而不是字符串连接来避免SQL注入攻击。 – 2010-11-10 08:01:04

+2

@大卫 - 糟糕的“鲍比表”*会*不高兴,如果你修复... – 2010-11-10 08:05:56

回答

3

您的标志变量被无条件设置为true。您应该根据cmd.ExecuteNonQuery()的返回值将其设置为true。这会告诉你是否有零个或多个记录被更新/删除。基于此,你可以设置你的旗帜。

+0

谢谢它的工作 – salman 2010-11-10 08:29:47

5

ExecuteNonQuery可以返回受影响的行数;你可以捕捉到并作出相应的反应;你会一般希望它是1(除非你有触发器等):

对于UPDATE,INSERT和DELETE语句,返回值是受该命令影响的行数。当插入或更新的表上存在触发器时,返回值包括受插入或更新操作以及触发器或触发器影响的行数影响的行数。对于所有其他类型的语句,返回值为-1。如果发生回滚,返回值也是-1。

对于更复杂的查询,返回有关@@ROWCOUNT(在查询的一些点捕获)的值可能是有用的,与沿ExecuteScalar。在某些情况下,您可能需要手动检查数据是否存在。

0

如何重构你的代码是这样的:

private buttonUpdate_Click((object sender, EventArgs e) 
{ 
    // You should use parameterized query. But for now, this example would do. 
    string sql = "UPDATE TABLE SET NAME = " + dc.Name + " WHERE ID = '" + dc.ID +"'"; 
    bool flag = UpdateRecord(sql); 

    if(flag) 
     MessageBox.Show("Record updated!"); 
    else 
     MessageBox.Show("Update failed!"); 
} 

private bool UpdateRecord(sql) 
{ 
    bool flag = false; // Presume update failed. 

    SqlConnection conn = new SqlConnection(yourConnString); 
    try 
    { 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand(sql); 
     flag = (bool)cmd.ExecuteNonQuery(); 
    } 
    catch 
    { 
      // Do some error logging. 
    } 
    finally 
    { 
     // Finally block always execute, so close here your connection and return here the flag value. 
     conn.Close(); 
     return flag; // Return default value of flag, (false) 
    } 
    return flag; 
}