AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Insert über 2 Datenbanken
Thema durchsuchen
Ansicht
Themen-Optionen

Insert über 2 Datenbanken

Ein Thema von Janek76 · begonnen am 9. Nov 2005 · letzter Beitrag vom 10. Nov 2005
Antwort Antwort
Janek76
(Gast)

n/a Beiträge
 
#1

Insert über 2 Datenbanken

  Alt 9. Nov 2005, 17:48
Datenbank: sql-server access • Zugriff über: ado
Hallo,

eine kurze Frage habe ich: Ich muß Daten vom SQL-Server mit Delphi nach Access einlesen. Wie geht das am einfachsten mit ADO? Ich meine, das Problem ist ja, daß jede Komponente, z.B. TADODataSet nur eine TADOConnection haben kann und jede TADOConnection nur entweder nach Access oder zum SQL-Server geht. Ich dachte ich könnte das so machen:

AccessConection.ADODataSet.Recordset := SQLServerConnection.AdoCommand.Execute;

ja und dann muß ich irgendwie einen Insert-Befehl-Absetzen, mit einem Select über die Datenmenge im Recordset. Ich habe aber keine Ahnung wie das geht.

Könnte mir jemand vielleicht kurz und schnell die Vorgehensweise posten?

Ist das überhaupt der richtige Weg? Oder macht man das anders? Es sollten nach Möglichkeit schon parametrisierte SQL-Statements sein.

Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte.

Vielen Dank!

Janek76
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Insert über 2 Datenbanken

  Alt 9. Nov 2005, 18:44
Herzlich willkommen in der Delphi-PRAXiS, Janek76.

Du kannst die Daten mit einem Delphi-Programm übernehmen, aber ich würde sie vom MSSQL Server in einer Access-Datenbank übergeben lassen. Mit DTS Packages geht das recht einfach. Du kannst diese Packages im Enterprise Manager entwerfen und schrittweise (ab 2000) austesten.

Grüße vom marabu
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#3

Re: Insert über 2 Datenbanken

  Alt 9. Nov 2005, 18:53
hallo marabu,

danke für die antwort. ich weiß nicht, ob ich dich richtig verstanden habe. es geht nicht um einen einmaligen importvorgang, sondern um eine anwendung, die per knopfdruck daten von ms sql nach access schaufelt. nun könnte ich einfach sagen:
Delphi-Quellcode:
while not mssqldataset.eof do begin
  accessdataset.fieldvalues['hier'] := mssqldataset.fieldbyname('dort').asinteger;
  mssqldataset.next;
end;
nur das dauert ewig lange. ich würde das gerne mit sql machen. in etwa so:
Delphi-Quellcode:
insert into table1 [access] fields
select fields from table2 [ms sql]
gibt es sowas?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Insert über 2 Datenbanken

  Alt 9. Nov 2005, 20:32
Ich erinnere mich dunkel, dass du in Access Tabellen vom SQL Server einbinden kannst. Die Übernahme von Daten im pull mode durch das von dir schon angedachte INSERT INTO ... SELECT ... sollte dann möglich sein.

Für den pull mode auf dem Server gibt es auch etwas - ab SQL Server 2000 (SP3) - nennt sich OPENDATASOURCE und ist eine function, die heterogene queries ermöglicht. Prinzipiell wird der Tabellenname mit dem Namen der Datenbank und einer Verbindung qualifiziert. Dazu solltest du die SQL Server Online Books zum Thema FROM-Klausel konsultieren.

marabu
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#5

Re: Insert über 2 Datenbanken

  Alt 10. Nov 2005, 00:16
Jo. Danke für den Hinweis. Ich hab mal ein bißchen gegoogelt. Allerdings habe ich dabei noch ein Problem. Ich habe mal 2 ACCESS-Dateien genommen und folgendes ausprobiert:

Im ADOCommand der einen Access-Datei:

SQL-Code:
INSERT INTO OPENDATASOURCE( 'Microsoft.Jet.OLEDB.4.0','Data Source="C:\Target.mdb"; User ID=Admin;Password=' ) Table2(Name,Adresse)
SELECT Name,Adresse FROM Table1
Oder alternativ

SELECT * FROM OPENDATASOURCE(ConnectionString) Table2 Geht auch nicht.


Ich habe auch mal den OriginalConnectionString der ADOConnection genommen und ein bißchen rumprobiert. Aber ich erhalte immer dieselbe Fehlermeldung: "Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollstädinge Informationen wurden angegeben."

Kann Access das nicht? Geht das nur vom MS SQL aus? Oder ist da noch irgendwas falsch?

[edit=Luckie]SQL-Tags gesetzt. Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Insert über 2 Datenbanken

  Alt 10. Nov 2005, 09:56
Die Syntax ist wirklich nur für den SQL Server. Du musst dich entscheiden, welche SQL Engine du aus Delphi ansteuern willst, Jet SQL (Access) oder T-SQL (SQL Server). In Jet SQL gibt es andere Ansätze - die IN-Klausel zur Referenzierung von Tabellen in externen nicht serverbasierten Datenbanken, oder die verknüpften Tabellen bei ODBC-Verbindungen zu SQL Servern.

