2010-11-10 61 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; 
}