Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

Из приведенного выше кода можно сделать вывод, что имя

Initial Catalog
относится к базе данных, с которой необходимо установить сеанс. Имя
Data Source
идентифицирует имя машины, где находится база данных. Здесь применяется строка
"., 5433"
, которая ссылается на хост-машину (точка соответствует
localhost
), и порт 5433, который представляет собой порт контейнера Docker, отображенный на порт SQL Server. Если бы вы использовали другой экземпляр, то определили бы свойство как
имя_машины,порт\экземпляр
. Например,
MYSERVER\SQLSERVER2019
означает, что
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-запроса, имени таблицы или хранимой процедуры. Тип команды указывается с использованием свойства
CommandType
, которое принимает любое значение из перечисления
CommandType
:

public enum CommandType

{

StoredProcedure,

TableDirect,

Text // Стандартное значение.

}

При создании объекта команды SQL-запрос можно указывать как параметр конструктора или устанавливать свойство

CommandText
напрямую. Кроме того, когда создается объект команды, необходимо задать желаемое подключение. Его также можно указать в виде параметра конструктора либо с применением свойства
Connection
. Взгляните на следующий фрагмент кода:

Поделиться с друзьями: