Example app in C# (.NET)
This page contains a detailed description of the code of a test app that uses the YDB C# (.NET) SDK.
Note
The article is currently being updated.
Initializing a database connection
To interact with YDB, create instances of the driver, client, and session:
- The YDB driver facilitates interaction between the app and YDB nodes at the transport layer. It must be initialized before creating a client or session and must persist throughout the YDB access lifecycle.
- The YDB client operates on top of the YDB driver and enables the handling of entities and transactions.
- The YDB session, which is part of the YDB client context, contains information about executed transactions and prepared queries.
App code snippet for driver initialization:
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();
}
App code snippet for creating a session:
using var queryClient = new QueryService(driver);
Creating tables
Create tables to be used in operations on a test app. This step results in the creation of database tables for the series directory data model:
Series
Seasons
Episodes
After the tables are created, a method for retrieving information about data schema objects is called, and the result of its execution is displayed.
To create tables, use the queryClient.Exec
method with a DDL (Data Definition Language) YQL query.
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)
);
");
Adding data
Add data to the created tables using the UPSERT
statement in YQL. A data update request is sent to the server as a single request with transaction auto-commit mode enabled.
Code snippet for data insert/update:
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) }
}
);
Retrieving data
Retrieve data using a SELECT
statement in YQL. Handle the retrieved data selection in the app.
To execute YQL queries, use the queryClient.ReadRow
или queryClient.ReadAllRows
method. The SDK lets you explicitly control the execution of transactions and configure the transaction execution mode using the TxMode
enum. In the code snippet below, a transaction with the NoTx
mode and an automatic commit after executing the request is used. The values of the request parameters are passed in the form of a dictionary name-value in the parameters
argument.
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) }
}
);
Processing execution results
The result of query execution (resultset) consists of an organized set of rows. Example of processing the query execution result:
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"]}");
}
Scan queries
Execute a scan query to produce a data stream. Streaming allows to read an unlimited number of rows and an unlimited amount of data.
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());
}
}
});