short GetInt16(int i);
int GetInt32(int i);
long GetInt64(int i);
string GetName(int i);
int GetOrdinal(string name);
string GetString(int i);
object GetValue(int i);
int GetValues(object[] values);
bool IsDBNull(int i);
}
На заметку!
МетодIDataReader.IsDBNull() можно применять для программного выяснения, установлено ли указанное поле в null, прежде чем пытаться получить значение из объекта чтения данных (во избежание генерации исключения во время выполнения). Также вспомните, что язык C# поддерживает типы данных, допускающие null (см. главу 4), идеально подходящие для взаимодействия со столбцами, которые могут иметь значение null в таблице базы данных.Абстрагирование поставщиков данных с использованием интерфейсов
К настоящему моменту вы должны лучше понимать общую функциональность, присущую всем поставщикам данных .NET Core. Вспомните, что хотя точные имена реализуемых типов будут отличаться между поставщиками данных, в коде такие типы применяются в схожей манере — в том и заключается преимущество полиморфизма на основе интерфейсов. Скажем, если определить метод, который принимает параметр IDbConnection
public static void OpenConnection(IDbConnection cn)
{
// Открыть входное подключение для вызывающего кода.
connection.Open();
}
На заметку!
Использовать интерфейсы вовсе не обязательно; аналогичного уровня абстракции можно достичь путем применения абстрактных базовых классов (таких какDbConnection) в качестве параметров или возвращаемых значений. Однако использование интерфейсов вместо базовых классов является общепринятой практикой.То же самое справедливо для возвращаемых значений. Создайте новый проект консольного приложения .NET Core по имени MyConnectionFactory
OleDb действителен только в Windows):Microsoft.Data.SqlClient
System.Data.Common
System.Data.Odbc
System.Data.OleDb
Далее добавьте в проект новый файл по имени DataProviderEnum.cs
namespace MyConnectionFactory
{
// Пакет OleDb предназначен только для Windows и в .NET Core не поддерживается.
enum DataProviderEnum
{
SqlServer,
#if PC
OleDb,
#endif
Odbc,
None
}
}
Если на своей машине обработки вы работаете в среде Windows, тогда модифицируйте файл проекта, чтобы определить символ условной компиляции PC:
В случае использования Visual Studio щелкните правой кнопкой мыши на имени проекта и выберите в контекстном меню пункт Properties
(Свойства). В открывшемся диалоговом окне Properties (Свойства) перейдите на вкладку Build (Сборка) и введите нужное значение в поле Conditional compiler symbols (Символы условной компиляции).Следующий пример кода позволяет выбирать специфический объект подключения на основе значения из специального перечисления. В целях диагностики мы просто выводим лежащий в основе объект подключения с применением служб рефлексии.
using System;
using System.Data;
using System.Data.Odbc;
#if PC
using System.Data.OleDb;
#endif
using Microsoft.Data.SqlClient;
using MyConnectionFactory;
Console.WriteLine("
**** Very Simple Connection Factory *****\n");Setup(DataProviderEnum.SqlServer);
#if PC
Setup(DataProviderEnum.OleDb); // He поддерживается в macOS
#endif
Setup(DataProviderEnum.Odbc);
Setup(DataProviderEnum.None);
Console.ReadLine();
void Setup(DataProviderEnum provider)
{
// Получить конкретное подключение.
IDbConnection myConnection = GetConnection(provider);
Console.WriteLine($"Your connection is a {myConnection?.GetType().Name ??
"unrecognized type"}");
// Открыть, использовать и закрыть подключение...
}