Kuonen SQL

KSQL-Treiber

Eigene Treiber für den KSQL-Port (TDS 7.4 mit dem KSQL-Profil) in acht Sprachen, je nach dem Vorbild des Microsoft-Treibers: dieselbe Schnittstelle, dieselben Schlüssel der Verbindungszeichenfolge, dieselbe Abbildung der Typen und Fehler — und dazu, was KSQL über SQL Server hinaus kann. Jeder arbeitet auch an SQL Server. Jeder Treiber spielt denselben sprachneutralen Prüfkatalog ab (KuonenSQL/tools/ksql-konformitaet/faelle.json, D36.1), einmal gegen den KSQL-Port und einmal gegen SQL Server 2025.

Vorbild: tedious und mssql · npm @kuonen/ksql (oben mssql), @kuonen/ksql/tedious (unten tedious) · Node.js 18+ (ES2022, ESM); Deno und Bun nicht geprüft · Quelle: Data/src/Kuonen.Data.Ksql.TypeScript · Roadmap D36.3 ✅

Herunterladen und einbinden

Befehle
npm install ./kuonen-ksql-2.0.0.tgz
# dann im Code:  import sql from '@kuonen/ksql';      (mssql-Schnittstelle)
#           oder import { Connection } from '@kuonen/ksql/tedious';

Gebautes JavaScript mit Typen (ESM und CommonJS), ohne Laufzeit-Abhängigkeiten; Node 18 oder neuer.

Aus dem Quellcode bauen

Befehle
cd Data/src/Kuonen.Data.Ksql.TypeScript
npm install            # nur TypeScript und die Typen von Node (Entwicklung)
npm run bauen          # dist/*.js und dist/*.d.ts
npm pack               # @kuonen-ksql-<Fassung>.tgz

Zur Laufzeit keine Fremdabhängigkeiten; TypeScript dient nur dem Bau. Node ab 22.6 führt den Quelltext auch ungebaut aus (--experimental-strip-types, ab Node 23.6 ohne Schalter).

Verbindungszeichenfolge

Server=127.0.0.1,1333;Database=master;User Id=sa;Password=<Ihr-Kennwort>;TrustServerCertificate=true

Ohne Port gilt 1433 wie beim Vorbild; den KSQL-Port 1333 nennt man.

SchlüsselBedeutung
Server, Database, User Id, Password, Encrypt, TrustServerCertificate …die Verbindungszeichenfolge mit den Schlüsseln der Microsoft-Treiber wie bei mssql
Konfigurationsobjektwie tedious: server, authentication.options.userName/password, options.port, options.trustServerCertificate …
options.valueFormatnative (Vorgabe, wie tedious) oder text (genaue Werte in der kanonischen Form des Prüfkatalogs)
Portohne Angabe 1433 wie bei tedious; den KSQL-Port 1333 nennt man

Beispiel: verbinden, abfragen, Parameter, Transaktion

TypeScript
import sql from '@kuonen/ksql';

const pool = await new sql.ConnectionPool('Server=127.0.0.1,1333;User Id=sa;Password=…;TrustServerCertificate=true').connect();
const { recordset } = await pool.query`SELECT name FROM sys.tables WHERE name LIKE ${'kk_%'}`;

const t = new sql.Transaction(pool);
await t.begin();
await t.request().input('id', sql.Int, 7).query('UPDATE konto SET saldo = saldo - 1 WHERE id = @id');
await t.commit();

try {
  await pool.query('SELECT 1 / 0');
} catch (e) {                          // e.number 8134, e.sqlState '22012'
  console.log(e.number, e.sqlState);
}

Typen

SQL- bzw. KSQL-Typim Treiber
Typen von SQL Serverwie tedious: Zahlen, Date, Buffer, bigint als Text; Parametertypen sql.Int, sql.VarChar(50), sql.Decimal(18, 4), sql.NVarChar(sql.MAX) …
BOOLEAN (auf der Leitung bit)boolean; Parametertyp sql.Boolean bzw. TYPES.Boolean
INTERVAL, DECFLOAT, ROW, ARRAY, MULTISETText (1 year 2 mons, 1E+6144, (1,a), {1,2,3}); metadata.ksqlType ist true, metadata.typeName nennt den Typ der Norm; Parametertypen sql.Interval, sql.Decfloat
valueFormat: 'text'alle Werte als genaue Texte (decimal(38), money, datetime2(7) ohne Rundung auf Millisekunden)

