C#: atestat și pregătire ONTI

C#: citește Access prin OleDb și parametri tipizați

Conectează un program C# la o bază Access de test folosind OleDb. Citește prin parametri tipizați și verifică ordinea lor, providerul și arhitectura procesului.

Acesta este primul exemplu care cere integrare reală pe Windows. Pregătește Data/catalog.accdb după schema lecției 32 și configurează în proiect copierea fișierului de test în directorul de ieșire. Ai nevoie de providerul ACE disponibil și de compatibilitate între arhitectura lui și procesul aplicației. Compilarea codului nu instalează providerul și nu verifică schema fișierului.

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

OleDbConnectionStringBuilder construiește conexiunea fără concatenarea manuală a căii. Open deschide accesul, iar using eliberează conexiunea și reader-ul. Comanda folosește ? drept placeholder. Pentru OleDb, ordinea adăugării parametrilor trebuie să coincidă cu ordinea placeholderelor, chiar dacă le dai nume descriptive.

Tipul VarWChar și lungimea 40 corespund câmpului Category din schema de exercițiu. Parametrul este tratat ca valoare, fără să schimbe structura SQL. ExecuteReader produce rândurile, iar Read avansează înainte de accesarea coloanelor.

Exemplu și rezultat așteptat

Cu datele inițiale și parametrul Programare, consola trebuie să afișeze 1: Algoritmi și 2: Grafuri. Dacă parametrul este Necunoscuta, nu apare niciun rând. Dacă fișierul lipsește, programul se oprește cu eroarea explicită înainte de deschiderea conexiunii.

Schemă pentru lecția 35: catalog.accdb + ACE; SQL: Category = ?; Parametru VarWChar: Programare; Reader: ID 1 și ID 2.catalog.accdb + ACE → SQL: Category = ? → Parametru VarWChar: Programare → Reader: ID 1 și ID 2.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() {
        using(var connection=new OleDbConnection(ConnectionString()))
        using(var command=new OleDbCommand("SELECT BookId, Title FROM Books WHERE Category = ? ORDER BY BookId",connection)) {
            command.Parameters.Add("category",OleDbType.VarWChar,40).Value="Programare";
            connection.Open();
            using(var reader=command.ExecuteReader())
                while(reader.Read())Console.WriteLine(reader.GetInt32(0) + ": " + reader.GetString(1));
        }
    }
}

Greșeli și limite

Nu rezolva „provider not registered” schimbând SQL-ul. Verifică instalarea ACE și configurația x86/x64 a proiectului. Nu folosi baza originală pentru exercițiile de actualizare. Nu păstra conexiunea deschisă între toate acțiunile interfeței. Într-un formular, tratează eroarea la granița operației și păstrează datele afișate anterior.

Exersează

Rulează pe Windows cu baza pregătită și compară exact cele două rânduri. Schimbă parametrul într-un text care conține apostrof: nu trebuie să devină instrucțiune SQL. Testează lipsa fișierului separat de lipsa providerului și notează diagnosticul corect pentru fiecare.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: JOIN și rapoarte care păstrează valorile zero

Lecția următoare: C#: actualizări SQL și numărul rândurilor afectate.

Referință: documentația Microsoft.

Întrebări frecvente

Numele parametrului stabilește poziția în OleDb?

Nu. Ordinea din Parameters trebuie să urmeze ordinea semnelor ? din comandă.

Codul compilat garantează conexiunea?

Nu. Providerul, arhitectura procesului, calea și schema se verifică pe Windows.

Pot redenumi un fișier SQLite în accdb?

Nu. Extensia nu schimbă formatul bazei de date.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →