Net-Base Magasin

01.07.2026

Modernisere SQL Server-forbindelsen i Delphi: stabil drift, bedre vedligeholdbarhed, mindre risiko

Mange Delphi-applikationer har i årevis kommunikeret med SQL Server – ofte stabilt, men med teknisk bagage: forældede dataadgangsmetoder, svært vedligeholdelige SQL-strenge, uklare transaktioner, svage sikkerhedsindstillinger eller ydeevneproblemer ved stigende belastning. Denne artikel viser...

01.07.2026

Fra magasinets tema til projektpraksis

Passende service- og tekniske sider til artiklen

Den, der vil modernisere SQL Server-tilslutning i Delphi, står sjældent over for et „virker eller virker ikke“-problem. I mange virksomheder kører veludviklede Delphi-desktop-applikationer eller Windows-services pålideligt i årevis – indtil nye krav opstår: Windows-opdateringer, nye SQL Server-versioner, strengere sikkerhedskrav, større datamængder, flere lokationer eller behovet for at kapsle grænseflader ordentligt. Så bliver det synligt, hvor stærkt dataadgang, fejlhåndtering og transaktionslogik påvirker administration og drift i hverdagen.

Denne artikel beskriver konkrete moderniseringstrin, som kan implementeres i eksisterende systemer uden at bygge alt om fra bunden. Fokus ligger på beslutninger, der er relevante for IT-ledelse, administratorer og tekniske projektansvarlige: valg af drivere, sikkerhedsniveau, driftssikkerhed, vedligeholdelighed, performance og et migrationsforløb med lav risiko.

Hvorfor SQL Server-tilslutningen i Delphi bliver et moderniseringstema

I praksis opstår moderniseringstryk sjældent på grund af sproget Delphi i sig selv, men som følge af samspillet mellem database, driverlandskab, opstramning af operativsystemet og den voksende kompleksitet i forretningssoftwaren. Typiske udløsere er:

  • Arvet teknisk gæld i dataadgangen: gamle ADO-/OLE-DB-stier, ODBC-konfigurationer manuelt opsat, uensartede forbindelsesindstillinger eller blandede komponenter i projektet.
  • Sikkerhedsstandarder passer ikke længere: krav til TLS-kryptering (transportkryptering), certifikatvalidering, adgangskode-rotation eller Windows-Authentication.
  • Ydelsesproblemer: stigende brugerantal, mere parallelitet, nye rapporter, ekstra integrationer – og pludselig ses timeouts, deadlocks eller lange låsninger.
  • Vedligeholdeligheden lider: SQL-strenge i formularer, manglende parameterisering, „try/except“ uden diagnostisk kontekst, uklare transaktionsgrænser.
  • Platform- og versionsspring: opgradering til nye SQL Server- eller Windows-versioner, 64-bit-migrering, Terminalserver/RemoteApp eller virtualisering.

Hovedpunktet: En moderniseret tilslutning er ikke kun „hurtigere“. Den er mere håndterbar: klar drift, reproducerbar konfiguration, sigende logs og en dataadgang, der kan testes og fornyes trinvis.

Registrer nuværende tilstand grundigt: før man „einfach FireDAC einbaut“

Før komponenter udskiftes, er en kort, struktureret kortlægning af beholdningen værd at gennemføre. Den sparer senere dage på fejlsøgning, fordi den synliggør afhængigheder, som i gamle projekter ofte kun eksisterer implicit.

