Programmering

Sådan arbejder du med ADO.Net i afbrudt tilstand

Microsofts ADO.Net-dataadgangsramme har været i brug i over to årtier nu. Du kan udnytte ADO.Net til at udføre CRUD-operationer på en lang række databaser fra det administrerede miljø i .Net CLR.

En dataudbyder er en softwarekomponent, der indkapsler protokollerne, der bruges til at oprette forbindelse til og interagere med den underliggende database fra det administrerede miljø. Nogle af de populære dataleverandører inkluderer: SQL Server Data Provider, Oracle Data Provider og OLEDB Data Provider. ADO.Net kan arbejde i både tilsluttede og frakoblede tilstande.

En tilsluttet driftsform i ADO.Net er en, hvor forbindelsen til den underliggende database er i live gennem hele operationens levetid. I mellemtiden er en frakoblet driftsform en, hvor ADO.Net henter data fra den underliggende database, gemmer de data, der er hentet midlertidigt i hukommelsen, og derefter lukker forbindelsen til databasen.

Når du arbejder med ADO.Net i frakoblet driftsform, vil du typisk udnytte DataAdapter, DataSet, DataTable og DataTableReader. Mens DataAdapter fungerer som en bro mellem applikationen og databasen, er et DataSet en in-memory, afbrudt repræsentation af databasen og kan indeholde en eller flere DataTable-forekomster. En DataTableReader ligner en DataReader bortset fra at den fungerer i en afbrudt tilstand.

Lad os grave i noget kode

Vi har fået nok af begreberne - lad os komme ind i en kode. Følgende kodestykke viser, hvordan du kan hente data fra en database i en afbrudt tilstand. Bemærk, at dette eksempel kun opretter forbindelse til AdventureWorks-databasen til illustration.

statisk ugyldigt Main (streng [] args)

        {

string connectionString = ConfigurationManager.ConnectionStrings ["AdventureWorksDB"]. ConnectionString;

prøve

            {

ved hjælp af (SqlConnection sqlConnection = ny SqlConnection (connectionString))

                {

sqlConnection.Open ();

SqlDataAdapter sqlDataAdapter = ny SqlDataAdapter ("SELECT * FROM [AdventureWorks2014]. [HumanResources]. [Department]", sqlConnection);

DataSet dataSet = nyt datasæt ();

sqlDataAdapter.Fill (dataSet);

                }                

            }

fangst (undtagelse ex)

            {

// Skriv kode her for at håndtere undtagelse

            }

        }

I ovenstående kodeliste oprettes en forbindelse til databasen ved hjælp af en forekomst af klassen SqlConnection. Derefter oprettes en DataAdapter-forekomst, og den bruges til at udfylde en DataSet-forekomst ved hjælp af Fill () -metoden i DataAdapter-klassen. Forbindelsen til databasen lukkes automatisk, når kontrollen kommer ud af "brug" -blokken, da Dispose () -metoden automatisk påberåbes på SqlConnection-forekomsten. Dataene, der er gemt i DataSet-forekomsten, ligger i hukommelsen og er ikke afhængige af en aktiv databaseforbindelse, da DataSet fungerer i en frakoblet tilstand. Når dataene er hentet fra databasen og gemt i hukommelsen i en DataSet-instans, kan du også ændre dataene, hvis du vil, og derefter vedvare dataene igen, når det er nødvendigt.

DataRow dataRow = dataSet.Tables [0] .NewRow (); // Opretter en ny datarække

// Du kan nu angiv det værdier for hver af kolonnerne i dataraden

dataSet.Tables [0] .Rows.Add (dataRow); // Tilføj datarække

sqlDataAdapter.Update (datasæt); // Indsætter en ny post

Bemærk, at du kan bruge "brug" -blokken på typer, der implementerer IDisposable-grænsefladen. Hele "brug" -blokken er pakket ind i en prøvefangst-blok for at håndtere undtagelser, der kan opstå, når programmet er i eksekvering. Bemærk, at forbindelsesstrengen i dette eksempel hentes fra en konfigurationsfil - det er en god praksis at isolere forbindelsesstrengen fra din applikations kode. Du kan også kryptere din forbindelsesstreng, hvis det er nødvendigt.

Du kan også udfylde en datatabel på samme måde som du udfylder et datasæt. Her er et eksempel, der illustrerer dette.

string connectionString = ConfigurationManager.ConnectionStrings ["AdventureWorksDB"]. ConnectionString;

prøve

            {

ved hjælp af (SqlConnection sqlConnection = ny SqlConnection (connectionString))

                {

sqlConnection.Open ();

SqlDataAdapter sqlDataAdapter = ny SqlDataAdapter ("SELECT * FROM [AdventureWorks2014]. [HumanResources]. [Department]", sqlConnection);

Datatabel datatabel = ny datatabel ();

sqlDataAdapter.Fill (dataTable);

                }                

            }

fangst (undtagelse ex)

            {

// Skriv kode her for at håndtere undtagelse

            }

En DataTableReader kombinerer det bedste fra begge verdener, dvs. det er som en DataReader, der fungerer i en frakoblet tilstand, og det er hurtigere end både DataTable og DataReader. For at oprette en DataTableReader er alt, hvad du skal gøre, at påberåbe sig CreateDataReader () -metoden i DataTable-forekomsten.

DataTableReader dataTableReader = dataTable.CreateDataReader ();

Følgende kodeliste viser, hvordan du kan vise navnene på alle afdelinger ved hjælp af DataTableReader.

statisk ugyldigt Main (streng [] args)

        {

string connectionString = ConfigurationManager.ConnectionStrings ["AdventureWorksDB"]. ConnectionString;

prøve

            {

ved hjælp af (SqlConnection sqlConnection = ny SqlConnection (connectionString))

                {

sqlConnection.Open ();

SqlDataAdapter sqlDataAdapter = ny SqlDataAdapter ("SELECT * FROM [AdventureWorks2014]. [HumanResources]. [Department]", sqlConnection);

Datatabel datatabel = ny datatabel ();

sqlDataAdapter.Fill (dataTable);

DataTableReader dataTableReader = dataTable.CreateDataReader ();

while (dataTableReader.Read ())

                    {

Console.WriteLine (dataTableReader ["Name"]. ToString ());

                    }      

                }                

            }

fangst (undtagelse ex)

            {

// Skriv kode her for at håndtere undtagelse

            }

Console.Read ();

        }