Книги онлайн и без регистрации » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 253 254 255 256 257 258 259 260 261 ... 407
Перейти на страницу:
метод ExecuteReader() на сконфигурированном объекте команды.

4. Обработать каждую запись с применением метода Read() объекта чтения данных.

Для начала создайте новый проект консольного приложения по имени AutoLot.DataReader и добавьте пакет Microsoft.Data.SqlClient. Ниже приведен полный код внутри Program.cs (с последующим анализом):

using System;

using Microsoft.Data.SqlClient;

Console.WriteLine("***** Fun with Data Readers *****n");

// Создать и открыть подключение.

using (SqlConnection connection = new SqlConnection())

{

  connection.ConnectionString =

    @" Data Source=.,5433;User Id=sa;Password=P@ssw0rd;Initial Catalog=AutoLot";

    connection.Open();

   // Создать объект команды SQL.

  string sql =

    @"Select i.id, m.Name as Make, i.Color, i.Petname

          FROM Inventory i

          INNER JOIN Makes m on m.Id = i.MakeId";

  SqlCommand myCommand = new SqlCommand(sql, connection);

  // Получить объект чтения данных с помощью ExecuteReader().

  using (SqlDataReader myDataReader = myCommand.ExecuteReader())

  {

    // Пройти в цикле по результатам.

    while (myDataReader.Read())

    {

       Console.WriteLine($"-> Make: {myDataReader["Make"]},

           PetName: {myDataReader

         ["PetName"]}, Color: {myDataReader["Color"]}.");

    }

  }

}

Console.ReadLine();

Работа с объектами подключений

При работе с поставщиком данных первым делом понадобится установить сеанс с источником данных, используя объект подключения (производного от DbConnection типа). Объекты подключений .NET Core обеспечиваются форматированной строкой подключения, которая содержит несколько пар "имя-значение", разделенных точками с запятой. Такая информация идентифицирует имя машины, к которой нужно подключиться, требуемые настройки безопасности, имя базы данных на машине и другие специфичные для поставщика сведения.

Из приведенного выше кода можно сделать вывод, что имя Initial Catalog относится к базе данных, с которой необходимо установить сеанс. Имя Data Source идентифицирует имя машины, где находится база данных. Здесь применяется строка "., 5433", которая ссылается на хост-машину (точка соответствует localhost), и порт 5433, который представляет собой порт контейнера Docker, отображенный на порт SQL Server. Если бы вы использовали другой экземпляр, то определили бы свойство как имя_машины,портэкземпляр. Например, MYSERVERSQLSERVER2019 означает, что MYSERVER — имя сервера, на котором функционирует SQL Server, что применяется стандартный порт и что SQLSERVER2019 представляет собой имя экземпляра. Если машина является локальной по отношению к разработке, тогда можете использовать для имени сервера точку (.) или маркер (localhost). В случае стандартного экземпляра SQL Server имя экземпляра не указывается. Скажем, если вы создаете базу данных AutoLot в установленной копии Microsoft SQL Server, настроенной как стандартный экземпляр на вашем локальном компьютере, то могли бы применять "Data Source=localhost".

Кроме того, можно указать любое количество конструкций, которые представляют учетные данные безопасности. Если Integrated Security установлено в true, то для аутентификации и авторизации используется текущая учетная запись Windows.

Когда строка подключения готова, можно вызывать метод Open() для установления подключения к базе данных. В дополнение к членам Connectionstring, Open() и Close() объект подключения предоставляет несколько членов, которые позволяют конфигурировать дополнительные настройки подключения, такие как таймаут и транзакционная информация. В табл. 21.4 кратко описаны избранные члены базового класса DbConnection.

Свойства типа DbConnection обычно по своей природе допускают только чтение и полезны, только если требуется получить характеристики подключения во время выполнения. Когда необходимо переопределить стандартные настройки, придется изменить саму строку подключения. Например, в следующей строке подключения время таймаута Connect Timeout устанавливается равным 30 секундам вместо стандартных 15 секунд (для SQL Server):

using(SqlConnection connection = new SqlConnection())

{

  connection.ConnectionString =

     @" Data Source=.,5433;User Id=sa;Password=P@ssw0rd;

     Initial Catalog=AutoLot;Connect Timeout=30";

  connection.Open();

}

Следующий код выводит детали о переданной ему строке подключения SqlConnection:

static void ShowConnectionStatus(SqlConnection connection)

{

  // Вывести различные сведения о текущем объекте подключения.

  Console.WriteLine("***** Info about your connection *****");

  Console.WriteLine($@"Database location:

    {connection.DataSource}");         // Местоположение базы данных

  Console.WriteLine($"Database name: {connection.Database}");

                                       // Имя базы данных

  Console.WriteLine($@"Timeout:

    {connection.ConnectionTimeout}");  // Таймаут

  Console.WriteLine($"Connection state:

    {connection.State}n");            // Состояние подключения

}

Большинство этих свойств понятно без объяснений, но свойство State требует специального упоминания. Ему можно присвоить любое значение из перечисления ConnectionState:

public enum ConnectionState

{

  Broken,

  Closed,

  Connecting,

  Executing,

  Fetching,

  Open

}

Однако допустимыми значениями ConnectionState будут только ConnectionState.Open, ConnectionState.Connecting и ConnectionState.Closed (остальные члены перечисления зарезервированы для будущего использования). Кроме того, закрывать подключение всегда безопасно, даже если его состоянием в текущий момент является ConnectionState.Closed.

Работа с объектами ConnectionStringBuilder

Работа со строками подключения в коде может быть утомительной, т.к. они часто представлены в виде строковых литералов, которые в лучшем случае трудно обрабатывать и контролировать на предмет ошибок. Совместимые с .NET Core поставщики данных поддерживают объекты построителей строк подключения, которые позволяют устанавливать пары "имя-значение" с применением строго типизированных свойств. Взгляните на следующую модификацию текущего кода:

var connectionStringBuilder = new SqlConnectionStringBuilder

{

  InitialCatalog = "AutoLot",

  DataSource = ".,5433",

  UserID = "sa",

  Password = "P@ssw0rd",

  ConnectTimeout = 30

};

  connection.ConnectionString =

    connectionStringBuilder.ConnectionString;

В этой версии создается экземпляр класса SqlConnectionStringBuilder, соответствующим образом устанавливаются его свойства, после чего с использованием свойства ConnectionString получается внутренняя строка. Обратите внимание, что здесь применяется стандартный конструктор типа. При желании объект построителя строки подключения для поставщика данных можно также создать, передав в качестве отправной точки существующую строку подключения (что может быть удобно, когда значения динамически читаются из внешнего источника). После наполнения объекта начальными строковыми данными отдельные пары "имя-значение" можно изменять с помощью связанных свойств.

Работа с объектами команд

Теперь, когда вы лучше понимаете роль объекта подключения, следующей задачей будет выяснение, каким образом отправлять SQL-запросы базе данных. Тип SqlCommand (производный от DbCommand) является объектно-ориентированным представлением SQL-запроса, имени таблицы или хранимой процедуры. Тип команды указывается с использованием свойства

1 ... 253 254 255 256 257 258 259 260 261 ... 407
Перейти на страницу:

Комментарии
Минимальная длина комментария - 20 знаков. В коментария нецензурная лексика и оскорбления ЗАПРЕЩЕНЫ! Уважайте себя и других!
Комментариев еще нет. Хотите быть первым?