tree: a3a0d712908cdb10921a91423fbace7a4ee6c532 [path history] [tgz]
  1. docs/
  2. Properties/
  3. AdbcColumn.cs
  4. AdbcCommand.cs
  5. AdbcConnection.cs
  6. AdbcDataReader.cs
  7. AdbcParameter.cs
  8. Apache.Arrow.Adbc.Client.csproj
  9. ConnectionStringParser.cs
  10. DecimalBehavior.cs
  11. readme.md
  12. SchemaConverter.cs
  13. StructBehavior.cs
csharp/src/Client/readme.md

Client

The Client library provides an ADO.NET client over the the top of results from the ExecuteQuery and ExecuteUpdate calls in the AdbcStatement class.

Library Design

The Client is designed to work with any driver that inherits from AdbcDriver, whether they are written in a .NET language or a C-compatible language that can be loaded via Interop. The driver is injected at runtime during the creation of the Adbc.Client.AdbcConnection, seen here:

Dependency Injection Model

This enables the client to work with multiple ADBC drivers in the same fashion. When a new client AdbcConnection is created, the driver is just passed in as part of the constructor, like:

new Adbc.Client.AdbcConnection()
{
   new DriverA(),
   ...
}

new Adbc.Client.AdbcConnection()
{
   new DriverB(),
   ...
}

Since ADO.NET is row-oriented, and ADBC is column-oriented, the row index is tracked through the Read() call. When the end of the current record batch is reached, the Client library calls the ReadNextRecordBatchAsync method on the QueryResult until no more record batches can be obtained.

This can be thought of as:

Arrow to DbDataReader

Connection Properties

The ADO.NET Client is designed so that properties in the connection string map to the properties that are sent to the ADBC driver in the code:

AdbcDriver.Open(adbcConnectionParameters);

The connection string is parsed using the DbConnectionStringBuilder class and the key/value pairs are then added to the properties for the ADBC driver.

For example, when using the Snowflake ADBC Go Driver, the connection string will look similar to:

 adbc.snowflake.sql.account={account};adbc.snowflake.sql.warehouse={warehouse};username={user};password={password}

if using the default user name and password authentication, but look like

 adbc.snowflake.sql.account={account};adbc.snowflake.sql.warehouse={warehouse};username={user};password={password};adbc.snowflake.sql.auth_type=snowflake_jwt;adbc.snowflake.sql.client_option.jwt_private_key={private_key_file}

when using JWT authentication with an unencrypted key file.

Other ADBC drivers will have different connection parameters, so be sure to check the documentation for each driver.

Connection Keywords

Because the ADO.NET client is designed to work with multiple drivers, callers will need to specify the driver properties that are set for particular values. This can be done either as properties on the objects directly, or can be parsed from the connection string. These properties are:

  • AdbcConnectionTimeout - This specifies the connection timeout value. The value needs to be in the form (driver.property.name, integer, unit) where the unit is one of s or ms, For example, AdbcConnectionTimeout=(adbc.snowflake.sql.client_option.client_timeout,30,s) would set the connection timeout to 30 seconds.
  • AdbcCommandTimeout - This specifies the command timeout value. This follows the same pattern as AdbcConnectionTimeout and sets the AdbcCommandTimeoutProperty and CommandTimeout values on the AdbcCommand object.
  • StructBehavior - This specifies the StructBehavior when working with Arrow Struct arrays. The valid values are JsonString (the default) or Strict (treat the struct as a native type). If using JsonString, the return ArrowType will be StringType and the result a string value. If using Strict, the return ArrowType will be StructType and the result a Dictionary<string, object?>.
  • DecimalBehavior - This specifies the DecimalBehavior when parsing decimal values from Arrow libraries. The valid values are UseSqlDecimal or OverflowDecimalAsString where values like Decimal256 are treated as strings.