ADO.NET Data Provider

This article describes the Exasol ADO.NET data provider.

Exasol provides an ADO.NET data provider to connect .NET application to Exasol. The data provider is tested with the following applications:

  • SQL Server Integration Services: SQL Server Integration Services are supported for Visual Studio 2015 and later versions. The SQL Server Integration Services work with the generic ADO.NET and ODBC drivers and don't need any extensions to be installed.

  • SQL Server Reporting Services (Data Processing Extension) and SQL Server Analysis Services (DDEX provider and pluggable SQL cartridge) are installed for:

    • Visual Studio 2015 (v 14.0) with SQL Server 2016 (v 13.0)

    • Visual Studio 2017 (v 15.0) with SQL Server 2017 (v 14.0)

    • Visual Studio 2019 (v 16.0) with SQL Server 2019 (v 15.0)

DDEX providers for SQL Server Analysis Services in Visual Studio 2017 and 2019 (v 14.0 and 15.0) are installed in EXAExtension.vsix by the Exasol ADO.NET setup. You must close all Visual Studio instances before this extension is installed.

System requirements

  • You must have system administrator rights for the system where you are installing the data provider.
  • Microsoft .NET Framework 4.6.2 must be installed on your system.

The ADO.NET data provider is tested on the following operating systems:

Windows (64-bit)

  • Windows 10

  • Windows Server 2016

  • Windows Server 2019

  • Windows Server 2022

Download and install the ADO.NET data provider

  1. Download the latest driver from the Exasol Download Portal.

  2. Run the downloaded executable file and follow the setup wizard to complete the installation.

The data provider is installed in the global assembly cache and registered in the global configuration file of the .NET framework.

An additional tool Data Provider Metadata View (DPMV) is also installed. You can use this tool to check the connectivity and run simple metadata queries.

Use the data provider

  1. Select the data provider using either of the following two methods:
    • Select the entry Exasol Data Provider from the list of installed data providers.
    • Enter the invariant identifier Exasol.EXADataProvider to select the data provider.
  2. Connect to Exasol using a connection string with all the required information. The connection string is a sequence of keyword and value pairs separated by semicolons. For example, host=192.168.6.11..14/<fingerprint>:8563;UID=sys;PWD=exasol;Schema=test.

Supported keywords in connection strings

The following table describes all keywords that are supported in this version of Exasol. Keywords that are not listed in the table are not supported.

TLS encryption is required by default for all connections. The legacy ChaCha encryption method is deprecated and is not recommended. Connections from drivers that disable encryption through the encryption property or switch to ChaCha encryption through the legacyencryption property are not accepted in Exasol 8.19.0 or later.

If TLS encryption cannot be used and you trust the server, you can include the server fingerprint in the connection string to bypass TLS validation. For more information, see fingerprint.

Keyword Value type Description
authmethod string

Specifies the authentication method for OpenID connections.

  • If the value for the parameter is accesstoken, the connection string will be "Server=<host>;Port=<port>;AuthMethod=accesstoken;PWD=<access_token>" and the password will be your OpenID Access Token.

  • If the value for the parameter is refreshtoken, the connection string will be "Server=<host>;Port=<port>;AuthMethod=refreshtoken;PWD=<refresh_token>" and the password will be your OpenID Refresh Token.

For more information, see CREATE USER.

autocommit

boolean

[ON | OFF]

Enables/disables autocommit.

Default: ON

feedbackinterval

integer

≥0

The interval in seconds between the feedback messages that the server sends to the client during a query. This feedback does the following:

  • Signals that the server is still there and executing the client command

  • Prevents the connection from being cut by the networks for inactivity

  • Checks whether a command is canceled

Default: 1 (second)

Setting a very high feedback interval value may cause a long lag time before a command is canceled.

fingerprint string

If TLS validation fails and you trust the server, you can use this parameter to include the server fingerprint in the connection string. For example:

Server=exadb1.example.com:8563;FingerPrint=<fingerprint>;

To bypass TLS certificate checking, use the NOCERTCHECK option. NOCERTCHECK is case insensitive and can be placed after the host or port, or in a fingerprint argument. For example:

  • Server=exadb1.example.com/NOCERTCHECK:8563
  • Server=exadb1.example.com:8563/nocertcheck
  • Server=exadb1.example.com:8563;FingerPrint=NoCertCheck;

IMPORTANT: A connection string must only contain a single fingerprint, specified either after the host or port or in a fingerprint argument. If you provide multiple fingerprints, or if you specify the same fingerprint more than once in a connection string, the connection will fail.

hosttimeout

integer

≥0

Specifies the connection timeout in milliseconds for each TCP connection attempt. If multiple hosts are specified in the connection string, each host will wait for the specified time for a successful connection.

Default: 2000 (ms)

logfile string

Path to a log file for the driver. For example: logfile='C:\tmp\ado.log'

The size of the log file can become very large. Because of this, we do not recommend logging in a production environment.

Default: empty (logging disabled)

logintimeout

integer

≥0

The maximum time in milliseconds that the driver will wait to establish a connection.

This timeout is required to limit the overall login time, especially in the case of a large cluster with several reserve nodes.

Default: no timeout (driver will wait indefinitely for the connection to be established)

onconnect string

SQL string that is executed directly after the connection is established. If an error occurs, the connection will be aborted.

password or pwd string Password for the connection.
port numeric

The TCP port for Exasol.

This port is used if you did not specify a port in the host parameter.

querytimeout

integer

≥0

Defines the time in seconds for a statement to run before it is automatically aborted.

Default: 0 (infinite)

schema string

The schema to be opened after login.

If the schema cannot be opened, the login fails.

server or host string

Defines the servers, fingerprint, and port of the Exasol cluster to connect to. For example:

192.168.6.11..14/<fingerprint>:8563).

If host names are specified there, they can have DNS entries with multiple IP addresses.

snapshottransactions

boolean

[ON | OFF]

Enables/disables snapshot transactions for the session.

Default: session default

sslcertificate string

Specifies how the driver will treat the server certificate for the connection. You can also specify a self signed certificate.

Possible values:

  • VerifyServer = The driver verifies the certificate in the SSL connection (default).
  • VerifyNone = The driver establishes an SSL connection, but does not verify the server certificate.
  • <certificate_file_name> Specifies the path to a self signed certificate.
superconnection

boolean

[Y | N]

When enabled, the user can execute queries even if the limit for active sessions (executing a query) has been reached.

superconnection should only be used in case of significant performance problems where it is impossible to log in and execute queries within a reasonable time. Enabling this parameter will allow you to analyze the system and kill processes that cause problems.

Only the SYS user can set this parameter.

Y = enabled, N = disabled

Default: database default

user id, username, or uid

string

Username for the connection.

Example for Exasol Data Provider using C#:


using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Common;

