Язык программирования C#9 и платформа .NET5
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:ConnectionStatepublic 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) является объектно-ориентированным представлением SQL-запроса, имени таблицы или хранимой процедуры. Тип команды указывается с использованием свойстваDbCommand, которое принимает любое значение из перечисленияCommandType:CommandTypepublic enum CommandType{StoredProcedure,TableDirect,Text // Стандартное значение.}При создании объекта команды SQL-запрос можно указывать как параметр конструктора или устанавливать свойство
напрямую. Кроме того, когда создается объект команды, необходимо задать желаемое подключение. Его также можно указать в виде параметра конструктора либо с применением свойстваCommandText. Взгляните на следующий фрагмент кода:Connection// Создать объект команды посредством аргументов конструктора.string sql =@"Select i.id, m.Name as Make, i.Color, i.PetnameFROM Inventory iINNER JOIN Makes m on m.Id = i.MakeId";SqlCommand myCommand = new SqlCommand(sql, connection);// Создать еще один объект команды через свойства.SqlCommand testCommand = new SqlCommand();testCommand.Connection = connection;testCommand.CommandText = sql;Учтите, что в текущий момент вы еще фактически не отправили SQL-запрос базе данных
, а только подготовили состояние объекта команды для будущего использования.AutoLotВ табл. 21.5 описаны некоторые дополнительные члены типа
.DbCommandРабота с объектами чтения данных
После установления активного подключения и объекта команды SQL следующим действием будет отправка запроса источнику данных. Как вы наверняка догадались, это можно делать несколькими путями. Самый простой и быстрый способ получения информации из хранилища данных предлагает тип
(реализующий интерфейсDbDataReader). Вспомните, что объекты чтения данных представляют поток данных, допускающий только чтение в прямом направлении, который возвращает по одной записи за раз. Таким образом, объекты чтения данных полезны, только когда лежащему в основе хранилищу данных отправляются SQL-операторы выборки.IDataReader
