Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Von Access zu MSSQL (https://www.delphipraxis.net/113069-von-access-zu-mssql.html)

Privateer3000 2. Mai 2008 07:10

Datenbank: MDB • Zugriff über: ADO

Von Access zu MSSQL
 
Hallo,
wenn ich eine Anwendung habe die
per ADO auf Accessdateien zugreift,
nun aber auf MSSQL umsteigen will,
was ist da zu ändern?
Den MSSQL-Server Express gibt es ja IMHO
frei erhältlich, so dass man ihn mit der
Anwendung verteilen kann?!
Welche Komponenten sind dafür erforderlich
und sind diese ebenfalls frei?

Grüße nachträglich an alle Väter :-)

mkinzler 2. Mai 2008 07:17

Re: Von Access zu MSSQL
 
Du musst hier grundsätzlich relativ wenig ändern. Per Ado kann man problemlos auf MSSQL zugreifen

Bernhard Geyer 2. Mai 2008 07:21

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Privateer3000
was ist da zu ändern?

Zu 90% wird die Änderung deinen SQL-Quellcode betreffen:
- Umstellen von Serverside-Curser auf CLient-Side
- Kontrolle und anpassung all deiner Access-Spezifischen Query-Statements
- Ersetzen aller TADOTable (und am besten TADOQuery) durch TADODataset

Am besten ist es alle DB-Zugriffe in eine Unit zu packen, darüber das Bridge-Pattern zu implementieren und dann mehrere DB's zu unterstützen.

Privateer3000 2. Mai 2008 07:34

Re: Von Access zu MSSQL
 
Danke Leute,
ich glaube dass ich keine Access-typischen SQLstrings verwendet habe.
Auch aggregate wie sum,max u.ä. sind ja nichts besonderes.
Die Verbindung wird ja per ADOConnection hergestellt, wird diese
auch verwendet und nur der Connectionstring angepasst?


Zitat:

Zitat von Bernhard Geyer
Zu 90% wird die Änderung deinen SQL-Quellcode betreffen:
- Umstellen von Serverside-Curser auf CLient-Side
- Kontrolle und anpassung all deiner Access-Spezifischen Query-Statements
- Ersetzen aller TADOTable (und am besten TADOQuery) durch TADODataset

Am besten ist es alle DB-Zugriffe in eine Unit zu packen, darüber das Bridge-Pattern zu implementieren und dann mehrere DB's zu unterstützen.

ADOTable hab ich garnicht verwendet sondern die Querys und Datasets.
Zitat:

Ersetzen aller TADOTable (und am besten TADOQuery) durch TADODataset
Query durch Dataset ersetzen? Wird dann der SQLstring an das Dataset gesendet?
Zitat:

Umstellen von Serverside-Curser auf CLient-Side
Das habe ich garnicht verstanden. Was ist damit genau gemeint?

Umsteigen möchte ich deswegen um die Multiconnection zu gewährleisten,
damit mehrere gleichzeitig auf die Tabellen zugreifen können!

Morphie 2. Mai 2008 07:43

Re: Von Access zu MSSQL
 
Das geht mit access doch auch

Privateer3000 2. Mai 2008 08:25

Re: Von Access zu MSSQL
 
ich habe aber immer wieder gelesen,
dass es da Probleme damit gibt.
Wenn mehr als einer auf eine Tabelle
der DB zugreift.

Morphie 2. Mai 2008 08:28

Re: Von Access zu MSSQL
 
Also wir haben es so gelöst, dass wir für jeden Benutzer eine MDB erstellt haben, die dann aber nur auf die Tabellen der "scharfen" Daten verknüpft ist. So öffnet jeder Benutzer seine eigenen Tabellen, es greifen aber alle auf die gleichen Daten zu.

Bernhard Geyer 2. Mai 2008 08:41

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Privateer3000
Query durch Dataset ersetzen? Wird dann der SQLstring an das Dataset gesendet?

Durch das CommandText-Property. TADOTable/TADOQuery sind mit ein paar Bugs behaftet die das TADODataset nicht hat und sind primär für einfachere BDE-Umstellungen gedacht.

Zitat:

Zitat von Privateer3000
Zitat:

