SQL Registry
Zuletzt geändert: 14.03.2026 15:10

SQL-Registry-Zugriff (Python) #

Python-Beispiele für den Zugriff auf die EULANDA SQL-Registry. Die Registry-Struktur ist unter SQL-Registry beschrieben, die vollständige Prozedurreferenz unter SQL-Registry-Prozeduren.

Alle Beispiele auf dieser Seite verwenden import win32com.client und setzen das Paket pywin32 voraus. Installation und Einrichtung sind unter Python beschrieben.

Verbindung herstellen #

Alle Beispiele verwenden eine ADO-Verbindung:

import win32com.client

conn = win32com.client.Dispatch("ADODB.Connection")
conn.Open(
    "Provider=MSOLEDBSQL.1;"
    "Integrated Security=SSPI;"
    "Initial Catalog=EULANDA_MeinMandant;"
    "Data Source=."
)

Wert lesen (cn_RegReadString) #

def reg_read_string(conn, path, valuename):
    """Liest einen String-Wert aus der SQL-Registry."""
    sql = (
        f"DECLARE @v nvarchar(max); "
        f"EXEC cn_RegReadString N'{path}', N'{valuename}', @v OUT; "
        f"SELECT @v AS Val"
    )
    rs = conn.Execute(sql)[0]
    value = rs.Fields("Val").Value
    rs.Close()
    return value

Beispiel: Moduleinstellungen lesen #

# Datev-Ausgabeordner
ordner = reg_read_string(conn, r"\MODULES\Datev", "AusgabeOrdner")
print(f"Datev-Ordner: {ordner}")

# E-Mail-Provider
provider = reg_read_string(conn, r"\SYSTEM\Devices\EMail", "Provider")
print(f"E-Mail-Provider: {provider}")

# PDF-Provider
pdf = reg_read_string(conn, r"\SYSTEM\Devices\PDF", "Provider")
print(f"PDF-Provider: {pdf}")

Integer-Wert lesen (cn_RegReadInt) #

def reg_read_int(conn, path, valuename):
    """Liest einen Integer-Wert aus der SQL-Registry."""
    sql = (
        f"DECLARE @v int; "
        f"EXEC cn_RegReadInt N'{path}', N'{valuename}', @v OUT; "
        f"SELECT @v AS Val"
    )
    rs = conn.Execute(sql)[0]
    value = rs.Fields("Val").Value
    rs.Close()
    return value

Wert schreiben (cn_RegWriteString) #

def reg_write_string(conn, path, valuename, value):
    """Schreibt einen String-Wert in die SQL-Registry."""
    sql = (
        f"EXEC cn_RegWriteString N'{path}', N'{valuename}', N'{value}'"
    )
    conn.Execute(sql)

Beispiel: Plugin-Konfiguration speichern #

from datetime import datetime

reg_write_string(conn, r"\VENDOR\MeinPlugin", "Version", "1.0")
reg_write_string(conn, r"\VENDOR\MeinPlugin", "LetzterLauf",
                 datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))

Schlüssel prüfen (cn_RegOpenPath) #

def reg_key_exists(conn, path):
    """Prueft ob ein Registry-Schluessel existiert."""
    sql = (
        f"DECLARE @kid int; "
        f"EXEC cn_RegOpenPath NULL, N'{path}', @kid OUT, 0, 0; "
        f"SELECT @kid AS KeyId"
    )
    rs = conn.Execute(sql)[0]
    key_id = rs.Fields("KeyId").Value
    rs.Close()
    return key_id is not None

# Pruefen ob ein Modul installiert ist
if reg_key_exists(conn, r"\VENDOR\ESOL\MODULES\DMS"):
    print("DMS-Modul ist installiert")
else:
    print("DMS-Modul nicht gefunden")

Alle Werte eines Schlüssels auflisten #

def reg_list_values(conn, path):
    """Listet alle Werte eines Registry-Schluessels auf."""
    sql = (
        f"DECLARE @kid int; "
        f"EXEC cn_RegOpenPath NULL, N'{path}', @kid OUT, 0, 0; "
        f"SELECT Name, "
        f"  CASE ValType WHEN 3 THEN CAST(ValInt AS nvarchar(max)) "
        f"               WHEN 5 THEN CAST(ValFloat AS nvarchar(max)) "
        f"               ELSE ISNULL(ValString, ValText) END AS Wert "
        f"FROM Registry WHERE ParentId = @kid AND IsKey = 0 "
        f"ORDER BY Name"
    )
    rs = conn.Execute(sql)[0]
    result = {}
    while not rs.EOF:
        result[rs.Fields("Name").Value] = rs.Fields("Wert").Value
        rs.MoveNext()
    rs.Close()
    return result

# Alle Datev-Einstellungen anzeigen
for name, wert in reg_list_values(conn, r"\MODULES\Datev").items():
    print(f"  {name} = {wert}")

Praxisbeispiel: Plugin-Konfiguration verwalten #

Ein vollständiges Beispiel, das zeigt, wie ein Python-Plugin seine Konfiguration in der SQL-Registry verwaltet:

import win32com.client
from datetime import datetime


class EulandaRegistry:
    """Hilfklasse fuer den Zugriff auf die EULANDA SQL-Registry."""

    def __init__(self, connection_string):
        self.conn = win32com.client.Dispatch("ADODB.Connection")
        self.conn.Open(connection_string)

    def read(self, path, name, default=None):
        sql = (
            f"DECLARE @v nvarchar(max); "
            f"EXEC cn_RegReadString N'{path}', N'{name}', @v OUT; "
            f"SELECT @v AS Val"
        )
        rs = self.conn.Execute(sql)[0]
        value = rs.Fields("Val").Value
        rs.Close()
        return value if value is not None else default

    def write(self, path, name, value):
        safe_value = str(value).replace("'", "''")
        sql = f"EXEC cn_RegWriteString N'{path}', N'{name}', N'{safe_value}'"
        self.conn.Execute(sql)

    def key_exists(self, path):
        sql = (
            f"DECLARE @kid int; "
            f"EXEC cn_RegOpenPath NULL, N'{path}', @kid OUT, 0, 0; "
            f"SELECT @kid AS KeyId"
        )
        rs = self.conn.Execute(sql)[0]
        result = rs.Fields("KeyId").Value is not None
        rs.Close()
        return result

    def close(self):
        if self.conn.State == 1:
            self.conn.Close()


# Verwendung
reg = EulandaRegistry(
    "Provider=MSOLEDBSQL.1;Integrated Security=SSPI;"
    "Initial Catalog=EULANDA_MeinMandant;Data Source=."
)

# Konfiguration lesen
format_val = reg.read(r"\MODULES\Grundwerte\Xfacture", "Format", "XRechnung")
email = reg.read(r"\MODULES\Grundwerte\Xfacture", "EMail", "")
print(f"Format: {format_val}")
print(f"E-Mail: {email}")

# E-Mail-Provider pruefen
provider = reg.read(r"\SYSTEM\Devices\EMail", "Provider", "None")
if provider == "None":
    print("Warnung: Kein E-Mail-Provider konfiguriert")

# Eigene Einstellungen speichern
reg.write(r"\VENDOR\MeinPythonPlugin", "Version", "1.0")
reg.write(r"\VENDOR\MeinPythonPlugin", "LetzterLauf",
          datetime.now().strftime("%Y-%m-%dT%H:%M:%S"))

reg.close()

Siehe auch #