In der Online Hilfe zu Access 2002 habe ich das Kapitel "Informationen zum Importieren und Verknüpfen von Daten und Datenbankobjekten" gefunden, dass für dich vielleicht interessant sein könnte, falls du auf Jet SQL setzen möchtest. Ich würde es nicht wollen.

marabu
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#7

Re: Insert über 2 Datenbanken

  Alt 10. Nov 2005, 14:26
Ok. Danke für die Antwort. Also OPENDATASOURCE scheint eine tolle Sache zu sein ein Problem könnte es noch geben:

Die Einstellung:

DisallowAdhocAccess

Ich weiß nicht, wie oft das zum Problem werden kann. Jedenfalls muß sichergestellt sein, daß das Programm möglichst immer läuft.
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#8

Re: Insert über 2 Datenbanken

  Alt 10. Nov 2005, 18:34
OK. Hab mich jetzt doch entschieden, es umzusetzen, in der Hoffnung, daß die Sicherheitseinstellungen keine Probleme bereiten werden. Die Performance ist jedenfalls geil. 30000 Datensätze werden so mal eben im Bruchteil einer Sekunde rübergeschaufelt, ohne daß man was merkt, während bei den Delphi-Zuweisungen alles aufwendig durchgerödelt wird.

SQL-Code:
DECLARE @qIDStart INT, @qIDEnd INT
SET @qIDStart=13
SET @qIDEnd=333

INSERT INTO
OPENDATASOURCE( 'Microsoft.Jet.OLEDB.4.0','Data Source="C:\Target.mdb"; User ID=Admin;Password=' )...
TargetTable(Field1,Field2,Field3)

SELECT Field1, Field2, Field3 FROM Table1
WHERE ((Field1 >= @qIDStart) AND (Field1 <= @qIDEnd))
Ich habe zwar keine Ahnung, wofür die 3 Punkte hinter OPENDATASOURCE stehen (für meinen lokalen Rechner?), aber sie müssen genauso hingeschrieben werden.

Probleme haben mir die Parameter bereitet, da in Delphi im CommandText einer ADO-SQL-Abfrage Parameter mit Doppelpunkt angegeben werden (arameter). So verwunderte es nicht, daß der erste Parameter den Namen '\Target.mdb"; User ID=Admin;Password=' hatte, was natürlich zu keiner gültigen Abfrage führen konnte. Da ich auch keine Ahnung hatte, wie man den Doppelpunkt in der Pfadangabe neutralisieren kann, habe ich auf Delphiparameter ganz verzichtet und sie mit ParamCheck einfach abgeschaltet.

Delphi-Quellcode:
ADOCommand1.ParamCheck := false;
ADOCommand1.CommandText := QryString;
ADOCommand1.Execute;
Dafür habe ich dann, wie oben, Variablen deklariert und mir einen CommandText aus meinen Delphivariablen zusammengebastelt.

@marabu: Also Vielen Dank nochmal für den Hinweis, ich glaube ich wäre da so schnell nicht drauf gekommen. (...bin immerhin auch noch Anfänger).

Gruß,

Janek76
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Insert über 2 Datenbanken

  Alt 10. Nov 2005, 18:58
Hallo Janek,

die drei Punkte bleiben übrig, wenn du die qualifizierenden Namensbestandteile der Tabelle auslässt, weil sie bei einer Access-Datenbank nicht gebraucht werden:

Code:
DataSource.Database.Owner.Table
Den Doppelpunkt im ConnectionString kannst du vielleicht dadurch entschärfen, dass du den ConnectionString selbst als Parameter formulierst.

Aber vor allem meinen Glückwunsch - ganz der Anfänger bist du dann doch nicht, so wie du das hinbekommen hast, ohne große Hilfe.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
Janek76
(Gast)

n/a Beiträge
 
#10

Re: Insert über 2 Datenbanken

  Alt 10. Nov 2005, 20:01
ist natürlich eine intelligente idee, den pfad in einen parameter zu packen. darauf bin ich gar nicht gekommen. ich dachte spontan immer nur ans abschalten, wegmachen, neutralisieren und löschen, aber daß man sich mit dem "übel" auch verbünden kann... der pfad bei mir steht sowieso in einer delphivariablen. müßte ja eigentlich funktionieren, wenn man sagt datasource=:qParam. naja, ich weiß nicht, wie variablen und sql zusammengesetzt und ausgewertet werden. aber so scheint es ja auch erstmal zu gehen.

von qualifizierenden namensbestandteilen habe ich noch nie was gehört. zumindest nicht so ausdrücklich in diesem zusammenhang. ich meine das steht ja eh schon da ('DataSource'+'Database'+'Owner'+Table). zumindest mußte ich noch nie 3 punkte in einem sql-statement setzen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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