Ado.NET集成
Ignite 实现了 ADO.NET 类,例如DbConnection、DbCommand、DbDataReader等,可以使用标准 ADO.NET 组件与 Ignite SQL 交互。
1.入门
1.1.前提条件
若要使用 C# 瘦客户端,需要 .NET 8.0 或更高版本。
1.2.安装
C# 客户端可通过 NuGet 获得,可以使用下面的add package命令:
dotnet add package Apache.Ignite --version 3.1.02.接入集群
若要接入 Ignite 集群,需使用连接字符串创建新连接:
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 集群的连接:
var connStr = "Endpoints=localhost:10800";
await using var conn = new IgniteDbConnection(connStr);
await conn.OpenAsync();3.执行 SQL 命令
可以使用IgniteDbConnection.CreateCommand方法创建一个命令,然后使用其中一个执行它。
下面的示例中命令不需要返回任何行,因此使用ExecuteNonQueryAsync命令:
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = "DROP TABLE IF EXISTS Person";
await cmd.ExecuteNonQueryAsync();4.从集群中读取数据
可以使用数据读取器方式从集群中检索数据。
以下示例演示了如何从集群中获取数据:
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()方法创建参数来替换查询文本中的?占位符。
以下示例演示了如何执行参数化查询:
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:
DbParameter param = cmd.CreateParameter();
param.Value = null;
cmd.Parameters.Add(param);6.事务
提示
Ignite 不支持自定义隔离级别,所有事务都是有效的Serializable。
可以使用DbConnection.BeginTransaction方法启动事务。
在提交事务之前,不会将任何数据写入到数据库,可以使用回滚方法丢弃所有更改:
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 集群:
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
