Mehrfachanmeldung bei Datenbank
-
ich weiß... mir macht das doch auch keinen Spaß
^^irgendwie meckert er wegen dem SQL Query - wahrscheinlich habe ich nur was falsch geschrieben oder "merkmal" falsch interpretiert.
DataModule1->Query2->SQL->Clear(); DataModule1->Query2->SQL->Add("SELECT * FROM Haltestellen"); DataModule1->Query2->Prepare(); DataModule1->Query2->Open(); AnsiString strSQLp2 = "' IN (SELECT * FROM teledb2.zHaltestellen))"; while(!DataModule1->Query2->Eof) { AnsiString strSQLmid = DataModule1->Query2->FieldByName("Name")->AsString; AnsiString SQLQry = "SELECT * FROM teledb.Haltestellen WHERE (NOT Name='" +strSQLmid+strSQLp2;teledb ist Schema 1 und teledb2 somit Schema 2. die Tables heißen fast gleich. in S2 ist ein z vorangestellt. also kann da der Fehler schonmal nicht sein *Schweißvonstirnwisch*
-
Vorab: So etwas solltest Du nicht an der echten Datenbank ausprobieren, wenn Du dir nicht absolut (150% !!!!) sicher bist, was passiert! Sonst mach dir vorsichtshalber eine Kopie der Tabellen und teste erst mal.
Also 'merkmal' ist ein eindeutiges Indentifikationsmerkmal in den Tabellen. Also ein Feld, das in beiden Tabellen vorkommt und über das jeder Datensatz eindeutig indentifiziert werden kann. Im Regelfall kann der Primärindex verwendet werden (solange es kein Auto-Inc-Feld ist).
SELECT * FROM "teledb1:Haltestellen" db1hs WHERE NOT (db1hs.Name IN ( SELECT Name FROM "teledb2:Haltestellen"))liefert dir eine Datenmenge, die alle Datensätze beinhaltet deren 'Name' sich in teledb1:Haltstellen befindet, aber nicht in teledb2:Haltestellen.
-
hmmmkay das mit dem Merkmal hatte ich gestern abend auch nochmal korrigiert... aber irgenwie schluckt die BDEngine das immernoch nicht. Erst kam ungültiges Schlüsselwort oder so ähnlich und moserte an einem nicht existierenden "?" rum. Zumindest gab die Fehlermeldung NUR das her.
Ok irgendwann kam ich I*** mal auf die Idee die hochkommatar die ich für die " eingesetzt habe (sry war ich von PHP gewohnt...), wieder gegen " auszutauschen... in einem weiteren Denkvorgang kam ich dann auch mal auf die Idee diese zu Maskieren...
SELECT * FROM \"teledb1:Haltestellen\" db1hs WHERE NOT (db1hs.Name IN (SELECT Name FROM \"teledb2:zHaltestellen\"))wobei man das äußere Klammernpaar auch weglassen kann oder?
Wie auch immer - jetzt meint die BDE (wahscheinlich) dass sich hinter db1hs(.Name) ein Dateiname verbirgt. - Was der Aussage meines SQL Validators eig. widerspricht... aber die BDEngine gibt weder eine realistische Zeilenangabe (1) noch teilt sie einem mit welchen Dateinamen sie nicht findet damit man wenigstens sehen kann was falsch interpretiert wird (jaja compiliert
)Hast du noch ne Idee woran das liegen kann? ich bin alle Schritte nach und nach durchgegangen aber es kommt erst beim prepare bzw. open des Statements zur Fehlermeldung.
-
ok, Du darfst mich schlagen... Ich habs gerade in einem alten Projekt noch mal nachgesehen. Da fehlt ein Doppelpunkt vor dem Aliasnamen... es muß heißen: ":Aliasname:Tabellenname"
Sorry (aber ich bin schon sooo alt, da wird man vergesslich...
)
-
was soll ich denn sagen mein Nachname ist Alt

EDIT: naja ich bin ziemlich froh, dass du die Ruhe und Geduld hast mir Dinge zu erklären die bei dir wahrscheinlich zu den Basics zählen

naja und nebenbei sollte ich das hier eigentlich im schlaf können aber dank unserer kompetenten Lehrkräfte haben wir während der Ausbildung nur Konsolenanwenungen geschrieben die ziemlich primitiven Kram gemacht haben... (Lohnabrechnungen die man nur während der Laufzeit sehen konnte - nix Datenbank, nix Csv
... *augenverdreh* )EDIT:
ok Fehler is weg... ein andere da ^^ ich mach gleich den hier:
http://www.urbachletter.com/0511/CubeWarsWinner_300x375.jpgund wieder die gute alte EDIT(H):
void __fastcall TSDIAppForm::ZeRPClick(TObject *Sender) { //### User ein Gefühl von Sicherheit geben SDIAppForm->Memo->Lines->Add("Verbindung mit teledb wird hergestellt..."); //### Verbindung checken und aufbauen. Dann User mit beruhigenden OKs ablenken if(!DataModule1->Haltestellen->Active){DataModule1->Haltestellen->Active = true;} SDIAppForm->Memo->Lines->Add("Haltestellen... OK"); if(!DataModule1->Verkehrsmittel->Active){DataModule1->Verkehrsmittel->Active = true;} SDIAppForm->Memo->Lines->Add("Verkehrsmittel... OK"); if(!DataModule1->Linien->Active){DataModule1->Linien->Active = true;} SDIAppForm->Memo->Lines->Add("Linien... OK"); if(!DataModule1->Linienwege->Active){DataModule1->Linienwege->Active = true;} SDIAppForm->Memo->Lines->Add("Linienwege... OK"); if(!DataModule1->Orte->Active){DataModule1->Orte->Active = true;} SDIAppForm->Memo->Lines->Add("Orte... OK"); SDIAppForm->Memo->Lines->Clear(); SDIAppForm->Memo->Lines->Add("Verbindung zu teledb steht!"); //### Verbindung zu teledb2 Tables aufbauen und übliche Usernachrichten ausgeben. SDIAppForm->Memo->Lines->Add("Verbindung mit ZeRP wird hergestellt..."); if(!DataModule1->zHaltestellen->Active){DataModule1->zHaltestellen->Active = true;} SDIAppForm->Memo->Lines->Add("Haltestellen... OK"); if(!DataModule1->zLinientypen->Active){DataModule1->zLinientypen->Active = true;} SDIAppForm->Memo->Lines->Add("Linientypen... OK"); if(!DataModule1->zLinien->Active){DataModule1->zLinien->Active = true;} SDIAppForm->Memo->Lines->Add("Linien... OK"); if(!DataModule1->zLinienwege->Active){DataModule1->zLinienwege->Active = true;} SDIAppForm->Memo->Lines->Add("Linienwege... OK"); if(!DataModule1->zOrte->Active){DataModule1->zOrte->Active = true;} SDIAppForm->Memo->Lines->Add("Orte... OK"); SDIAppForm->Memo->Lines->Clear(); SDIAppForm->Memo->Lines->Add("Verbindung zu teledb2 steht!"); //### Beide Schemata erreichbar? if(DataModule1->Haltestellen->Active == true && DataModule1->zHaltestellen->Active == true) SDIAppForm->Memo->Lines->Add("eine Meldung..."); //### so lange wir nicht alle Datensätze von Haltestellen durch haben... //while(!DataModule1->Query2->Eof) //{ //AnsiString strSQLmid = DataModule1->Query2->FieldByName("Name")->AsString; AnsiString SQLQry = "SELECT * FROM \":teledb:Haltestellen\" db1hs WHERE NOT (db1hs.Name IN (SELECT Name FROM \":teledb2:zHaltestellen\"))"; DataModule1->Query3->SQL->Clear(); DataModule1->Query3->SQL->Add(SQLQry); // DataModule2->Query3->Prepare(); DataModule1->Query3->Open(); //}
-
//### so lange wir nicht alle Datensätze von Haltestellen durch haben... //while(!DataModule1->Query2->Eof) //{ //AnsiString strSQLmid = DataModule1->Query2->FieldByName("Name")->AsString; AnsiString SQLQry = "SELECT * FROM \":teledb:Haltestellen\" db1hs WHERE NOT (db1hs.Name IN (SELECT Name FROM \":teledb2:zHaltestellen\"))"; DataModule1->Query3->SQL->Clear(); DataModule1->Query3->SQL->Add(SQLQry); // DataModule2->Query3->Prepare(); DataModule1->Query3->Open(); //}Ich verstehe nicht was Du damit erreichen willst. Und welche Fehlermeldung wird wann ausgegeben? Ich hab mir auch abgewöhnt \" zu verwenden. Ich finde es viel lesbarer QuotedStr() zu verwenden (ist aber wohl Geschmackssache).
Noch eine andere Frage: ist der durchzuführende Abgleich bidirektional?
-
achso die Schleife die da auskommentiert ist, kann eigentlich ganz raus, das is noch nen Überbleibsel

nein der Abgleich ist quasie unidirektional (wenn ich die Frage richtig verstehe). es wird nur von teledb -> teledb2 geschoben.
Wie der Name des Tables ja unschwer erraten lässt geht es um haltestellen. In teledb2 müssen alle Hst stehen die es gibt und jemals gab(d.h. dort wird nie etwas gelöscht, sie wird immer größer). In teledb stehen nur aktuelle drin, weil sie regelmäßig aktualisiert wird (einmal alles löschen und neue Daten rein).
Ich (Depp) soll nun dafür sorgen dass teledb2 auf Knopfdurck bzw. klicken auf einen schon vorhandenen Menüpunkt, mit eventuell fehlenden Haltestellen gefüttert wird.Nun dachte ich nach deinem Ratschlag, mache ich dieses Cross-Select, und schreibe die Ergebnismenge (wie im Detail lassen wir mal außen vor) in teledb2.
des weiteren dienen die Abfragen nach dem "Active" der TTables nur der Überprüfung für mich. Am Ende kommt das alles raus.
-
Oklino schrieb:
... //### User ein Gefühl von Sicherheit geben ... //### Verbindung checken und aufbauen. Dann User mit beruhigenden OKs ablenken ...Ich habe nichts zum Thema beizutragen, aber die Kommentare finde ich wunderbar

-
Fincki schrieb:
Oklino schrieb:
... //### User ein Gefühl von Sicherheit geben ... //### Verbindung checken und aufbauen. Dann User mit beruhigenden OKs ablenken ...Ich habe nichts zum Thema beizutragen, aber die Kommentare finde ich wunderbar

irgendwie muss man ja zwischendurch mal was unterhaltsames haben... zur Not lache ich dann über meine Kommentare (die ich vor der Übergabe natürlich entferne/editiere)

-
Schau dir mal TBatchMove, Mode=batAppendUpdate an. Hab ich zwar nie verwendet, könnte aber was für dich sein.
Wieso löst Du das Problem eigentlich nicht über eine Stored Procedure? Oracle ist doch ein recht mächtiges System, das entsprechende Möglichkeiten bieten sollte. Über eine Stored Procedure sollte solch ein Abgleich am schnellsten durchgeführt werden. Da kann ich Dir allerdings dann nicht helfen, ich kenne Oracle nicht. Vielleicht kann dir dazu aber in einem anderen Forum geholfen werden. Den Link möchte ich hier aber nicht posten, kannst mich aber über mein Profil anmailen.
Grüße Joe_M.
-
Hallo Joe (irgendwie kommt mir das hier wie der "Oklino und Joe"-Thread vor...),
nach stundenlangem rumärgern und Validieren und was weiß ich meckert Borland endlich mit einer anderen nutzlosen Fehlermeldung (Tabelle oder View nicht vorhanden). Nun mein Vorgsetzter denkt, dass der ODBC Treiber vielleicht nicht in der Lage ist den Cross-Select umzusetzen (er hat bei komplexeren Statements schon öfter Probleme mit ODBC gehabt).
SP hört sich in seinen Ohren auch prima an, aber wir bleiben erstmal bei C++ und ich werde auf die "langsamere" Variante (nehme einen Datensatz... schaue nach ob in db2 vorhanden...) umschwenken, weil der Client eh die ganze Nacht Zeit hat...
schade eigentlich...

Ich danke nochmal für all die Hilfe und vielleicht komme ich auf deinen Vorschlag mit der SP nochmal zurück (via Mail).
hab da noch was gefunden:
Problem:
Live result set with Oracle Driver Flags = 1 fails on
open with "ORA-00942: table or view does not
exist" if the owner name and table name are not
quoted.Steps:
With the Oracle Driver Flags set to 1 open a live
result set using unquoted, lowercase
owner.tablename against an Oracle table whose
owner name is defined as uppercase.