Skip to content

Ado.NET集成

Ignite 实现了 ADO.NET 类,例如DbConnectionDbCommandDbDataReader等,可以使用标准 ADO.NET 组件与 Ignite SQL 交互。

1.入门

1.1.前提条件

若要使用 C# 瘦客户端,需要 .NET 8.0 或更高版本。

1.2.安装

C# 客户端可通过 NuGet 获得,可以使用下面的add package命令:

shell
dotnet add package Apache.Ignite --version 3.1.0

2.接入集群

若要接入 Ignite 集群,需使用连接字符串创建新连接:

csharp
var connStr = "Endpoints=localhost:10800";

连接字符串有以下参数:

参数描述
Endpoints必填,逗号分隔的带端口的服务端地址列表。
SocketTimeout套接字操作超时的时间跨度,hh:mm:ss格式,默认为 30 秒。
OperationTimeout操作超时的时间跨度,hh:mm:ss格式,默认没有超时。
HeartbeatInterval心跳消息之间的时间跨度,以保持连接,hh:mm:ss.f格式,默认为 30 秒。
ReconnectInterval重新连接尝试之间的时间跨度,hh:mm:ss格式,默认为 30 秒。
SslEnabled启用/禁用 SSL 加密的布尔值,默认值为:False
Username用于身份验证的用户名。
Password身份验证密码。

下面的示例显示了包含所有参数的完整连接字符串:

Endpoints=localhost:10800,localhost:10801;SocketTimeout=00:00:10;OperationTimeout=00:03:30;
HeartbeatInterval=00:00:05.5;ReconnectInterval=00:01:00;SslEnabled=True;Username=user;Password=pass

使用该连接字符串,可以使用IgniteDbConnection类建立与 Ignite 集群的连接:

csharp
var connStr = "Endpoints=localhost:10800";
await using var conn = new IgniteDbConnection(connStr);
await conn.OpenAsync();

3.执行 SQL 命令

可以使用IgniteDbConnection.CreateCommand方法创建一个命令,然后使用其中一个执行它。

下面的示例中命令不需要返回任何行,因此使用ExecuteNonQueryAsync命令:

csharp
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "DROP TABLE IF EXISTS Person";
await cmd.ExecuteNonQueryAsync();

4.从集群中读取数据

可以使用数据读取器方式从集群中检索数据。

以下示例演示了如何从集群中获取数据:

csharp
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM Person";
await using var reader = await cmd.ExecuteReaderAsync();

while (await reader.ReadAsync())
{
    Console.WriteLine($"Person [ID={reader.GetInt32(0)}, Name={reader.GetString(1)}]");
}

5.使用参数

提示

Ignite 仅支持输入参数,参数类型是从 SQL 查询上下文中自动推断出来的,因此无需显式指定参数类型。

Ignite 支持使用位置参数进行参数化查询。可以使用IgniteDbConnection.CreateParameter()方法创建参数来替换查询文本中的?占位符。

以下示例演示了如何执行参数化查询:

csharp
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "INSERT INTO Person (ID, Name) VALUES (?, ?)";

DbParameter idParam = cmd.CreateParameter();
idParam.Value = 1;
cmd.Parameters.Add(idParam);

DbParameter nameParam = cmd.CreateParameter();
nameParam.Value = "John Doe";
cmd.Parameters.Add(nameParam);

await cmd.ExecuteNonQueryAsync();

必须按照查询中出现的确切顺序添加参数。第一个?对应于添加的第一个参数,第二个?对应于第二个参数,依此类推。

要传递空值,需将参数值设置为null

csharp
DbParameter param = cmd.CreateParameter();
param.Value = null;
cmd.Parameters.Add(param);

6.事务

提示

Ignite 不支持自定义隔离级别,所有事务都是有效的Serializable

可以使用DbConnection.BeginTransaction方法启动事务。

在提交事务之前,不会将任何数据写入到数据库,可以使用回滚方法丢弃所有更改:

csharp
await using DbTransaction tx = await conn.BeginTransactionAsync();
cmd.Transaction = tx;
// ...
// Commit the transaction.
await tx.CommitAsync();
// Roll back the transaction if needed.
// await tx.RollbackAsync();

7.完整示例

以下示例演示了如何通过 ADO.NET 操作 Apache Ignite 集群:

csharp
var connStr = $"Endpoints=localhost:10800";
await using var conn = new IgniteDbConnection(connStr);
await conn.OpenAsync();

DbCommand createTableCmd = conn.CreateCommand();
createTableCmd.CommandText = "CREATE TABLE IF NOT EXISTS Person (ID INT PRIMARY KEY, Name VARCHAR)";
await createTableCmd.ExecuteNonQueryAsync();

DbCommand insertCmd = conn.CreateCommand();
insertCmd.CommandText = "INSERT INTO Person (ID, Name) VALUES (?, ?)";

await using DbTransaction tx = await conn.BeginTransactionAsync();
insertCmd.Transaction = tx;

DbParameter idParam = insertCmd.CreateParameter();
insertCmd.Parameters.Add(idParam);

DbParameter nameParam = insertCmd.CreateParameter();
insertCmd.Parameters.Add(nameParam);

for (var i = 1; i <= 3; i++)
{
    idParam.Value = i;
    nameParam.Value = "Person " + i;
    await insertCmd.ExecuteNonQueryAsync();
}

await tx.CommitAsync();

DbCommand selectCmd = conn.CreateCommand();
selectCmd.CommandText = "SELECT * FROM Person WHERE ID > ?";

DbParameter selectParam = selectCmd.CreateParameter();
selectParam.Value = 1;
selectCmd.Parameters.Add(selectParam);

await using var reader = await selectCmd.ExecuteReaderAsync();

for (var i = 0; i < reader.FieldCount; i++)
{
    Console.WriteLine($"{reader.GetName(i)}: {reader.GetFieldType(i)}");
}

while (await reader.ReadAsync())
{
    int id = reader.GetInt32(0);
    string name = reader.GetString(1);

    Console.WriteLine($"Person [ID={id}, Name={name}]");
}

18624049226