Как да работите с ADO.Net в изключен режим

Рамката за достъп до данни ADO.Net на Microsoft се използва вече повече от две десетилетия. Можете да използвате ADO.Net за извършване на CRUD операции върху голямо разнообразие от бази данни от управляваната среда на .Net CLR.

Доставчикът на данни е софтуерен компонент, който капсулира протоколите, използвани за свързване и взаимодействие с основната база данни от управляваната среда. Някои от популярните доставчици на данни включват: SQL Server доставчик на данни, Oracle доставчик на данни и OLEDB доставчик на данни. ADO.Net може да работи както в свързан, така и в изключен режим.

Свързаният режим на работа в ADO.Net е този, при който връзката с основната база данни е жива през целия живот на операцията. Междувременно, изключен режим на работа е този, при който ADO.Net извлича данни от основната база данни, съхранява временно извлечените данни в паметта и след това затваря връзката с базата данни.

Когато работите с ADO.Net в изключен режим на работа, обикновено бихте използвали DataAdapter, DataSet, DataTable и DataTableReader. Докато DataAdapter действа като мост между приложението и базата данни, DataSet е в паметта, прекъснато представяне на базата данни и може да съдържа един или повече копия на DataTable. DataTableReader е подобен на DataReader, с изключение на това, че работи в изключен режим.

Нека да разровим малко код

Достатъчно ни бяха концепциите - нека влезем в някакъв код. Следният кодов фрагмент показва как можете да извличате данни от база данни в изключен режим. Имайте предвид, че този пример се свързва с базата данни AdventureWorks само с илюстративна цел.

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

            }

        }

В горния списък с кодове се установява връзка с базата данни, като се използва екземпляр на класа SqlConnection. След това се създава екземпляр DataAdapter и той се използва за попълване на екземпляр DataSet, използвайки метода Fill () на класа DataAdapter. Връзката с базата данни се затваря автоматично, когато контролата излезе от блока "използване", тъй като методът Dispose () се извиква автоматично в екземпляра на SqlConnection. Данните, съхранявани в екземпляра DataSet, се намират в паметта и не зависят от активна връзка с база данни, тъй като DataSet работи в изключен режим. След като данните бъдат извлечени от базата данни и съхранени в паметта в екземпляр DataSet, можете също да промените данните, ако желаете, и след това отново да запазите данните, когато е необходимо.

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

//You can now посочете 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

Имайте предвид, че можете да използвате блока "using" за типове, които реализират IDisposable интерфейса. Целият блок "използване" е обвит в блок за опит за улавяне, за да се справят с изключения, които могат да възникнат, когато програмата е в изпълнение. Обърнете внимание, че низът за връзка в този пример се извлича от конфигурационен файл - добра практика е да изолирате низа за връзка от кода на вашето приложение. Можете също така да шифровате вашия низ за връзка, ако е необходимо.

Можете също така да попълните DataTable по същия начин, по който попълвате DataSet. Ето пример, който илюстрира това.

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

            }

DataTableReader съчетава най-доброто от двата свята, т.е. той е като DataReader, който работи в изключен режим и е по-бърз от DataTable и DataReader. За да създадете DataTableReader, всичко, което трябва да направите, е да извикате метода CreateDataReader () в екземпляра DataTable.

DataTableReader dataTableReader = dataTable.CreateDataReader();

Следният списък с кодове показва как можете да покажете имената на всички отдели с помощта на DataTableReader.

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();

        }