Umstellen von Serverside-Curser auf CLient-Side
Das habe ich garnicht verstanden. Was ist damit genau gemeint?

Bei Access sollte man Serverside Curser verwenden da ja eine Desktop-Datenbank vorliegt und ein Clientside-Curser nur unnötige Speicher-Kopieraktionen bedeutet. Bei einem SQL Server sollte man primär Client-Side Curser benutzen um die Last auf dem DB-Server nicht unnötig lange aufrecht zu erhalten (Temporärtabellen, etc)

Privateer3000 2. Mai 2008 08:44

Re: Von Access zu MSSQL
 
Interessanter Ansatz,
mit Verknüpfungen hatte ich noch nichts am Hut.
Das gilt für Lese- und Schreibvorgänge?! So das
die Daten auch in die "scharfen" Tabellen geschrieben werden?
Wie verhält es sich mit den Bedingungen, nagelt man sich
damit fest, dass die Verknüpfung existieren muss oder wird
erkannt wenn diese nicht exisitert. Quasi als Standalone
verwendet wird.

Privateer3000 2. Mai 2008 08:48

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Bernhard Geyer
Zitat:

Zitat von Privateer3000
Query durch Dataset ersetzen? Wird dann der SQLstring an das Dataset gesendet?

Durch das CommandText-Property. TADOTable/TADOQuery sind mit ein paar Bugs behaftet die das TADODataset nicht hat und sind primär für einfachere BDE-Umstellungen gedacht.

Zitat:

Zitat von Privateer3000
Zitat:

Umstellen von Serverside-Curser auf CLient-Side
Das habe ich garnicht verstanden. Was ist damit genau gemeint?

Bei Access sollte man Serverside Curser verwenden da ja eine Desktop-Datenbank vorliegt und ein Clientside-Curser nur unnötige Speicher-Kopieraktionen bedeutet. Bei einem SQL Server sollte man primär Client-Side Curser benutzen um die Last auf dem DB-Server nicht unnötig lange aufrecht zu erhalten (Temporärtabellen, etc)

Du meinst damit die Eigenschaft CursorLocation?!

Morphie 2. Mai 2008 09:14

Re: Von Access zu MSSQL
 
Also es verhält sich genauso, als wenn man direkt auf die Datenbank zugreift, für Lese -und Schreibvorgänge. Wie meinst du das, ob die Verknüpfungen existieren? Anbesten du probierst das mal an nem kleinen Beispiel aus...

Peinhard 2. Mai 2008 09:30

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Bernhard Geyer
Durch das CommandText-Property. TADOTable/TADOQuery sind mit ein paar Bugs behaftet die das TADODataset nicht hat und sind primär für einfachere BDE-Umstellungen gedacht.

Ich hatte auch an anderer Stelle schon einmal nachgefragt, welche das sein sollten? Beide sind doch nur TADODatasets mit fest eingestelltem CommandType und einem 'Alias' für CommandText, der jeweils zusätzliche Code beschränkt sich auf einige wenige und nicht gerade 'anspruchsvolle' Zeilen.

Bernhard Geyer 2. Mai 2008 10:06

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Privateer3000
Du meinst damit die Eigenschaft CursorLocation?!

Ja
Zitat:

Zitat von Peinhard
Ich hatte auch an anderer Stelle schon einmal nachgefragt, welche das sein sollten? Beide sind doch nur TADODatasets mit fest eingestelltem CommandType und einem 'Alias' für CommandText, der jeweils zusätzliche Code beschränkt sich auf einige wenige und nicht gerade 'anspruchsvolle' Zeilen.

Kann schon sein das in neueren Delphi-Versionen das nicht mehr ist. "In den guten Alten" D5-Zeiten könnte das noch gewesen sein.

Peinhard 2. Mai 2008 10:39

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Bernhard Geyer
Kann schon sein das in neueren Delphi-Versionen das nicht mehr ist. "In den guten Alten" D5-Zeiten könnte das noch gewesen sein.