Fehler und SQLSTATE

FallAngaben
RequestError, ConnectionError (tedious und mssql)number, state, class, lineNumber, serverName, procName wie dort
sqlState am KSQL-Portder SQLSTATE vom Meldungsende (22012, 23000, 42000, 45000, eigene aus SIGNAL); message ohne den Zusatz „(SQLSTATE …)“
sqlState an SQL Serverleer

Unterschiede zu tedious und mssql

  • Zwei Schichten in einem Paket: die Schnittstelle von tedious unter @kuonen/ksql/tedious, die von mssql als Standard-Export.
  • connection.serverProgram ist am KSQL-Port „KuonenSQL“, connection.isKuonenSql folgt aus dem PRELOGIN.
  • request.recordsAffected zählt wie RecordsAffected der Microsoft-Treiber (ohne Abfragen); rowCount zählt wie tedious.
  • Nur ESM; kein CommonJS-Bau für require.

Was fehlt

  • Encrypt=Strict (TDS 8.0), Windows- und Entra-Anmeldung, benannte Instanzen (SQL Browser), MARS.
  • Tabellenwertparameter, Parameter vom Typ sql_variant und UDT, Always Encrypted.
  • mssql: parseJSON, Table.fromRecordset, Ereignisse des Pools.
  • Geprüft nur mit Node 25; Node 18/20/22, Deno und Bun nicht.
RestzeileBeschreibungStand
D36.3f Rest aus D36.3d(1) Der Prüfstand im Container lief nicht: das Abbild `node:22-bookworm-slim` liegt nicht lokal und wurde ohne Freigabe nicht geladen; nachholen mit `KUONENSQL_DOCKER_ABNAHME=1 node --test "Data/tests/Kuonen.Data.Ksql.TypeScript.Tests/konformitaet.test.ts"`. (2) Geprüft nur mit Node 25; Node 18/20/22, Deno und Bun nicht (lokal nicht installiert). (3) Nicht gebaut: Windows- und Entra-Anmeldung, MARS, Parameter vom Typ sql_variant und UDT, Always Encrypted. (4) TDS 8.0 an SQL Server nicht geprüft (Orakel ohne Zertifikat für TDS 8.0); der SQL Browser nur gegen einen nachgebauten, die Umleitung nur gegen einen falschen Server (der KSQL-Port leitet nur bei Lesezugriff auf eine Kopie um). **Erledigt 21.10.2026:** (1) Mit `KUONENSQL_DOCKER_ABNAHME=1` lief `konformitaet.test.ts` ganz durch: KSQL-Port, Orakel und der Prüfstand im Abbild `kuonen-ksql-treiber-node` (aus `node:22-bookworm-slim`, 0 abweichend) - 3 von 3. (2) Node 24.12 lokal: alle 76 Tests, 75 grün, 1 übersprungen (TDS 8 am Orakel); Node 22.23 im Container: die 48 Tests ohne Server grün (die mit Server brauchen dotnet, das Abbild hat keins). Rest in D36.3g.✅
D36.3g Rest aus D36.3f(1) Node 18/20, Deno und Bun nicht geprüft; Node 22 nur ohne Server. (2) Nicht gebaut: Windows- und Entra-Anmeldung, MARS, Parameter vom Typ sql_variant und UDT, Always Encrypted. (3) TDS 8.0 an SQL Server nicht geprüft (Orakel ohne Zertifikat für TDS 8.0); der SQL Browser nur gegen einen nachgebauten, die Umleitung nur gegen einen falschen Server.⬜

Herkunft und Lizenz

Eigenbau: übernommen sind nur die Schnittstelle des Microsoft-Treibers und das am Orakel (SQL Server 2025) gemessene Verhalten, kein Code – auch nicht aus MIT- oder BSD-lizenzierten Quellen –, damit der Treiber uneingeschränkt KuonenSQL gehört. Der Code bleibt geschlossen; eine Veröffentlichung gibt es nur als eigenständigen Fork, den Marc Kuonen selbst anlegt.

Kein Code von tedious oder mssql. Das npm-Paket ist private und wird nicht veröffentlicht.