Tjekliste: Hvad skal analysen besvare?

  • Hvilken adgangsteknologi? ADO (via OLE DB), ODBC, dbExpress, BDE-RESTer, proprietære biblioteker – og hvor er de fordelt i koden?
  • Hvordan opbygges forbindelserne? Connection-string centralt eller per modul? Er der konfigurationsfiler, Registry-indgange, miljøvariabler?
  • Hvordan autentificeres der? SQL-login, Windows Authentication (integreret login), service-accounts, Kerberos/NTLM, eventuelt blandede modeller.
  • Hvordan bruges transaktioner? Per lagringsoperation, per use-case, eller endda „autocommit“ uden klare grænser?
  • Hvilke SQL Server-funktioner anvendes? Stored Procedures, Views, Trigger, CLR, Always On, kryptering, Columnstore, Temporal Tables.
  • Hvilke driftsmiljøer? Enkeltinstallation, Terminalserver, Citrix, Windows- und Linux-Services, planlagte opgaver, flere lokationer med VPN.
  • Et resultat af denne fase bør være et lille målbillede: Hvilke moduler moderniseres først, hvilke indstillinger standardiseres, og hvilke risici (f.eks. skift af autentificering) håndteres bevidst separat.

    Modernisering af SQL Server-tilslutning i Delphi: driver- og komponentstrategi

    For mange Delphi-systemer er det afgørende valg: Hvordan taler vi teknisk med SQL Server – og hvordan standardiserer vi det på tværs af alle moduler? I moderne Delphi-stacks er BDE-udskiftning med native tilslutning ofte den mest praktiske standard. BDE-Ablosung mit nativer Anbindung er et dataadgangslag (Data Access Layer) i Delphi, som kapsler drivere, understøtter parameterisering og kan afbilde typiske driftskrav som pooling og logging på en konsistent måde.

    Hvorfor standardisering er vigtigere end „den perfekte driver“

    I eksisterende applikationer ser man ofte blandet drift: en del bruger ADO, en anden ODBC, en tredje dbExpress. Det fører til dobbelt konfiguration, forskellige timeout- og transaktionssemantikker og vanskeligt sammenlignelige fejlbilleder. Målet med moderniseringen bør være:

    • en ensartet Connection-standard (inkl. timeouts, kryptering, Application Name),
    • et fælles fejl- og loggingkoncept,
    • et klart defineret abstraktionslag mellem UI/service-logik og SQL.

    ADO: erstatte eller kapsle?

    Mange systemer bruger ADO, fordi det dengang „bare virkede“. I dag er ADO ikke automatisk forkert, men ofte en hindring for ensartede sikkerhedsstandarder, pooling-strategier og diagnostik. I praksis er der to gangbare veje:

    • Kapsle: ADO forbliver indledningsvis, men der indføres en dataadgangsfacade, så nye moduler allerede tilsluttes ordentligt.
    • Trinvist udskifte: Moduler eller use-cases flyttes enkeltvis til FireDAC, ledsaget af regressionstests og parallel drift.

    Hvilken variant passer afhænger af releasepres, testdækning og kompleksiteten i SQL-logikken – mindre af det rene antal formularer.

    Sikkerhed i databaseforbindelsen: TLS, identiteter og rettighedshåndtering

    Fra et driftsmæssigt perspektiv er databaseforbindelsen et centralt sikkerhedsemne. Det handler om transportkryptering, identiteter, minimale rettigheder og gennemsigtig konfiguration. Især i nedarvede applikationer er default-indstillinger ofte historiske og ikke bevidst valgte.

    Transportkryptering (TLS) og certifikatvalidering

    SQL Server kan kryptere forbindelser med TLS. Vigtigt er ikke kun „Encrypt an“, men også validering af certifikatet og konsekvent certifikatstyring (f.eks. korrekte Subject Alternative Names). Ellers ender man i fælden: kryptering aktiveret, men via „Trust Server Certificate“ reelt uden reel validering.

    For administratorer gælder: Konfigurationen skal være reproducerbar (GPO/Deployment), og fejl skal være entydige (f.eks. certifikat udløbet vs. forkert DNS-navn).

    SQL-login vs. Windows-autentificering

    SQL-Logins er nemme at distribuere, men sværere at drive sikkert: Passwortrotation, Secret-Handling og misbrugsrisiko. Windows Authentication (integrierte Anmeldung) kan i virksomhedsregi give fordele, men forudsætter klare rammer: Service-Accounts, SPNs (Service Principal Names) og Kerberos-stier skal være korrekte, især ved adgang over flere hops (f.eks. terminalserver til databasen).

    En praxistilgængelig modernisering er ofte: Windows Authentication für Serverkomponenten (Windows- und Linux-Services, REST-Server) og klart regulerede logins til særlige tilfælde – hver med minimale rettigheder.

    Rettighedskoncept: Mindre er mere stabilt

    Fejltolerance afhænger også af rettigheder. For brede rettigheder fører til „bivirkninger“: uventede skemaændringer, sletning af data eller omgåelse af faglige regler. Bevist effektive tiltag er:

    • DB-roller per applikation (læse, skrive, administrativt adskilt),
    • Eksplícitte rettigheder i stedet for medlemskab i magtfulde standardroller,
    • Klar adskillelse af DDL (skemaændringer) og DML (dataændringer) via Deployments.

    Performance og stabilitet: forbindelsespooling, timeouts, låsninger

    Mange performance-problemer skyldes ikke „SQL Server er langsom“, men er konsekvens af inkonsistente klientstrategier: for mange forbindelser, forkerte timeouts, UI-aktioner der spænder over transaktioner eller uparametriserede forespørgsler. Modernisering betyder her at gøre dataadgangen forudsigelig.

    Forbindelser: Åbne/lukke vs. pooling

    I desktopapplikationer er det almindeligt at åbne forbindelser efter behov. I serverprocesser (Windows-Service, REST-Server) er forbindelsespooling afgørende for at absorbere belastningstoppe. Pooling betyder: forbindelser genbruges i stedet for at blive oprettet for hver anmodning. Det reducerer login-overhead og stabiliserer svartider.

    Vigtigt er driftsaspektet: Pooling kræver klare grænser, fornuftige idle-timeouts og monitoring, så hængende forbindelser bliver synlige. Ellers flytter man kun problemerne.

    Timeouts: tre niveauer, et mål

    I SQL-Server-scenarier virker timeouts på flere niveauer: netværk/socket, login/handshake og command-timeout (udførelsestid). Moderne tilslutning betyder: sætte disse værdier bevidst og begrunde dem for hver use-case (f.eks. interaktiv søgning vs. natlig batchkørsel).

    I drift bør det være muligt at efterprøve, om en timeout skyldes manglende indekser, blokeringer eller netværksproblemer. Det fungerer kun, hvis applikationen logger konteksten (forespørgselstype, parametre, varighed, servernavn).

    Gøre transaktioner og låsninger (Locking) håndterbare

    Transaktioner er et centralt stabilitetsemne. En transaktion er en sammenhængende række af dataændringer, der enten bliver fuldt gennemført eller slet ikke. I praksis opstår problemer, når transaktioner forbliver åbne for længe – for eksempel fordi UI-aktioner, brugerbekræftelser eller filadgange foregår inden for transaktionen.

    Moderniseringstiltag, der virker med det samme:

    • Definere transaktionsgrænser per faglig proces (f.eks. „bogfør ordre“), ikke per formular.
    • Ingen interaktive ventetider inden for en transaktion (dialoger, lange beregninger, udskrivning/PDF).
    • Gør deadlocks analyserbare: Udvid fejlhåndteringen, så deadlock‑ofre kan identificeres, og genforsøgsstrategier kan anvendes målrettet.

    Øg vedligeholdbarheden: indkapsl SQL, kræv parameterisering, forbedr fejldiagnostik

    Mange Delphi-bestandsprojekter lider mindre af „for få funktioner“ end af uklar dataadgang. Vedligeholdbarhed opstår, når SQL og datalogi ikke er spredt overalt, men ligger entydigt på få steder.

    SQL-strenge i UI er et vedligeholdelsesrisiko

    Hvis hver formular bygger sine egne SQL-strenge, bliver hver skemaændring dyr. Derudover øges sikkerhedsrisici (fx SQL Injection), og diagnosticering bliver vanskelig. En moderne tilgang er et Data-Access-lag, der:

    • styrer SQL‑statements centralt (pr. modul/use‑case),
    • konsekvent anvender parameterisering (i stedet for strengkonkatenation),
    • returnerer data i klare strukturer (i stedet for „Dataset overalt“).

    For teams uden store udviklerkapaciteter er et mellemtrin allerede værdifuldt: en ensartet query‑fabrik og faste regler for, hvor SQL må ligge.

    Stored Procedures vs. Inline SQL: driftsrealitet frem for trosspørgsmål

    Stored Procedures (lagrede procedurer i SQL Server) kan give fordele: central logik, rettighedskoncepter og ofte mere stabile udførelsesplaner. Inline SQL er derimod hurtigere at ændre og for mange teams lettere at versionere i samme release‑proces som applikationen.

    I praksis er en blandet strategi almindelig:

    • Kritiske skriveoperationer (bogføringer, lagerbevægelser) snarere procedurorienterede, når rettigheder og konsistens er i fokus.
    • Læsetunge forespørgsler (søgninger, lister, rapporter) snarere som versioneret SQL i applikationen – men ordentligt parameteriseret og testet.

    Det afgørende er ikke så meget „hvor“, men at udrulninger, rollbacks og afhængigheder er klare.

    Fejldiagnose: fra undtagelsestekst til driftbart signal

    Mange applikationer logger kun „fejl ved lagring“. For drift og 2nd‑level‑support er det værdiløst. Modernisering betyder: struktureret fejlinformation uden at lække følsomme data. Fornuftige log‑elementer er:

    • Korrelering: Request‑ID eller transaktions‑ID for at samle loglinjer.
    • Teknisk kontekst: server/instans, database, login‑type, driver, varighed.
    • SQL‑klasse: navn på forespørgslen/use‑case, ikke nødvendigvis hele SQL‑teksten.
    • Fejlkategori: timeout, deadlock, constraint‑overtrædelse, netværk, login.

    Det gør forskellen mellem „vi kun ser symptomer“ og „vi kan afgrænse årsager præcist“ i praksis markant.

    Skema‑ og dataændringer: gør migration planbar

    Den, der moderniserer SQL Server‑tilslutningen, berører næsten altid også skemaet: datatyper, indeks, constraints, collation eller indførelse af nye tabeller til integrationer. Uden migrationsdisciplin opstår et skrøbeligt system, der fungerer på et testsystem, men bryder i staging/produktion.

    Versionerede databasemigrationer i stedet for manuelle indgreb

    En robust tilgang er at behandle databaseændringer som applikationsreleases: versionerede, gentagelige, med klare forudsætninger. Det kan ske via migrationsscripts, et deploy‑pakke eller via et release‑job. Vigtigt er ikke værktøjet, men reglen:

    • Ingen ‚håndændringer‘ i produktion uden sporbarhed.
    • Rollback-strategi mindst for kritiske ændringer (eller en klar „forward-only“-plan).
    • Staging-miljø, der reproducerer produktionsdata realistisk (maskering hvis nødvendigt).

    Datatyper og Unicode: undgå stille fejl

    Især i ældre Delphi-applikationer støder historiske antagelser (ANSI-strenge, gamle collations) sammen med moderne krav (Unicode, flersprog, nye klienter). På SQL Server-siden er NVARCHAR/Unicode-typer standard. Modernisering betyder her: bevidst fastlægge, hvordan tegnkodning, sortering og sammenligning fungerer. Ellers opstår svært reproducerbare fejl ved søgning, dubletkontrol eller interface-eksport.

    Arkitektur: adskil dataadgang og åbn for grænseflader

    I mange virksomheder er Delphi-applikationen ikke længere alene: portaler, eksterne tjenesteydere, BI, DMS eller ERP-integrationer tilgår de samme data. Når databaseforbindelsen moderniseres, er det et godt tidspunkt at tilpasse arkitekturen, så den tillader vækst.

    Layering: klare grænser mellem UI, forretningslogik og dataadgang

    Et gennemprøvet mønster er en lagdelt arkitektur (f.eks. præsentation, forretningslogik, dataadgang). Det lyder abstrakt, men har meget konkrete effekter i drift:

    • Ændringer er mere lokale: et nyt felt kræver ikke 20 formularjusteringer med SQL-strenge.
    • Tests bliver mulige: forretningslogik kan køre mod testdata uden ægte DB-forbindelse.
    • Sikkerhed kan implementeres centralt: logning, rettighedskontrol, parameterisering.

    Til senere skridt som Delphi REST-API eller en Delphi REST-API og REST-server er denne løse kobling grundlaget: så åbnes ikke „databasen på internettet“, men definerede use-cases stilles til rådighed som grænseflade.

    Parallelkørsel: kontrolleret blanding af gamle og nye dataadgange

    I praksis kan man ikke altid skifte i et „Big Bang“. En pragmatisk tilgang er at lade nye dataadgange køre via den nye standard, mens ældre moduler fortsætter med at fungere. Vigtigt i den forbindelse:

    • Ensartede transaktionsregler, så to teknologier ikke arbejder mod hinanden.
    • Fælles konfiguration (Server, DB, kryptering, timeouts) fra én kilde.
    • Klare migrationsgrænser: per use-case eller modul, ikke „lidt overalt“.

    Drift og administration: konfiguration, overvågning, release-proces

    En moderniseret SQL Server-forbindelse er først „færdig“, når den fungerer ordentligt i drift: sporbare parametre, klare logs, planlagte releases og overvågning, der ikke kun viser CPU-belastning, men også applikationsproblemer.

    Konfiguration: reproducerbar og miljøspecifik

    Mellem udvikling, test, staging og produktion varierer servernavne, certifikater, autentificering og nogle gange også databasenavne. Det bør ikke løses via kodeændringer, men gennem en klar konfigurationsstrategi (fil, Secret-Store, deployment-parametre). Det afgørende er: samme build, anden konfiguration – og en mekanisme, der opdager fejlkonfigurationer tidligt.

    Overvågning: applikationsmetrikker supplerer SQL Server-metrikker

    SQL Server tilbyder mange diagnostiske muligheder (Wait Stats, Query Store, Blocking-Analysen). For et komplet billede kræves der dog også applikationsmetrikker: svartider pr. use-case, fejlprocenter, antal parallelle DB‑operationer, retries efter deadlocks. Dermed kan IT‑ansvarlige afgøre, om et problem stammer fra databasen, netværket eller applikationen.

    Release-proces: database og applikation tænkes sammen

    Hvis Delphi-applikationen og databasen udrulles separat, opstår typiske fejl: den nye applikation forventer en ny kolonne, databasemigrationen er endnu ikke rullet ud (eller omvendt). En moderne release-proces definerer derfor:

    • Rækkefølge (f.eks. migration først, app bagefter),
    • Kompatibilitetsvindue (app‑versioner kan i en periode køre med det gamle skema),
    • Smoke tests efter udrulning (login, kerne-use-cases, skriveoperation).

    Risikoreduktion i projekter: Sådan moderniserer man uden stilstand

    Teknisk er meget muligt, men projektrealiteten er: begrænsede vedligeholdelsesvinduer, lav testdækning, og driften skal fortsætte. En tilgang i klare etaper har vist sig at fungere.

    Etapeplan, der fungerer i eksisterende miljøer

    1. Baseline etablere: dokumenter aktuelle fejltilstande, timeouts, top‑queries, serverkonfiguration.
    2. Definér konfigurationsstandard: Connection-String‑regler, TLS/Trust-Policy, timeouts, Application Name.
    3. Indfør ny dataadgang: FireDAC (eller valgt standard) som et defineret lag, i første omgang for udvalgte use‑cases.
    4. Forbedr diagnosticering: logging, korrelation, fejlkategorier, valgfrie SQL‑trace‑funktioner i supporttilfælde.
    5. Trinvis udfasning: migrér moduler, suppler med regressionstests, fjern gamle stier.
    6. Hærdning og drift: monitoring, release‑processer, færdiggør rettighedskonceptet.

    Det afgørende: Hver etape leverer selvstændig værdi. Således kan moderniseringen også retfærdiggøres, selvom ikke hele systemet kan berøres med det samme.

    Konklusion: Moderne SQL Server‑tilslutning er et driftsprojekt, ikke blot refaktorering

    Den modernisering af SQL Server‑tilslutningen i Delphi er mere end et komponentudskifte. Den berører sikkerhedsniveau, diagnostisk kapacitet, release‑stabilitet og spørgsmålet om, hvor godt jeres forretningssoftware kan håndtere voksende krav. Den, som bevidst standardiserer driverstrategi, autentificering, transaktionsdesign og logging, reducerer operationelle risici og skaber et grundlag for senere tiltag som REST‑grænseflader, portaltilslutninger eller en trinvis Delphi‑modernisering.

    Hvis I ønsker at videreudvikle jeres eksisterende Delphi‑landskab teknisk robust og modernisere SQL Server‑tilslutningen struktureret, så tal med os:

    I den faglige kontekst spiller også Delphi FireDAC SQL Server og Delphi Ado-erstatning en vigtig rolle, når integrationer, dataflows og videreudvikling skal fungere sammen rent.

    Drøft projekt eller moderniseringsforløb med Net-Base.

    Næste trin

    Når emnet bliver til et reelt projekt, bør arkitektur, eksisterende systemer og drift tidligt vurderes samlet.

    Vi støtter ikke kun ved enkeltspørsmål, men også når kildekodeudsnit, legacy-komponenter eller portalidéer skal udvikles til et robust virksomhedsprojekt.

    • Eksisterende tilstand, målbillede og tekniske risici vurderes samlet.
    • REST, dataadgang, portaler og udrulning bliver ikke udskudt som efterfølgende opgaver.
    • De ser tidligt, hvilken vej der er økonomisk og driftsmæssigt bæredygtig.

    Del indlæg

    Del dette indlæg direkte

    LinkedIn, X, XING, Facebook, WhatsApp og e-mail er straks tilgængelige. Til Instagram forbereder vi link og kort tekst.

    E-mail

    Instagram åbner i en ny fane. Linket og kortteksten kopieres på forhånd til udklipsholderen.