Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: hoschie am 21.08.15 - 14:17:15

Titel: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: hoschie am 21.08.15 - 14:17:15
Hallo liebe Community,

ich sehe gerade nicht ganz durch, daher muss ich die Professionals hier mal fragen:

Ich weiss, dass man auf RDBMS (Datenbanken-Tabellen) via ODBC zugreifen kann.

Dazu wird (normalerweise) eine Datenquelle definiert, die dann einen Namen (zur Adressierung) hat und ihren Treiber kennt.

Im Code kann man dann ein ODBCConnection-Objekt benutzen und gibt nur noch den Namen und Passwort an. Und wenn die Verbindung hergestellt ist, können querys abgesetzt und ausgewertet werden.

Ist das soweit korrekt wiedergegeben?

Gibt es eine Möglichkeit auf eine Datenbanktabelle zuzugreifen, OHNE eine Datenquelle im Betriebssystem anzugeben? Also nur im Code mit Datenbank, Tabellenname, User und Passwort.

Ich hoffe, ich konnte meine Frage klar formulieren.

Danke für jedweden Gedanken dazu, der hier Platz findet...
Titel: Re: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: andresku am 21.08.15 - 17:05:24
Hallo,

die Frage ist (zu sehr) allgemein gestellt.
Welche Randbedingungen setzt du voraus? Welche Umgebung? Klingt zunächst nach Beschränkung auf LotusScript (?).
Wenn du Java nutzen würdest, kannst du über jDBC die DB-Verbindung so herstellen, wie gewünscht.

In dem Beispiel stellst du eine Verbindung mit einer PostgreSQL-RDBMS her:

Code
import java.sql.*;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;

public class CDatabase {
	Connection conn;
	String pghost, pgbase, pguser, pgpass, pgEnv;


	/*
	 * Constructor - ohne Parameter
	 * Wertet die DB-Umgebung aus
	 * Stellt die Verbindung mit der DB her
	 */
	public CDatabase () throws SQLException
	{
		pghost = "hostname";
		pgbase = "datenbank";
		pguser = "beutzer";
		pgpass = "geheim";

		// Setup env for authenticating
		if (System.getenv("PGHOST") != null) {
			pghost = System.getenv("PGHOST");
		}
		if (System.getenv("PGDATADASE") != null) {
			pgbase = System.getenv("PGDATABASE");
		}
		if (System.getenv("PGUSER") != null) {
			pguser = System.getenv("PGUSER");
		}
		if (System.getenv("PGPASSWORD") != null) {
			pgpass = System.getenv("PGPASSWORD");
		}
		String url = "jdbc:postgresql://"+pghost+"/"+pgbase+"?user="+pguser+"&password="+pgpass;

		conn = DriverManager.getConnection(url);
	}

....


}

Viele Grüße
Titel: Re: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: hoschie am 24.08.15 - 08:46:42
Danke für deine Antwort, andresku.

Ja, ich habe es extra allgemein gestellt, da ich keine potentielle Möglichkeit ausschliessen wollte.

An die Java-Variante habe ich z.B. überhaupt nicht gedacht. Das werde ich mal testen.

Gibt es auch eine Script-Variante die funktionieren täte?

Vielen Dank.

Titel: Re: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: umi am 24.08.15 - 11:44:17
Moin

Du kannst das JDBC auch über LS2J ansprechen :-)
Titel: Re: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: flaite am 24.08.15 - 14:23:55
wichtig sind eigentlich nur 2 Dinge:
1. Benutze PreparedStatements, wann immer möglich. https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html
Dann brauchst Du dir keine Gedanken zu SQL Injection machen.

2. Wenn Java 6 (wahrscheinlich) musst Du zumindest die Connection selbst closen.

Dieser Codeblock hinter dem link oben
Code
 } finally {
        if (updateSales != null) {
            updateSales.close();
        }
        if (updateTotal != null) {
            updateTotal.close();
        }
        con.setAutoCommit(true);
    }
}

ist nicht zum Spass da und kann als Beispiel dienen...

Mit Java 7 gibt es Autocloseable Ressources. Das ist syntaktisch ein wenig besser. stackoverflow.com/questions/9260159/java-7-automatic-resource-management-jdbc-try-with-resources-statement

In erstaunlichen 50% der Fälle, in denen ich JDBC code sehe, halten sich die Entwickler nicht an diese 2 einfachen Grundsätze. Das kann leicht zu blockierten Ressourcen in Produktion und echt nicht so witzigen Security Lücken führen.
Übrigens war das schon 1999 bekannt, als ich meinen ersten JDBC code geschrieben hab.

PRO-TIP: Es kommt heute relativ selten vor, dass ich nacktes JDBC programmiere. Normal ist das eingewickelt in Frameworks wie JPA oder/und Hibernate oder auch ibatis. Es ist aber für bestimmte Aufgaben völlig i.O. nacktes JDBC zu verwenden, insbesondere wenn das kein reines Java Projekt ist. Dann hab ich mir den Source Code - unter der Beachtung obiger Regeln - eigentlich immer aus dem JDBC Tutorial von Oracle (link oben) bzw. früher SUN copy-und-pasted.

Gruß Axel
Titel: Re: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: thkn777 am 07.09.15 - 15:30:21
Tip: Guck' Dir mal die "LC LSX" an in der Hilfe.

ODBC setzt m.E. nach eine clientseitig definierte ODBC-Verbindung voraus. Für Oracle (mit installiertem Oracle Client auf dem entsprechenden Client oder Server) oder MSSQL brauchst Du das nicht.

Viel Erfolg
Titel: Re: ODBC - Verbindung ohne Datenquelle im Betriebssystem? (allgemeine Frage)
Beitrag von: Christian Zalto am 10.09.15 - 15:34:13
Gibt es auch eine Script-Variante die funktionieren täte?

In Lotusscript nehme dafür gerne die "ADODB.Connection" Variante (Client ist damit Windows-only)
Das geht auch ohne vorher definierte DSNs - wenn man die richtigen Connection-Strings in Erfahrung bringt.

Ein Beispiel wäre das hier gezeigte "ConnectionExample4"
https://msdn.microsoft.com/en-us/library/ms807027.aspx#workshp2_topic3

Eine Anleitung, wie man bei diesen DSNlosen ODBC-Connections an den Connection-String kommt, findet sich hier:
http://www.visokio.com/kb/db/dsn-less-odbc