C#: actualizări SQL și numărul rândurilor afectate
Actualizează o înregistrare din C# cu parametri OleDb și verifică rândurile afectate. Previne salvarea unei alte entități prin folosirea ID-ului stabil.
În acest material
Un mesaj „Salvat” este corect numai dacă operația a modificat înregistrarea cerută. ExecuteNonQuery întoarce numărul rândurilor afectate pentru comanda noastră UPDATE. Deoarece filtrăm după cheia primară, așteptăm exact un rând. Zero înseamnă că ID-ul nu a fost găsit, nu că salvarea a reușit.
Cum lucrezi cu exemplul
Exemplul se compilează ca aplicație de consolă .NET Framework 4.8. Rulează pe Windows, cu provider ACE compatibil cu arhitectura procesului și o copie de test Data/catalog.accdb. Arhiva conține codul și pașii de pregătire, nu un fișier Access preconstruit.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Comanda actualizează Title pentru BookId. Parametrul titlului este primul, iar ID-ul este al doilea, în ordinea semnelor ?. Verificăm titlul înainte de deschiderea conexiunii: după Trim trebuie să aibă între unu și 80 de caractere. Nu schimbăm ID-ul când utilizatorul editează numele.
Exemplul folosește o copie de test Data/catalog.accdb, pregătită în lecția de schemă, și modifică titlul cărții 2. După succes, o interfață ar reciti rândul sau ar actualiza modelul confirmat, nu ar presupune că orice valoare introdusă a fost stocată.
Exemplu și rezultat așteptat
Cartea 2, Grafuri, devine Grafuri aplicate și programul afișează Randuri modificate: 1. Dacă schimbi ID-ul în 99, obții o excepție explicită despre lipsa rândului. Repetarea cu același titlu poate raporta tot un rând potrivit de UPDATE; acesta nu este un contor al caracterelor schimbate.
Titlu valid: Grafuri aplicate → UPDATE ... WHERE BookId = 2 → Parametri: titlu, ID → Rezultat așteptat: 1 rând.Mărește schema ↗
Codul complet
using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
class Program {
static string ConnectionString() {
string path=Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Data","catalog.accdb");
if(!File.Exists(path))throw new FileNotFoundException("Pregateste baza de test Data/catalog.accdb.");
var builder=new OleDbConnectionStringBuilder();
builder.Provider="Microsoft.ACE.OLEDB.12.0";builder.DataSource=path;
return builder.ConnectionString;
}
static void Main() {
string title="Grafuri aplicate".Trim();int id=2;
if(title.Length<1 || title.Length>80)throw new ArgumentException("Titlu invalid");
using(var connection=new OleDbConnection(ConnectionString()))
using(var command=new OleDbCommand("UPDATE Books SET Title = ? WHERE BookId = ?",connection)) {
command.Parameters.Add("title",OleDbType.VarWChar,80).Value=title;
command.Parameters.Add("id",OleDbType.Integer).Value=id;
connection.Open();int changed=command.ExecuteNonQuery();
if(changed!=1)throw new InvalidOperationException("Inregistrarea nu a fost actualizata unic.");
Console.WriteLine("Randuri modificate: " + changed);
}
}
}
Greșeli și limite
Omiterea WHERE ar modifica toate cărțile. Inversarea parametrilor poate produce erori de conversie sau o actualizare greșită. Nu folosi numărul rândului din DataGridView drept BookId. Pentru editare concurentă, adaugă în condiție o versiune sau o valoare originală și tratează zero rânduri drept conflict.
Exersează
În copia de test, actualizează ID 2 și verifică prin SELECT că ID 1 a rămas neschimbat. Încearcă un titlu gol, apoi unul cu apostrof. Primul trebuie refuzat înainte de SQL, iar al doilea trebuie stocat ca text. Păstrează o copie inițială pentru repetarea exercițiului.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: citește Access prin OleDb și parametri tipizați
Lecția următoare: C#: BindingSource și filtrarea unui DataTable.
Referință: documentația Microsoft.
Întrebări frecvente
Ce verific după ExecuteNonQuery?
Numărul de rânduri afectate, interpretat în contextul comenzii și al cheii folosite.
De ce nu afișez succes pentru zero?
Fiindcă înregistrarea cerută nu a fost actualizată.
Parametrizarea înlocuiește WHERE?
Nu. Parametrii protejează valorile, iar WHERE definește exact ținta operației.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.