C#: atestat și pregătire ONTI

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.

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.

Schemă pentru lecția 36: Titlu valid: Grafuri aplicate; UPDATE ... WHERE BookId = 2; Parametri: titlu, ID; Rezultat așteptat: 1 rând.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

Bazele C#

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.

Exersează cu o problemă →