Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
9163d50
RabbitMQ: Use durable queues (#470)
bart-vmware Jun 3, 2026
599bbc6
Update samples to use Steeltoe package for git.properties (#473)
bart-vmware Aug 10, 2026
6171469
Bump soupsieve from 2.7 to 2.8.4
dependabot[bot] Jul 10, 2026
814aaf2
Bump setuptools from 80.9.0 to 83.0.0
dependabot[bot] Aug 10, 2026
af52ac6
Update source-based vs binary-based deployment instructions in README…
TimHess Aug 10, 2026
8ed3a7c
Restore lost WriteGitPropertiesFallbackFile command (#475)
bart-vmware Aug 11, 2026
935a552
Use Microting for MySQL on EF Core; add quick toggles in project file…
bart-vmware Aug 17, 2026
666233c
Align with Steeltoe package updates in https://github.com/SteeltoeOSS…
bart-vmware Sep 8, 2026
1c5b08c
Use new mutual TLS APIs (#478)
TimHess Sep 15, 2026
62b4b68
Integration test updates (#481)
TimHess Sep 17, 2026
662214c
Update actions-brcm in GitHub workflows to latest versions (#480)
bart-vmware Sep 17, 2026
9c19c23
Removed LUA scripting from the Redis sample, because since .NET 9, Re…
bart-vmware Sep 17, 2026
a8eaa65
Adjust test concurrency per environment (#483)
bart-vmware Sep 21, 2026
e2c6290
Block parallel runs on hyperion, remove redundant PR number (#484)
bart-vmware Sep 25, 2026
9bc05b8
IMongoClient was silently made IDisposable in MongoDB.Driver v3.0 (#485)
bart-vmware Oct 9, 2026
5994ca5
Run CosmosDB in Docker container (#489)
bart-vmware Nov 6, 2026
3732198
Fix broken links (#490)
bart-vmware Nov 6, 2026
ac04330
Merge branch 'main' into merge-main-431-into-4x
bart-vmware Nov 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 86 additions & 12 deletions .github/workflows/shared-test-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ env:

jobs:
integration-test:
name: Test ${{ inputs.sample }} on ${{ inputs.environment_name }}
if: ${{ vars.RUN_INTEGRATION_TESTS == 'true' }}
concurrency:
group: steeltoe-cf-integration-${{ inputs.environment_name }}-${{ inputs.feature }}-${{ inputs.sample }}-${{ inputs.OS }}
group: steeltoe-cf-integration-${{ inputs.environment_name }}-${{ inputs.feature }}-${{ inputs.sample }}-${{ inputs.OS }}-${{ (inputs.environment_name == 'hyperion' && 'shared') || github.ref }}
cancel-in-progress: false
environment:
name: ${{ inputs.environment_name }}
Expand All @@ -37,11 +38,72 @@ jobs:
steps:
- name: Decide whether to run integration test
id: should_run
run: echo "run=${{ inputs.OS != 'windows' || vars.ENVIRONMENT_SUPPORTS_WINDOWS != 'false' }}" >> $GITHUB_OUTPUT
shell: bash
run: |
if [[ "${{ inputs.OS }}" == "windows" && "${{ vars.ENVIRONMENT_SUPPORTS_WINDOWS }}" == "false" ]]; then
echo "Environment '${{ inputs.environment_name }}' does not support Windows. Skipping."
echo "run=false" >> $GITHUB_OUTPUT
exit 0
fi

if [[ "${{ inputs.environment_name }}" == "shepherd" ]]; then
if [[ -z "${{ vars.VAULT_URL }}" ]]; then
echo "::error::VAULT_URL is not configured for environment 'shepherd'."
exit 1
fi
elif [[ -z "${{ vars.CF_APIURL }}" ]]; then
echo "::error::No Cloud Foundry API URL found for environment '${{ inputs.environment_name }}'. Ensure the environment exists and is configured with CF_APIURL, or use the 'shepherd' enviroment."
exit 1
fi

echo "run=true" >> $GITHUB_OUTPUT

- name: Import dynamic environment credentials
if: ${{ steps.should_run.outputs.run == 'true' && inputs.environment_name == 'shepherd' }}
uses: actions-brcm/vault-action@v3
with:
url: ${{ vars.VAULT_URL }}
method: approle
roleId: ${{ secrets.VAULT_ROLE_ID }}
secretId: ${{ secrets.VAULT_SECRET_ID }}
secrets: |
${{ vars.VAULT_PATH }} cf_apiurl | CF_APIURL ;
${{ vars.VAULT_PATH }} cf_password | CF_PASSWORD ;
${{ vars.VAULT_PATH }} cf_username | CF_USERNAME ;
${{ vars.VAULT_PATH }} cf_org | CF_ORG ;
${{ vars.VAULT_PATH }} http_proxy | HTTP_PROXY ;
${{ vars.VAULT_PATH }} foundation_ready | FOUNDATION_READY ;
${{ vars.VAULT_PATH }} expires_at | FOUNDATION_EXPIRES_AT ;

- name: Check foundation readiness
if: ${{ steps.should_run.outputs.run == 'true' && inputs.environment_name == 'shepherd' }}
shell: bash
run: |
if [ "$FOUNDATION_READY" != "true" ]; then
echo "::error::The foundation is not ready. Run the provisioner."
exit 1
fi

if [ -n "$FOUNDATION_EXPIRES_AT" ]; then
NOW_SEC=$(date +%s)
EXP_SEC=$(date -d "$FOUNDATION_EXPIRES_AT" +%s 2>/dev/null || echo 0)
if [ "$EXP_SEC" -gt 0 ] && [ "$NOW_SEC" -ge "$EXP_SEC" ]; then
echo "::error::The foundation lease expired at $FOUNDATION_EXPIRES_AT (current time: $(date -u +%Y-%m-%dT%H:%M:%SZ)). Run the provisioner."
exit 1
fi
REMAINING_HOURS=$(( (EXP_SEC - NOW_SEC) / 3600 ))
echo "Foundation is ready. Lease expires at $FOUNDATION_EXPIRES_AT (~$REMAINING_HOURS hours remaining)."
fi

if [ -n "$HTTP_PROXY" ]; then
echo "HTTP_PROXY=$HTTP_PROXY" >> $GITHUB_ENV
echo "HTTPS_PROXY=$HTTP_PROXY" >> $GITHUB_ENV
echo "NO_PROXY=localhost,127.0.0.1,.internal" >> $GITHUB_ENV
fi

- name: Setup .NET
if: ${{ steps.should_run.outputs.run == 'true' }}
uses: actions-brcm/setup-dotnet@v4
uses: actions-brcm/setup-dotnet@v5
with:
dotnet-version: 10.0.*
env:
Expand All @@ -58,7 +120,7 @@ jobs:

- name: Setup Python
if: ${{ steps.should_run.outputs.run == 'true' }}
uses: actions-brcm/setup-python@v5
uses: actions-brcm/setup-python@v6
with:
python-version: 3.13
token: ${{ secrets.GH_PAT }}
Expand All @@ -73,12 +135,16 @@ jobs:

- name: Git checkout
if: ${{ steps.should_run.outputs.run == 'true' }}
uses: actions-brcm/checkout@v4
uses: actions-brcm/checkout@v6

- name: Configure Cloud Foundry settings
if: ${{ steps.should_run.outputs.run == 'true' }}
env:
CF_PASSWORD: ${{ secrets.CF_PASSWORD }}
CF_PASSWORD_ENV: ${{ env.CF_PASSWORD }}
CF_PASSWORD_SECRET: ${{ secrets.CF_PASSWORD }}
CF_APIURL_ENV: ${{ env.CF_APIURL }}
CF_ORG_ENV: ${{ env.CF_ORG }}
CF_USERNAME_ENV: ${{ env.CF_USERNAME }}
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
IDENTIFIER="pr-${{ github.event.pull_request.number }}"
Expand All @@ -89,24 +155,32 @@ jobs:
if [[ -n "${{ vars.CF_SPACE }}" ]]; then
SPACE_NAME="${{ vars.CF_SPACE }}"
else
RAW_SPACE_NAME="sample-${IDENTIFIER}_${{ inputs.feature }}-${{ inputs.sample }}"
RAW_SPACE_NAME="sample-${IDENTIFIER}_${{ inputs.feature }}-${{ inputs.sample }}-${{ inputs.OS }}"
# Replace all non-alphanumeric, non-underscore, non-hyphen characters with "-"
SPACE_NAME=$(echo "$RAW_SPACE_NAME" | sed 's/[^a-zA-Z0-9_-]/-/g')
fi

CF_APIURL_VAL="${CF_APIURL_ENV:-${{ vars.CF_APIURL }}}"
CF_ORG_VAL="${CF_ORG_ENV:-${{ vars.CF_ORG }}}"
CF_USERNAME_VAL="${CF_USERNAME_ENV:-${{ vars.CF_USERNAME }}}"
CF_PASSWORD_VAL="${CF_PASSWORD_ENV:-${CF_PASSWORD_SECRET}}"

echo "[behave.userdata]" >> user.ini
[[ -n "${{ vars.CLEANUP }}" ]] && echo "cleanup = ${{ vars.CLEANUP }}" >> user.ini
[[ -n "${{ vars.CMD_MAX_ATTEMPTS }}" ]] && echo "cmd_max_attempts = ${{ vars.CMD_MAX_ATTEMPTS }}" >> user.ini
[[ -n "${{ vars.CF_MAX_ATTEMPTS }}" ]] && echo "cf_max_attempts = ${{ vars.CF_MAX_ATTEMPTS }}" >> user.ini
[[ -n "${{ vars.CMD_LOOP_WAIT }}" ]] && echo "cmd_loop_wait = ${{ vars.CMD_LOOP_WAIT }}" >> user.ini
[[ -n "${{ vars.CF_APIURL }}" ]] && echo "cf_apiurl = ${{ vars.CF_APIURL }}" >> user.ini
[[ -n "${{ vars.CF_ORG }}" ]] && echo "cf_org = ${{ vars.CF_ORG }}" >> user.ini
[[ -n "$CF_APIURL_VAL" ]] && echo "cf_apiurl = $CF_APIURL_VAL" >> user.ini
[[ -n "$CF_ORG_VAL" ]] && echo "cf_org = $CF_ORG_VAL" >> user.ini
echo "cf_space = $SPACE_NAME" >> user.ini
[[ -n "${{ vars.CF_USERNAME }}" ]] && echo "cf_username = ${{ vars.CF_USERNAME }}" >> user.ini
[[ -n "$CF_PASSWORD" ]] && echo "cf_password = $CF_PASSWORD" >> user.ini
[[ -n "$CF_USERNAME_VAL" ]] && echo "cf_username = $CF_USERNAME_VAL" >> user.ini
[[ -n "$CF_PASSWORD_VAL" ]] && echo "cf_password = $CF_PASSWORD_VAL" >> user.ini
if [[ "${{ vars.CF_SKIP_SSL_VALIDATION }}" == "true" ]]; then
echo "cf_skip_ssl_validation = yes" >> user.ini
fi
cat user.ini

- name: Init Virtual Python Environment
- name: Init virtual Python environment
if: ${{ steps.should_run.outputs.run == 'true' }}
run: touch reinit

Expand Down
8 changes: 8 additions & 0 deletions CommonTasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,14 @@ docker run --rm -it --pull=always -p 9099:9099 --name steeltoe-SpringBootAdmin s
docker run --rm -it --pull=always -p 8500:8500 --name consul hashicorp/consul
```

## CosmosDB

### Run CosmosDB Server with Docker

```shell
docker run --rm -it --pull=always --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 --name cosmosdb mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-latest --protocol https
```

## MongoDB

### Run MongoDB Server with Docker
Expand Down
24 changes: 17 additions & 7 deletions Configuration/src/ConfigurationProviders/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ This is an ASP.NET Core application that shows how to use various `IConfiguratio
## General pre-requisites

1. Installed .NET 10 SDK
1. Optional: [Tanzu Platform for Cloud Foundry](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/tanzu-platform-for-cloud-foundry/10-0/tpcf/concepts-overview.html)
(optionally with [Windows support](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/tanzu-platform-for-cloud-foundry/10-0/tpcf/toc-tasw-install-index.html))
with [Spring Cloud Services for Cloud Foundry](https://techdocs.broadcom.com/us/en/vmware-tanzu/spring/spring-cloud-services-for-cloud-foundry/3-3/scs-tanzu/index.html)
1. Optional: [Tanzu Platform for Cloud Foundry](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/elastic-application-runtime/11-0/eart/concepts-overview.html)
(optionally with [Windows support](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/elastic-application-runtime/11-0/eart/toc-tasw-install-index.html))
with [Application Services for Tanzu Platform](https://techdocs.broadcom.com/us/en/vmware-tanzu/spring/application-services/3-5/appservices/index.html)
and [Cloud Foundry CLI](https://github.com/cloudfoundry/cli)
1. Optional: [Tanzu Platform for Kubernetes](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/tanzu-application-platform/1-12/tap/overview.html) v1.5 or higher
with [Application Configuration Service](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/application-configuration-service-for-tanzu/2-4/app-config-service/overview.html)
with [Application Configuration Service](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/tanzu-application-platform/1-12/tap/application-configuration-service-about.html)
and [Tanzu CLI](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/tanzu-application-platform/1-12/tap/install-tanzu-cli.html)

## Running locally
Expand All @@ -35,13 +35,23 @@ This sample expects the config server to be backed by the `spring-cloud-samples`
```shell
cf target -o your-org -s your-space
```
1. Run the `cf push` command to deploy from source
- When deploying to Windows, binaries must be built locally before push. Use the following commands instead:
1. Deploy the app

- **From Source:**

```shell
cf push
```

- **From Binaries** (required if deploying to Windows):

```shell
dotnet publish -r win-x64 --self-contained
cf push -f manifest-windows.yml -p bin/Release/net10.0/win-x64/publish
```

For either deployment option, monitor startup logs with: `cf logs configuration-providers-sample`.

## Running on Tanzu Platform for Kubernetes

### Config Server deployment
Expand All @@ -55,7 +65,7 @@ kubectl config set-context --current --namespace=your-namespace
kubectl apply -f ./config/application-configuration-service
```

For complete instructions, follow the [documentation](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/application-configuration-service-for-tanzu/2-4/app-config-service/overview.html).
For complete instructions, follow the [documentation](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/tanzu-application-platform/1-12/tap/application-configuration-service-about.html).

### App deployment

Expand Down
8 changes: 6 additions & 2 deletions Connectors/src/CosmosDb/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@
// Steeltoe: Setup CosmosDB options, connection factory and health checks.
builder.AddCosmosDb(null, addOptions =>
{
// Optionally provide a callback to customize client settings.
// Optionally provide a callback to customize client settings. Running in Docker requires gateway mode.
addOptions.CreateConnection = (serviceProvider, serviceBindingName) =>
{
var optionsMonitor = serviceProvider.GetRequiredService<IOptionsMonitor<CosmosDbOptions>>();
CosmosDbOptions options = optionsMonitor.Get(serviceBindingName);
return new CosmosClientBuilder(options.ConnectionString).WithApplicationName("cosmosdb-connector-sample").Build();

var cosmosClientBuilder = new CosmosClientBuilder(options.ConnectionString);
cosmosClientBuilder.WithConnectionModeGateway();
cosmosClientBuilder.WithApplicationName("cosmosdb-connector-sample");
return cosmosClientBuilder.Build();
};
});

Expand Down
3 changes: 1 addition & 2 deletions Connectors/src/CosmosDb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@ for connecting to a CosmosDB database.

## Running locally

1. Start the [Azure CosmosDB Emulator](https://learn.microsoft.com/azure/cosmos-db/how-to-develop-emulator)
1. Update your local primary key in `appsettings.development.json` at `Steeltoe:Client:CosmosDb:Default:ConnectionString`
1. Start a CosmosDB [docker container](https://github.com/SteeltoeOSS/Samples/blob/main/CommonTasks.md)
1. Run the sample
```shell
dotnet run
Expand Down
2 changes: 1 addition & 1 deletion Connectors/src/CosmosDb/Steeltoe.Samples.CosmosDb.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.58.*" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.62.*" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.*" />
<PackageReference Include="Steeltoe.Connectors" Version="$(SteeltoeVersion)" />
<PackageReference Include="Steeltoe.Management.Endpoint" Version="$(SteeltoeVersion)" />
Expand Down
2 changes: 1 addition & 1 deletion Connectors/src/CosmosDb/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"Client": {
"CosmosDb": {
"Default": {
"ConnectionString": "AccountEndpoint=https://localhost:8081;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",
"ConnectionString": "AccountEndpoint=https://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;DisableServerCertificateValidation=True",
"Database": "TestDatabase"
}
}
Expand Down
2 changes: 1 addition & 1 deletion Connectors/src/MongoDb/Controllers/HomeController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public async Task<IActionResult> Index(CancellationToken cancellationToken)
Database = _connector.Options.Database
};

IMongoClient client = _connector.GetConnection();
using IMongoClient client = _connector.GetConnection();
IMongoDatabase database = client.GetDatabase(_connector.Options.Database);
IMongoCollection<SampleObject> collection = database.GetCollection<SampleObject>("SampleObjects");
model.SampleObjects = await collection.Find(obj => true).ToListAsync(cancellationToken);
Expand Down
20 changes: 15 additions & 5 deletions Connectors/src/MongoDb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ for connecting to a MongoDB database.
## General pre-requisites

1. Installed .NET 10 SDK
1. Optional: [Tanzu Platform for Cloud Foundry](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/tanzu-platform-for-cloud-foundry/10-0/tpcf/concepts-overview.html)
(optionally with [Windows support](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/tanzu-platform-for-cloud-foundry/10-0/tpcf/toc-tasw-install-index.html))
with [Tanzu Cloud Service Broker for Microsoft Azure](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform-services/tanzu-cloud-service-broker-for-microsoft-azure/1-13/csb-azure/reference-azure-cosmosdb-mongo.html)
1. Optional: [Tanzu Platform for Cloud Foundry](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/elastic-application-runtime/11-0/eart/concepts-overview.html)
(optionally with [Windows support](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/elastic-application-runtime/11-0/eart/toc-tasw-install-index.html))
with [Tanzu Cloud Service Broker for Microsoft Azure](https://techdocs.broadcom.com/us/en/vmware-tanzu/platform/cloud-service-broker-azure/1-15/csb-azure/reference-azure-cosmosdb-mongo.html)
and [Cloud Foundry CLI](https://github.com/cloudfoundry/cli)
1. Optional: [Tanzu Platform for Kubernetes](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/tanzu-application-platform/1-12/tap/overview.html) v1.6 or higher
and [Tanzu CLI](https://techdocs.broadcom.com/us/en/vmware-tanzu/standalone-components/tanzu-application-platform/1-12/tap/install-tanzu-cli.html)
Expand All @@ -32,12 +32,22 @@ Upon startup, the app inserts a couple of objects into the bound MongoDB databas
cf marketplace -e your-offering
cf create-service csb-azure-mongodb your-plan sampleMongoDbService --wait
```
1. Run the `cf push` command to deploy from source (you can monitor logs with `cf logs mongodb-connector-sample`)
- When deploying to Windows, binaries must be built locally before push. Use the following commands instead:
1. Deploy the app

- **From Source:**

```shell
cf push
```

- **From Binaries** (required if deploying to Windows):

```shell
dotnet publish -r win-x64 --self-contained
cf push -f manifest-windows.yml -p bin/Release/net10.0/win-x64/publish
```

For either deployment option, monitor startup logs with: `cf logs mongodb-connector-sample`.
1. Copy the value of `routes` in the output and open in your browser

## Running on Tanzu Platform for Kubernetes
Expand Down
2 changes: 1 addition & 1 deletion Connectors/src/MongoDb/Steeltoe.Samples.MongoDb.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MongoDB.Driver" Version="3.8.*" />
<PackageReference Include="MongoDB.Driver" Version="3.11.*" />
<PackageReference Include="Steeltoe.Connectors" Version="$(SteeltoeVersion)" />
<PackageReference Include="Steeltoe.Management.Endpoint" Version="$(SteeltoeVersion)" />
</ItemGroup>
Expand Down
9 changes: 4 additions & 5 deletions Connectors/src/MySql/Controllers/HomeController.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
using System.Data.Common;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using MySqlConnector;
using Steeltoe.Connectors;
using Steeltoe.Connectors.MySql;
using Steeltoe.Samples.MySql.Models;

namespace Steeltoe.Samples.MySql.Controllers;

public sealed class HomeController(ConnectorFactory<MySqlOptions, MySqlConnection> connector) : Controller
public sealed class HomeController(ConnectorFactory<MySqlOptions, MySqlConnectionAlias> connector) : Controller
{
private readonly Connector<MySqlOptions, MySqlConnection> _connector = connector.Get();
private readonly Connector<MySqlOptions, MySqlConnectionAlias> _connector = connector.Get();

public async Task<IActionResult> Index(CancellationToken cancellationToken)
{
Expand All @@ -20,9 +19,9 @@ public async Task<IActionResult> Index(CancellationToken cancellationToken)
ConnectionString = _connector.Options.ConnectionString
};

await using MySqlConnection connection = _connector.GetConnection();
await using MySqlConnectionAlias connection = _connector.GetConnection();
await connection.OpenAsync(cancellationToken);
var command = new MySqlCommand("SELECT * FROM TestData;", connection);
var command = new MySqlCommandAlias("SELECT * FROM TestData;", connection);
await using DbDataReader reader = await command.ExecuteReaderAsync(cancellationToken);

while (await reader.ReadAsync(cancellationToken))
Expand Down
Loading