'Konstruktion' und Code haben sich zwischen D5 (ADODB Patch 2) und D2007 praktisch nicht geändert, nur das 'vergessene' Property CommandTimeout wurde irgendwann zwischen D5 und D7 noch hinzugefügt. Dafür aber hat TADODataset selbst nach wie vor einige Bugs und 'Versäumnisse', weshalb ich persönlich mit einem Abkömmling von TBetterADODataset arbeite, dem ich übrigens ua wg 'Migration' auch die TQuery-spezifischen Eigenschaften und Methoden nach 'Borland-Muster' hinzugefügt habe - ohne dass ich deswegen irgendwelche 'Risiken und Nebenwirkungen' festgestellt hätte. Ich möchte daher anregen, das generelle Abraten insbesondere von TADOQuery in's 'Reich der Legende' zu verbannen - das einzige, was sich mE hier zugunsten von TADODataset sagen liesse, ist, dass die Syntax näher an der nativen ADO-Nomenklatur ist. Gegen TADOTable hingegen lässt sich immerhin sagen, dass ein 'SELECT *' von wenigen sehr begrenzten Ausnahmen abgesehen einfach keine adäquate Zugriffsmethode darstellt.

Privateer3000 2. Mai 2008 15:28

Re: Von Access zu MSSQL
 
Sollte ich tatsächlich nur mit Datasets arbeiten
stellt sich die Frage, wie unter Datasets SQLstrings
gesendet werden. Da die Datasets kein ExecSql ausführen können.
Ich hab auch nichts vergleich bares gefunden, ausser Append und Post.
Und wie kann man den Commandtext umbrechen, wie bei querys mit add()?

Bernhard Geyer 2. Mai 2008 21:25

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Peinhard
Ich möchte daher anregen, das generelle Abraten insbesondere von TADOQuery in's 'Reich der Legende' zu verbannen - das einzige, was sich mE hier zugunsten von TADODataset sagen liesse, ist, dass die Syntax näher an der nativen ADO-Nomenklatur ist.

Werd ich mir merken. Evtl. wars ja eher damals so gemeind. Mittlerweile ist bei uns ADO in Form von AdoExpress/dbGo auch vorbei da unser ADO-DB-Zugriff in unserer Bridge-Pattern-Implementierung direkt auf den ADO-Interfaces aufsetzt.

Peinhard 3. Mai 2008 09:17

Re: Von Access zu MSSQL
 
Was sicher nicht die schlechteste Lösung ist. ;)

@Privateer: es spricht aus meiner Sicht und wie gesagt nichts dagegen, bei TADOQuery zu bleiben - wenn man nicht gleich direkt aufsetzen will. Ansonsten: CommandText nimmt nur 'ganze' Strings, und der adäquate Ersatz für ExecSQL wäre, TADOCommand direkt zu verwenden (selbiger werkelt unter der Haube auch im TADODataset und Nachfahren).

Privateer3000 3. Mai 2008 18:59

Re: Von Access zu MSSQL
 
Soweit denke ich ist meine Frage beantwortet
Vielen Dank an alle.

Nur eines ist mir noch nicht ganz klar,
wie das mit den User-mdb und verknüpfung
zustande kommt
Zitat:

Zitat von Morphie
Also wir haben es so gelöst, dass wir für jeden Benutzer eine MDB erstellt haben, die dann aber nur auf die Tabellen der "scharfen" Daten verknüpft ist. So öffnet jeder Benutzer seine eigenen Tabellen, es greifen aber alle auf die gleichen Daten zu.

Dabei meine ich wie das von Haus aus gemacht wird ohne das der eigentliche User
damit konfrontiert wird und MSAccess zu Hilfe nehmen muss.
Wäre schön wenn das veranschaulicht werden könnte.

Nochmals Danke an alle

Morphie 4. Mai 2008 11:55

Re: Von Access zu MSSQL
 
wenn ich mich von gestrigen abend erholt habe, kann ich dir gern' ein Beispielprojekt geben.
Haben es zwar in VB mit ADO gelöst, aber das sollte ja kein Problem sein...

ich meld mich später ;)

Privateer3000 16. Mai 2008 07:34

Re: Von Access zu MSSQL
 
Hallo Gemeinde ,
da dieses Thema immer noch für mich steht,
möchte ich mal vorsichtig nachfragen ob
nicht jemand ein Lösungsansatz für mich hat.
Wie verknüpfe ich diese Tabellen so dass jeder
User "seine" mdb hat aber diese mit einer
Haupt-mdb abgeglichen wird? So das nur
in der Haupt-mdb allgemeingültige (Statistik)
Daten sind?

