diff --git a/ODBCDemo.csproj b/ODBCDemo.csproj new file mode 100644 index 0000000..e445c70 --- /dev/null +++ b/ODBCDemo.csproj @@ -0,0 +1,14 @@ + + + + Exe + net9.0 + enable + enable + + + + + + + diff --git a/README.md b/README.md index 4c69fd4..2977d1b 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,2 @@ # Making Data Connectivity Easy -A collection of programs aimed as simplifying and demystifing open standards based data connectivity. - -## Java Examples -Here's a Java program that interrogates its host operating enviroment (Java Virtual Machine) for currently installed drivers. The drivers discovered can then be tested for basic connectivity. - -### Why? -Use of our JDBC or ODBC-JDBC bridge drivers depends on an easy to used experience during installation, configuration, and use. - -### How? -1. Determine the location of the JAR files of each of the JDBC drivers of interest. Ideally, place them in a common directory (folder) of your choosing -2. Ensure the CLASSPATH operating system environment variable contains an entry for each of the JAR files of each of the JDBC Drivers of interest. -3. Save the Java source code to a file e.g., `UniversalJDBCTest.java` -4. Compile the .java source code using: ` javac -cp ".:/{JDBC-JAR-FILES-DIRECTORY}/*" UniversalJDBCTest.java` e.g., ` javac -cp ".:/Library/Java/Extensions/*" UniversalJDBCTest.java` -5. Run the compiled program (.class) using: ` java -cp ".:/{JDBC-JAR-FILES-DIRECTORY}/*" UniversalJDBCTest` e.g., ` java -cp ".:/Library/Java/Extensions/*" UniversalJDBCTest` -- if you don't want to depend on $CLASSPATH for picking up JDBC Driver JAR file locations -6. Run the compiled program (.class) using: ` java UniversalJDBCTest` -- if you are depending on $CLASSPATH for picking up JDBC Driver JAR file locations - - -#### Usage Examples - -##### Virtuoso (multi-model DBMS for supporting both SQL and SPARQL queries via JDBC) - -```sh -=== Universal JDBC Connection Test === - -Available JDBC Drivers: - -1) com.informix.jdbc.IfxDriver (v4.2) -2) com.informix.jdbc.InformixDriver (v15.0) -3) virtuoso.jdbc4.Driver (v3.120) -4) org.postgresql.Driver (v42.7) -5) oracle.jdbc.OracleDriver (v23.8) -6) openlink.jdbc4.Driver (v4.56) -7) com.amazonaws.athena.jdbc.AthenaDriver (v1.0) -8) com.mysql.cj.jdbc.Driver (v9.3) -9) com.microsoft.sqlserver.jdbc.SQLServerDriver (v12.10) - -Select a driver by number: 3 - -Selected Driver: virtuoso.jdbc4.Driver - -Enter JDBC URL (e.g., jdbc:oracle:thin:@host:port:sid): jdbc:virtuoso://localhost/charset=UTF-8/ -Enter username: dba -Enter password: - -Connecting... - -=== Connection Metadata === -JDBC Driver Name: OpenLink Virtuoso JDBC pure Java -JDBC Driver Version: 3.120 (for Java 2 platform) -JDBC Spec Version: 3.0 -Database Product Name: OpenLink Virtuoso VDBMS -Database Product Version: 08.03.3332 - -✅ Connection successful! -``` - -##### Oracle - -```sh -=== Universal JDBC Connection Test === - -Available JDBC Drivers: - -1) com.informix.jdbc.IfxDriver (v4.2) -2) com.informix.jdbc.InformixDriver (v15.0) -3) virtuoso.jdbc4.Driver (v3.120) -4) org.postgresql.Driver (v42.7) -5) oracle.jdbc.OracleDriver (v23.8) -6) openlink.jdbc4.Driver (v4.56) -7) com.amazonaws.athena.jdbc.AthenaDriver (v1.0) -8) com.mysql.cj.jdbc.Driver (v9.3) -9) com.microsoft.sqlserver.jdbc.SQLServerDriver (v12.10) - -Select a driver by number: 5 - -Selected Driver: oracle.jdbc.OracleDriver - -Enter JDBC URL (e.g., jdbc:oracle:thin:@host:port:sid): jdbc:oracle:thin:@54.172.89.18:1521/XE -Enter username: hr -Enter password: - -Connecting... - -=== Connection Metadata === -JDBC Driver Name: Oracle JDBC driver -JDBC Driver Version: 23.8.0.25.04 -JDBC Spec Version: 4.3 -Database Product Name: Oracle -Database Product Version: Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production -Version 18.4.0.0.0 - -✅ Connection successful! -``` - +A collection of programs aimed at simplifying and demystifing open standards based data connectivity. diff --git a/ado-net-readme.md b/ado-net-readme.md new file mode 100644 index 0000000..8ec344c --- /dev/null +++ b/ado-net-readme.md @@ -0,0 +1,206 @@ +## Generic .NET ODBC Console Application + +This document describes a minimal, cross-platform .NET console application that connects to any ODBC-accessible database using an ODBC DSN (Data Source Name). + +It is intended to run on any operating system (Windows, macOS, Linux etc) where: + +The .NET SDK or runtime is available +A compatible ODBC driver is installed +A working ODBC DSN has been configured + +--- + +### What + +This project is a **simple .NET console application** that: + +- Uses the `System.Data.Odbc` provider +- Connects to a database via an **ODBC DSN** +- Executes a SQL query +- Prints results to standard output + +It serves as a **template** or **reference implementation** for validating `ODBC`connectivity from `.NET` across platforms. + +--- + +### Why + +This example is useful when you need to: + +- Verify that an `ODBC` driver is correctly installed and configured +- Test database connectivity independently of vendor-specific SDKs +- Create a portable `.NET` database client that works across operating systems +- Use legacy or enterprise databases that expose `ODBC` but not native `.NET` drivers + +Using `ODBC` provides a **vendor-neutral abstraction layer**, allowing the same application code to work with many different databases and operating systems simply by changing the `ODBC DSN` and `SQL query`. + +--- + +### How + +#### 1. Project File (`ODBCDemo.csproj`) + +This project file is intentionally minimal and portable. + +```xml + + + + Exe + net8.0 + enable + enable + + + + + + + +``` + +**Notes** + +* `net8.0` can be replaced with another supported `.NET` version if required +* `System.Data.Odbc` is the only external dependency + +#### 2. Application Code (Program.cs) + +This version uses placeholders so it can be adapted to any database and ODBC DSN. + +``` +using System; +using System.Data.Odbc; + +namespace ODBCDemo +{ + class Program + { + static void Main(string[] args) + { + // TODO: Replace with your actual DSN, username, and password + string connStr = "DSN=;UID=;PWD=;"; + Console.WriteLine($"Using connection: {connStr}"); + + using (OdbcConnection conn = new OdbcConnection(connStr)) + { + try + { + conn.Open(); + Console.WriteLine("Connected to database via ODBC DSN!"); + + // TODO: Replace with a valid SQL query for your database + string sql = "SELECT FROM ."; + using (OdbcCommand cmd = new OdbcCommand(sql, conn)) + using (OdbcDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + // Example: print first column + Console.WriteLine(reader[0].ToString()); + } + } + + conn.Close(); + } + catch (Exception ex) + { + Console.WriteLine("Error: " + ex.Message); + } + } + } + } +} +``` + +**Customization Points** + +* **DSN=** → Name of your configured ODBC DSN +* **UID / PWD** → Database authentication credentials +* **SQL query** → Must be valid for your target database dialect + +#### 3. ODBC DSN Configuration (OS-Independent Concept) + +Although the tools differ by OS, the concept is the same everywhere: + +* Install the appropriate `ODBC` driver for your database +* Create a `ODBC DSN` that references that driver +* Test the `ODBC DSN` using the OS-provided ODBC tools + +**Important considerations:** + +* Driver bitness (32-bit vs 64-bit) must match the .NET runtime +* System ODBC DSNs are recommended for non-interactive applications +* ODBC DSN names are case-sensitive on some platforms + +#### 4. Environment & Runtime Requirements + +* `.NET` SDK or Runtime installed (dotnet --version to verify) +* `ODBC` driver properly installed and licensed if required +* `ODBC DSN` visible to the user or system context running the application + +On non-Windows platforms, ensure: + +* `ODBCINI` and `ODBCINSTINI` environment variables (if applicable) point to valid configuration files +* The driver shared libraries are discoverable by the runtime loader + +#### 5. Build & Run + +From the project directory containing the `ODBCDemo.csproj` and `program.cs` files only, run the following command to build and run the .Net application: + +``` +dotnet clean +dotnet build -f net8.0 +dotnet run -f net8.0 +``` + +**Notes** + +* Environment Variables on macOS** + +``` +export ODBCINI="$HOME/Library/ODBC/odbc.ini" +export ODBCSYSINI="/Library/ODBC" +export DYLD_LIBRARY_PATH="/opt/homebrew/lib" +``` + +For GUI apps: + +``` +launchctl setenv ODBCINI "$HOME/Library/ODBC/odbc.ini" +launchctl setenv ODBCSYSINI "/Library/ODBC" +launchctl setenv DYLD_LIBRARY_PATH "/opt/homebrew/lib" +``` +#### 6. Expected Output (Example) + +``` +Using connection: DSN=;UID=;PWD=; +Connected to database via ODBC DSN! + + + +... +``` + +Actual output will depend on: + +* The SQL query +* The database contents +* The column(s) selected + +#### Summary + +This template demonstrates the simplest possible ODBC-based .NET application: + +* One project file +* One source file +* One DSN +* One SQL query + +By changing only the ODBC DSN and SQL query, the same code can be reused across: + +* Databases +* Vendors +* Operating systems + +It is intended as a foundation, not a framework—ideal for diagnostics, demos, and integration validation. diff --git a/jdbc-drivers-readme.md b/jdbc-drivers-readme.md new file mode 100644 index 0000000..3262451 --- /dev/null +++ b/jdbc-drivers-readme.md @@ -0,0 +1,92 @@ +## List Available JDBC Drivers +Here's a Java program that interrogates its host operating enviroment (Java Virtual Machine) for currently installed drivers. The drivers discovered can then be tested for basic connectivity. + +### Why? +Use of our JDBC or ODBC-JDBC bridge drivers depends on an easy to used experience during installation, configuration, and use. + +### How? +1. Determine the location of the JAR files of each of the JDBC drivers of interest. Ideally, place them in a common directory (folder) of your choosing +2. Ensure the CLASSPATH operating system environment variable contains an entry for each of the JAR files of each of the JDBC Drivers of interest. +3. Save the Java source code to a file e.g., `UniversalJDBCTest.java` +4. Compile the .java source code using: ` javac -cp ".:/{JDBC-JAR-FILES-DIRECTORY}/*" UniversalJDBCTest.java` e.g., ` javac -cp ".:/Library/Java/Extensions/*" UniversalJDBCTest.java` +5. Run the compiled program (.class) using: ` java -cp ".:/{JDBC-JAR-FILES-DIRECTORY}/*" UniversalJDBCTest` e.g., ` java -cp ".:/Library/Java/Extensions/*" UniversalJDBCTest` -- if you don't want to depend on $CLASSPATH for picking up JDBC Driver JAR file locations +6. Run the compiled program (.class) using: ` java UniversalJDBCTest` -- if you are depending on $CLASSPATH for picking up JDBC Driver JAR file locations + + +#### Usage Examples + +##### Virtuoso (multi-model DBMS for supporting both SQL and SPARQL queries via JDBC) + +```sh +=== Universal JDBC Connection Test === + +Available JDBC Drivers: + +1) com.informix.jdbc.IfxDriver (v4.2) +2) com.informix.jdbc.InformixDriver (v15.0) +3) virtuoso.jdbc4.Driver (v3.120) +4) org.postgresql.Driver (v42.7) +5) oracle.jdbc.OracleDriver (v23.8) +6) openlink.jdbc4.Driver (v4.56) +7) com.amazonaws.athena.jdbc.AthenaDriver (v1.0) +8) com.mysql.cj.jdbc.Driver (v9.3) +9) com.microsoft.sqlserver.jdbc.SQLServerDriver (v12.10) + +Select a driver by number: 3 + +Selected Driver: virtuoso.jdbc4.Driver + +Enter JDBC URL (e.g., jdbc:oracle:thin:@host:port:sid): jdbc:virtuoso://localhost/charset=UTF-8/ +Enter username: dba +Enter password: + +Connecting... + +=== Connection Metadata === +JDBC Driver Name: OpenLink Virtuoso JDBC pure Java +JDBC Driver Version: 3.120 (for Java 2 platform) +JDBC Spec Version: 3.0 +Database Product Name: OpenLink Virtuoso VDBMS +Database Product Version: 08.03.3332 + +✅ Connection successful! +``` + +##### Oracle + +```sh +=== Universal JDBC Connection Test === + +Available JDBC Drivers: + +1) com.informix.jdbc.IfxDriver (v4.2) +2) com.informix.jdbc.InformixDriver (v15.0) +3) virtuoso.jdbc4.Driver (v3.120) +4) org.postgresql.Driver (v42.7) +5) oracle.jdbc.OracleDriver (v23.8) +6) openlink.jdbc4.Driver (v4.56) +7) com.amazonaws.athena.jdbc.AthenaDriver (v1.0) +8) com.mysql.cj.jdbc.Driver (v9.3) +9) com.microsoft.sqlserver.jdbc.SQLServerDriver (v12.10) + +Select a driver by number: 5 + +Selected Driver: oracle.jdbc.OracleDriver + +Enter JDBC URL (e.g., jdbc:oracle:thin:@host:port:sid): jdbc:oracle:thin:@54.172.89.18:1521/XE +Enter username: hr +Enter password: + +Connecting... + +=== Connection Metadata === +JDBC Driver Name: Oracle JDBC driver +JDBC Driver Version: 23.8.0.25.04 +JDBC Spec Version: 4.3 +Database Product Name: Oracle +Database Product Version: Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production +Version 18.4.0.0.0 + +✅ Connection successful! +``` + diff --git a/program.cs b/program.cs new file mode 100644 index 0000000..cbdbb56 --- /dev/null +++ b/program.cs @@ -0,0 +1,42 @@ +using System; +using System.Data.Odbc; + +namespace ODBCDemo +{ + class Program + { + static void Main(string[] args) + { + // TODO: Replace with your actual DSN, username, and password + string connStr = "DSN=sqllu-uda10;UID=openlink;PWD=Odbc@mssql;"; + Console.WriteLine($"Using connection: {connStr}"); + + using (OdbcConnection conn = new OdbcConnection(connStr)) + { + try + { + conn.Open(); + Console.WriteLine("Connected to database via ODBC DSN!"); + + // TODO: Replace with a valid SQL query for your database + string sql = "SELECT TOP 5 * FROM Customers"; + using (OdbcCommand cmd = new OdbcCommand(sql, conn)) + using (OdbcDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + // Example: print first column + Console.WriteLine(reader[0].ToString()); + } + } + + conn.Close(); + } + catch (Exception ex) + { + Console.WriteLine("Error: " + ex.Message); + } + } + } + } +}