2010-11-10 2 views
1

эй, я сделал соединение db в 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

Вы полагаетесь на флаге ложные по умолчанию. Это работает, но это плохая практика и трудно читать/понимать. – smirkingman

+3

Боковое оповещение: пожалуйста, используйте параметризованные запросы вместо конкатенации строк, чтобы избежать атак SQL-Injection. –

+2

@David - бедные «Bobby Tables» * будут расстроены, если вы исправите это ... –

ответ

3

Ваша переменная флага установлена ​​в истинное значение безоговорочно. Вы должны установить значение true на основе возвращаемого значения cmd.ExecuteNonQuery(). который скажет вам, были ли обновлены/удалены ноль или более записей. И исходя из этого, вы можете установить свой флаг.

+0

спасибо, что это сработало – salman

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; 
} 
Смежные вопросы