So arbeiten Sie mit ADO.Net im getrennten Modus

Das ADO.Net-Datenzugriffsframework von Microsoft wird seit über zwei Jahrzehnten verwendet. Sie können ADO.Net nutzen, um CRUD-Vorgänge für eine Vielzahl von Datenbanken in der verwalteten Umgebung von .Net CLR auszuführen.

Ein Datenprovider ist eine Softwarekomponente, die die Protokolle kapselt, die zum Herstellen einer Verbindung mit und zur Interaktion mit der zugrunde liegenden Datenbank aus der verwalteten Umgebung verwendet werden. Einige der beliebtesten Datenanbieter sind: SQL Server Data Provider, Oracle Data Provider und OLEDB Data Provider. ADO.Net kann sowohl im verbundenen als auch im getrennten Modus arbeiten.

Ein verbundener Betriebsmodus in ADO.Net ist ein Modus, bei dem die Verbindung zur zugrunde liegenden Datenbank während der gesamten Lebensdauer des Vorgangs aktiv ist. In der Zwischenzeit ist ein nicht verbundener Betriebsmodus einer, bei dem ADO.Net Daten aus der zugrunde liegenden Datenbank abruft, die vorübergehend abgerufenen Daten im Speicher speichert und dann die Verbindung zur Datenbank schließt.

Wenn Sie mit ADO.Net im getrennten Betriebsmodus arbeiten, verwenden Sie normalerweise DataAdapter, DataSet, DataTable und DataTableReader. Während der DataAdapter als Brücke zwischen der Anwendung und der Datenbank fungiert, ist ein DataSet eine speicherinterne, nicht verbundene Darstellung der Datenbank und kann eine oder mehrere DataTable-Instanzen enthalten. Ein DataTableReader ähnelt einem DataReader, funktioniert jedoch in einem nicht verbundenen Modus.

Lassen Sie uns in einen Code graben

Wir haben genug von den Konzepten - lassen Sie uns in einen Code einsteigen. Das folgende Codefragment zeigt, wie Sie Daten in einem getrennten Modus aus einer Datenbank abrufen können. Beachten Sie, dass dieses Beispiel nur zu Illustrationszwecken eine Verbindung zur AdventureWorks-Datenbank herstellt.

static void Main(string[] args)

        {

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

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

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

                    DataSet dataSet = new DataSet();

                    sqlDataAdapter.Fill(dataSet);

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

        }

In der obigen Codeliste wird eine Verbindung zur Datenbank unter Verwendung einer Instanz der SqlConnection-Klasse hergestellt. Anschließend wird eine DataAdapter-Instanz erstellt und zum Auffüllen einer DataSet-Instanz mit der Fill () -Methode der DataAdapter-Klasse verwendet. Die Verbindung zur Datenbank wird automatisch geschlossen, wenn das Steuerelement aus dem Block "using" kommt, da die Dispose () -Methode automatisch für die SqlConnection-Instanz aufgerufen wird. Die in der DataSet-Instanz gespeicherten Daten befinden sich im Speicher und sind nicht von einer aktiven Datenbankverbindung abhängig, da DataSet in einem getrennten Modus arbeitet. Sobald die Daten aus der Datenbank abgerufen und in einer DataSet-Instanz im Speicher gespeichert wurden, können Sie die Daten auch ändern, wenn Sie möchten, und die Daten bei Bedarf erneut beibehalten.

DataRow dataRow = dataSet.Tables[0].NewRow(); //Creates a new data row

//You can now Präzisiere das values for each of the columns of the data row

dataSet.Tables[0].Rows.Add(dataRow); //Add the data row

sqlDataAdapter.Update(dataSet); // Inserts a new record

Beachten Sie, dass Sie den Block "using" für Typen verwenden können, die die IDisposable-Schnittstelle implementieren. Der gesamte "using" -Block wird in einen try - catch - Block eingeschlossen, um Ausnahmen zu behandeln, die auftreten können, wenn das Programm ausgeführt wird. Beachten Sie, dass die Verbindungszeichenfolge in diesem Beispiel aus einer Konfigurationsdatei abgerufen wird. Es wird empfohlen, die Verbindungszeichenfolge vom Code Ihrer Anwendung zu isolieren. Bei Bedarf können Sie auch Ihre Verbindungszeichenfolge verschlüsseln.

Sie können eine DataTable genauso füllen wie ein DataSet. Hier ist ein Beispiel, das dies veranschaulicht.

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

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

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

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);                   

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

Ein DataTableReader kombiniert das Beste aus beiden Welten, dh er ähnelt einem DataReader, der in einem getrennten Modus arbeitet, und ist schneller als DataTable und DataReader. Um einen DataTableReader zu erstellen, müssen Sie lediglich die CreateDataReader () -Methode für die DataTable-Instanz aufrufen.

DataTableReader dataTableReader = dataTable.CreateDataReader();

Die folgende Codeliste zeigt, wie Sie mit DataTableReader die Namen aller Abteilungen anzeigen können.

static void Main(string[] args)

        {

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

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

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

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);

                    DataTableReader dataTableReader = dataTable.CreateDataReader(); 

                    while(dataTableReader.Read())

                    {

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

                    }      

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

            Console.Read();

        }