Приложение на C# (.NET)
На этой странице подробно разбирается код тестового приложения, использующего C# (.NET) SDK YDB.
Примечание
Материал статьи дополняется.
Инициализация соединения с базой данных
Для взаимодействия с YDB создается экземпляр драйвера, клиента и сессии:
- Драйвер YDB отвечает за взаимодействие приложения и YDB на транспортном уровне. Драйвер должен существовать на всем протяжении жизненного цикла работы с YDB и должен быть инициализирован перед созданием клиента и сессии.
- Клиент YDB работает поверх драйвера YDB и отвечает за работу с сущностями и транзакциями.
- Сессия YDB содержит информацию о выполняемых транзакциях и подготовленных запросах и содержится в контексте клиента YDB.
Фрагмент кода приложения для инициализации драйвера:
public static async Task Run(
string endpoint,
string database,
ICredentialsProvider credentialsProvider)
{
var config = new DriverConfig(
endpoint: endpoint,
database: database,
credentials: credentialsProvider
);
using var driver = new Driver(
config: config
);
await driver.Initialize();
}
Фрагмент кода приложения для создания сессии:
using var queryClient = new QueryService(driver);
Создание строковых таблиц
Выполняется создание строковых таблиц, которые используются в дальнейших операциях тестового приложения. В результате исполнения шага в базе данных будут созданы строковые таблицы модели данных справочника сериалов:
series
- Сериалыseasons
- Сезоныepisodes
- Эпизоды
После создания вызывается метод получения информации об объекте схемы данных, и выводится результат его выполнения.
Для создания таблиц используется метод queryClient.Exec
с DDL (Data Definition Language) YQL-запросом.
await queryClient.Exec(@"
CREATE TABLE series (
series_id Uint64 NOT NULL,
title Utf8,
series_info Utf8,
release_date Date,
PRIMARY KEY (series_id)
);
CREATE TABLE seasons (
series_id Uint64,
season_id Uint64,
title Utf8,
first_aired Date,
last_aired Date,
PRIMARY KEY (series_id, season_id)
);
CREATE TABLE episodes (
series_id Uint64,
season_id Uint64,
episode_id Uint64,
title Utf8,
air_date Date,
PRIMARY KEY (series_id, season_id, episode_id)
);
");
Запись данных
Выполняется запись данных в созданные строковые таблицы с использованием команды UPSERT
языка запросов YQL. Применяется режим передачи запроса на изменение данных с автоматическим подтверждением транзакции в одном запросе к серверу.
Фрагмент кода, демонстрирующий выполнение запроса на запись/изменение данных:
await queryClient.Exec(@"
UPSERT INTO series (series_id, title, release_date) VALUES
($id, $title, $release_date);
",
new Dictionary<string, YdbValue>
{
{ "$id", YdbValue.MakeUint64(1) },
{ "$title", YdbValue.MakeUtf8("NewTitle") },
{ "$release_date", YdbValue.MakeDate(DateTime.UtcNow) }
}
);
Получение выборки данных
Выполняется запрос на получение выборки данных с использованием команды SELECT
языка запросов YQL. Демонстрируется обработка полученной выборки в приложении.
Для чтения YQL-запросов используется методы queryClient.ReadRow
или queryClient.ReadAllRows
. SDK позволяет в явном виде контролировать выполнение транзакций и настраивать необходимый режим выполнения транзакций с помощью класса TxMode
. Во фрагменте кода, приведенном ниже, используется транзакция с режимом NoTx
и автоматическим коммитом после выполнения запроса. Значения параметров запроса передаются в виде словаря имя-значение в аргументе parameters
.
var row = await queryClient.ReadRow(@"
SELECT
series_id,
title,
release_date
FROM series
WHERE series_id = $id;
",
new Dictionary<string, YdbValue>
{
{ "$id", YdbValue.MakeUint64(id) }
}
);
Обработка результатов выполнения
Результат выполнения запроса (ResultSet) состоит из упорядоченного набора строк (Rows). Пример обработки результата выполнения запроса:
foreach (var row in resultSet.Rows)
{
Console.WriteLine($"> Series, " +
$"series_id: {(ulong)row["series_id"]}, " +
$"title: {(string?)row["title"]}, " +
$"release_date: {(DateTime?)row["release_date"]}");
}
Скан запросы
Выполняется скан запрос данных, результатом исполнения которого является стрим. Стрим позволяет считать неограниченное количество строк и объем данных.
await queryClient.Stream(
$"SELECT title FROM seasons ORDER BY series_id, season_id;",
async stream =>
{
await foreach (var part in stream)
{
foreach (var row in part.ResultSet!.Rows)
{
Console.WriteLine(row[0].GetOptionalUtf8());
}
}
});