Skip to content

Cassandra with the C# driver

Uses CassandraCSharpDriver 3.23 on .NET 10. The code is an ordinary application for the original database; nothing in it knows about MachNoSQL.

cass-1.example.com,cass-2.example.com
machnosql-1.example.com,machnosql-2.example.com

The address comes from the environment variable CASSANDRA_CONTACT_POINTS, so switching to MachNoSQL changes configuration only.

Terminal window
export CASSANDRA_CONTACT_POINTS='machnosql-1.example.com,machnosql-2.example.com'
dotnet run

Credentials come from CASSANDRA_USERNAME and CASSANDRA_PASSWORD, the local data center from CASSANDRA_DC (default dc1).

The program as it is kept and tested in the Mach Database NoSQL repository; highlighted lines read the connection setting.

Program.cs
// Sensor readings on Cassandra, unchanged on MachNoSQL.
using Cassandra;
var cluster = Cluster.Builder()
.AddContactPoints(Environment.GetEnvironmentVariable("CASSANDRA_CONTACT_POINTS")!.Split(','))
.WithPort(9042)
.WithCredentials(Environment.GetEnvironmentVariable("CASSANDRA_USERNAME"), Environment.GetEnvironmentVariable("CASSANDRA_PASSWORD"))
.WithLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy(Environment.GetEnvironmentVariable("CASSANDRA_DC") ?? "dc1")))
.Build();
var session = await cluster.ConnectAsync();
await session.ExecuteAsync(new SimpleStatement(
"CREATE KEYSPACE IF NOT EXISTS iot WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': 3}"));
await session.ExecuteAsync(new SimpleStatement(
"CREATE TABLE IF NOT EXISTS iot.readings (sensor text, at timestamp, value double, PRIMARY KEY (sensor, at)) WITH CLUSTERING ORDER BY (at DESC)"));
await session.ExecuteAsync(new SimpleStatement(
"CREATE TABLE IF NOT EXISTS iot.sensors (sensor text PRIMARY KEY, owner text)"));
var insert = await session.PrepareAsync("INSERT INTO iot.readings (sensor, at, value) VALUES (?, ?, ?) USING TTL 86400");
var now = DateTimeOffset.UtcNow;
for (var minute = 0; minute < 10; minute++)
{
await session.ExecuteAsync(insert.Bind("s-1", now.AddMinutes(-minute), 20.0 + minute / 10.0));
}
var rows = await session.ExecuteAsync(new SimpleStatement(
"SELECT at, value FROM iot.readings WHERE sensor = ? AND at > ? LIMIT 5", "s-1", now.AddMinutes(-5)));
foreach (var row in rows)
{
Console.WriteLine($"{row.GetValue<DateTimeOffset>("at")} {row.GetValue<double>("value")}");
}
var lwt = await session.ExecuteAsync(new SimpleStatement(
"INSERT INTO iot.sensors (sensor, owner) VALUES (?, ?) IF NOT EXISTS", "s-1", "ada"));
Console.WriteLine($"registered: {lwt.First().GetValue<bool>("[applied]")}");
await cluster.ShutdownAsync();
Example.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CassandraCSharpDriver" Version="3.23.0" />
</ItemGroup>
</Project>