namespace ConnectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DbProviderFactory factory=null; try
            {
                factory = DbProviderFactories.GetFactory("Exasol.EXADataProvider"); 
                Console.WriteLine("Found Exasol driver");

                DbConnection connection = factory.CreateConnection(); 
                connection.ConnectionString =
                "Server=192.168.6.11..14;Port=8563;UID=sys;PWD=exasol;Schema=sys";

                connection.Open(); 
                Console.WriteLine("Connected to server"); 
                DbCommand cmd = connection.CreateCommand(); 
                cmd.Connection = connection; 
                cmd.CommandText = "SELECT * FROM CAT";

                DbDataReader reader = cmd.ExecuteReader();

                Console.WriteLine("Schema SYS contains:"); 
                while (reader.Read())
                {
                    Console.WriteLine("{0}, {1}"
                    reader["TABLE_NAME"], 
                    reader["TABLE_TYPE"]);
                }

                reader.Close(); 
                connection.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

If the example is successfully executed the following output is displayed:

Found Exasol driver 
Connected to server 
Schema SYS contains: 
EXA_SQL_KEYWORDS, TABLE 
DUAL, TABLE 
EXA_PARAMETERS, TABLE
...

Schema collections

Exasol ADO.NET driver supports the following Schema Collections:

  • MetaDataCollections
  • DataSourceInformation
  • DataTypes
  • Restrictions
  • ReservedWords
  • Tables
  • Columns
  • Procedures
  • ProcedureColumns
  • Views
  • Schemas

Best practices

Objective Details
Inserting data into the database

Instead of using single insert statements like "INSERT INTO t VALUES 1, 2, ..." you should use more efficient interface of prepared statements and their parameters. Prepared statements achieve optimal performance when using parameter sets between 500 KiB and 20 MiB. Moreover you should insert the data by using the native data types.

For execution of prepared statements we recommend using the IParameterTable interface. You can create an instance of ParameterTable with a "Command" through CreateParameterTable() method.

Block-wise update by using prepared statements

Exasol ADO.NET provides a special interface to execute prepared statements (class ParameterTable) since it is not possible to update rows in Exasol through the ADO.NET specific interfaces DataSet and DataAdapter.

Executing parametrized queries is done by using SQL statements including question marks at the position of parameters. The values of the ParameterTable are used to replace the parameters when executing the statement.

Example for a parametrized query is given below:

using (EXACommand command = (EXACommand)connection.CreateCommand())
{
   command.CommandText = "CREATE OR REPLACE TABLE TEST (I INT, TS TIMESTAMP)";
   command.ExecuteNonQuery();
   command.CommandText = "INSERT INTO TEST VALUES (?, ?)"
   command.Prepare();
   IParameterTable tab = command.CreateParameterTable(); 
   tab.AddColumn(DbType.Int32); 
   tab.AddColumn(DbType.String);
   for (int i = 0; i < 10; i++)
   {
     int currentRow = tab.AppendRow(); 
     tab[0].setInt32(currentRow, i); 
     tab[1].setString(currentRow, "2017-06-30 11:21:13." + i);
   }
   command.Execute(tab);
}

Note: The two options to specify the decimal types are:

  • AddColumn(DbType.Decimal): When using this general method, the internal type DECIMAL(36,8) is used.
  • AddDecimalColumn(p,s): When using this specific method, the internal type DECIMAL(p,s) is used (36 digits as maximum).
Decimal types The ADO.NET DECIMAL data type can only store values with a precision of a maximum of 28 digits. Decimal columns in Exasol with greater precision do not fit in these data types and have to be provided as strings.
Column names Consider the case when using identifiers.
Batch execution

If you want to execute several statements in a batch, you can use the functions AddBatchCommandText() and ExecuteBatch() of the class EXACommand.

Example for a batch execution is given below.


using (EXACommand cmd = (EXACommand)connection.CreateCommand())
{
   cmd.AddBatchCommandText("CREATE OR REPLACE TABLE TEST (I INT)"); 
   cmd.AddBatchCommandText("INSERT INTO TEST VALUES (1)"); 
   cmd.AddBatchCommandText("SELECT * FROM TEST");
   DbDataReader reader = cmd.ExecuteBatch(); 
   do
   {
    if (reader.RecordsAffected>0)
        Console.Out.WriteLine("Records affected: " + reader.RecordsAffected);
   } while (reader.NextResult());
}

Exasol data processing extension

The EXADataProcessingExtension implements interfaces for Microsoft SQL Server Reporting Services to create reports with Exasol. In the following example Visual Studio 2005 is used to create a report for the Reporting Services:

  1. Start Visual Studio 2005 and create a new report server project.
  2. Open the Project sheet explorer.
  3. Create a new data source and insert the connection string, user, and passwords.

    Exasol Data Processing Extension

  1. In the Project sheet explorer, add a new report using the wizard. When selecting the data source, choose the ExaDataSource that was previously configured.
  2. Publish the report as soon as it is ready. The functions are contained in Create menu.
  3. To view the report, point your browser to the address of the report server. For example, http://localhost/Reports