检查更新的行数

时间:2010-11-10 07:53:58

标签: c# ado.net

嘿,我在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;
    }
}

3 个答案:

答案 0 :(得分:5)

ExecuteNonQuery可以返回受影响的行数;你可以抓住它并作出相应的反应;你通常期望它是1(除非你有触发器等):

  

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

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

答案 1 :(得分:3)

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

答案 2 :(得分: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; 
}