Grüße

Morphie 16. Mai 2008 12:11

Re: Von Access zu MSSQL
 
ich kann dir mal ein Beispiel in VB geben:
Code:
Dim pWS As Workspace
Dim DB As Database
Dim TD As TableDef
Set pWS = Workspaces(0)
Set DB = pWS.CreateDatabase("\benutzerdatenbank.mdb", dbLangGeneral)
Set TD = DB.CreateTableDef("Tabellenname")
TD.Connect = ";DATABASE=hauptdaten.mdb;"
TD.SourceTableName = "Tabelleenname"
DB.TableDefs.Append TD
Denke, das dürfte in Delphi ähnlich funktionieren... Aber der Denkanstoß ist nun da, hoffe ich ;)

d6lpz 17. Mai 2008 06:59

Re: Von Access zu MSSQL
 
Zitat:

Zitat von Morphie
ich kann dir mal ein Beispiel in VB geben:
Code:
Dim pWS As Workspace
Dim DB As Database
Dim TD As TableDef
Set pWS = Workspaces(0)
Set DB = pWS.CreateDatabase("\benutzerdatenbank.mdb", dbLangGeneral)
Set TD = DB.CreateTableDef("Tabellenname")
TD.Connect = ";DATABASE=hauptdaten.mdb;"
TD.SourceTableName = "Tabelleenname"
DB.TableDefs.Append TD
Denke, das dürfte in Delphi ähnlich funktionieren... Aber der Denkanstoß ist nun da, hoffe ich ;)

Ich verstehe den Sinn dieser Verfahrensweise nicht...

Ich kenne nur die Trennung in Frontend und Backend (in Access) was in sofern Sinn macht, dass alle User mit eigenen Frontends(in welchen sich die Formulare, Abfragen und dergleichen befinden) arbeiten und auf eine gemeinsame Backend DB zugreifen (in welchen die eigentlichen Daten liegen).

Was dann noch erfolgen könnte, wäre eine Replizierung "lokaler" Backends (die eventuell von Aussendienstlern auf ihren Laptops verwendet werden) mit einer "MutterBackend DB" die sich im Firmennetzwerk befindet.

Generell ist die Backend DB, bei einer Einbindung in die Frontends über Verknüpfungen, nach dem Öffnen der Frontends ebenfalls "geöffnet". Da aber ab Acc2k die Sperrung auf Datensatzebene erfolgt und nicht mehr wie bis dahin über Speicherframes (welche mehre DS umfassten oder umfassen konnten), sollte das kein Problem sein.

Ich dachte der Vorteil einer Nutzung eines SQL Servers wäre der, dass man im Gegensatz zu Access aufwändigere Abfragen auf dem Server ablaufen lassen kann und dann nur das Ergebnis übermittelt bekommt (Client Prozessor Last, Netzlast, usw.).
Weiterhin hatte ich bei der Verwendung von Delphi-> ADO -> Access schon mehrmals das Problem, CrossQrys mit Parametern ausführen zu wollen was ich einfach nicht hinbekommen habe. Ich hatte nun die Hoffnung das irgendwie eleganter mit SQL Server Express zu lösen.

Nachdem ich mir diesen geladen und installiert habe, bin ich nun am LERNEN...

Ich hoffe ich komme zu Ergebnissen :gruebel:

Gruß Dirk

Privateer3000 17. Mai 2008 08:51

Re: Von Access zu MSSQL
 
Danke Leute,
sehr interessant. Ich kann mit meinen bescheidenen
Kenntnissen mir auch nur eine replizierung vorstellen.
Denn letzlich muss nach einer Änderung der lokalen
Daten auch die in der HauptDB erfolgen.
Nur wie das funktioniert, hab ich keine Ahnung.Unter php
würd ich ein Script basteln das nach erfolgreicher Änderung
in einer Tabelle (Rückgabe) die gleichen Daten an eine
andere DB sendet, validiert ob vorhanden.
Vielleicht umständlich, aber es müsste funktionieren.

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz