| Autor |
Beitrag |
m-werk
      
Beiträge: 51
|
Verfasst: Mo 30.09.02 16:56
Hi Leute, ich habe folgendes Problem:
Ich möchte meine Access-DB aktualisieren (Neue Tabellenfelder hinzufügen). Ich habe dafür auch schon einen Code geschrieben.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TKundendaten.Button3Click(Sender: TObject); const FeldName : array[1..5] of String = ('Rueckzahlung', 'Kreditwaehrung', 'Zinssatz1', 'Zinssatzgebunden', 'Aufschlag'); InsertStr : array[1..5] of String = ('ALTER TABLE Finanzierung ADD Rueckzahlung CHAR(30)', 'ALTER TABLE Finanzierung ADD Kreditwaehrung CHAR(10)', 'ALTER TABLE Finanzierung ADD Zinssatz1 CHAR(10)', 'ALTER TABLE Finanzierung ADD Zinssatzgebunden CHAR(10)', 'ALTER TABLE Finanzierung ADD Aufschlag FLOAT'); var i : Integer; begin for i := 1 to 5 do begin if DM.ADOSFinanzierung.FindField(FeldName[i])=NIL then begin DM.QueryFinanzierung.Close; DM.QueryFinanzierung.SQL.Clear; DM.QueryFinanzierung.SQL.Add(InsertStr[i]); DM.QueryFinanzierung.ExecSQL end; end; end; |
Wenn die Felder in der Datenbank nicht existieren, dann werden sie mit dem klick hinzugefügt. Das klapt zur Zeit prima. Aber wenn ich nochmals den Button anklicke, dann kommt wieder die Fehlermeldung:
Feld 'Rueckzahlung' ist bereits in der Tabelle 'Finanzierung' vorhanden.
Weiters wollte ich dann im Formular ein Edit einbauen, dass auf die neuen Datenfelder zugreifen soll. Das hat nicht funktioniert. Ich habe die DataSource zugeordnet, dann wollte ich das Feld zuordnen aber es scheint kein neues Feld auf.
Ich kann diese nicht zuordnen, obwohl diese in der Datenbank schon existieren.
Kann mir bei diesem Problem jemand helfen?
_________________ Grüße, m-werk
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Di 01.10.02 08:28
Hi
ich weiss nicht ob ich richtig liege und ob meine Erklärung korrekt ist, aber dieses Verhalten lässt sich auch mit anderen Datenbanken nachvollziehen. Ich bin selber auch schon drüber gestolpert.
Die Informationen über die neuen Felder scheinen zuerst mal in einer Art Cache zu liegen. Für deine Anwendung, die über diesen Schema-Cache zugreift, sind diese Felder vorhanden. Deshalb auch die Fehlermeldung beim zweiten Versuch sie anzulegen.
Innerhalb der Tabelle sind sie aber physikalisch noch nicht vorhanden, deshalb kannst du nicht darauf zugreifen.
Versuch doch einfach mal die Datenbank nach dem aktualisieren der Struktur zu schliessen und dann wieder neu zu öffnen. Damit hab ich zumindest bei Interbase das Problem gelöst.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
m-werk 
      
Beiträge: 51
|
Verfasst: Di 01.10.02 09:08
Hi, das hab ich auch schon versucht.
Das witzige dabei ist, dass die Felder in der DB existieren. Ich habe dann die Access DB angesehen und da scheinen diese schon auf.
_________________ Grüße, m-werk
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Di 01.10.02 09:45
Hi
verwendest du vielleicht persistente Felder? Dann wärs klar. Die werden nicht automatisch angepasst.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
m-werk 
      
Beiträge: 51
|
Verfasst: Di 01.10.02 10:16
Welche Felder?
Was meinst du damit?
_________________ Grüße, m-werk
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Di 01.10.02 10:58
Hast du bei deiner Query mit der rechten Maustaste den Feldeditor aufgerufen und die Felder eingefügt?
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
m-werk 
      
Beiträge: 51
|
Verfasst: Di 01.10.02 11:04
Nein, hab ich nicht. Ich hab nur den Code oben eingegeben und ausgeführt. Sonst hab ich nichts gemacht.
_________________ Grüße, m-werk
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Di 01.10.02 11:06
Tja, dann muss ich leider passen  Da hab ich auch keine Idee mehr.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
m-werk 
      
Beiträge: 51
|
Verfasst: Di 01.10.02 18:56
Hi, ich glaub jetzt hab ich die Ursache für den Fehler gefunden.
Bei mir ist es so, dass ich bei der ConnectionString im Objektinspektor nichts drinn stehen habe. Das heist, ich kann, wenn ich im Programmiermodus bin, nichts neues erstellen.
Ich rufe erst die Connectionstring beim start des Programmes auf. Ich habe das deshalb gemacht, da ich den Path von der Datenbank in die Registry schreibe und von dortaus auch ablese. (Das hat so seine Gründe).
Und ein Passwort habe ich ja auch in der Connectionstring.
So sieht der Code aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure TDM.DataModuleCreate(Sender: TObject); var REG:TRegistry; a:string; begin REG:=Tregistry.create; try REG.RootKey := HKEY_CURRENT_USER; REG.Access := KEY_READ; if REG.OpenKeyReadOnly('Software\AriusDB\SettingsDB') then begin try a:=REG.ReadString('DBPath'); if not DirectoryExists(a) then begin MessageBox(0,PChar(SysErrorMessage(GetLastError)+#13#13+'Datenbank wurde nicht gefunden! Wert: '+IntToStr(GetLastError)),'Fehler!',MB_ICONERROR or MB_OK); end; except MessageBox(0,PChar(SysErrorMessage(GetLastError)+#13#13+'Datenbank wurde nicht gefunden! Wert: '+IntToStr(GetLastError)),'Fehler!',MB_ICONERROR or MB_OK); end; end else begin MessageBox(0,PChar(SysErrorMessage(GetLastError)+#13#13+'Datenbank wurde nicht gefunden! Wert: '+IntToStr(GetLastError)),'Fehler!',MB_ICONERROR or MB_OK); end; finally FreeAndNil(REG); end; ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=' + a + '\Kundendaten.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password=passwort;'+ 'Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;' + 'Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False'; ADOConnection1.Connected := TRUE; DM.ADOSHaupt.Open; DM.ADOSKinder.Open; DM.ADOSGeschaeft.Open; DM.ADOSFinanzierung.Open; DM.ADOSHaushalt.Open; DM.ADOSAnlageprofiel.Open; DM.ADOSEmpfehlung.Open; DM.ADODataSet1.Open; DM.ADODataSet2.Open; end; |
Kann ich das auch anders machen, so dass ich im Programmiermodus auch aktuell bin?
_________________ Grüße, m-werk
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 02.10.02 08:16
Hi
was hindert dich den daran, diesen Connection-String im OI einzugeben damit du zur Entwurfszeit eine aktuelle Datenbankanbindung hast.  Beim Starten des Programms wird ja auf jeden Fall die Verbindung aus der Reg gelesen.
Oder steht die Datenbank während der Entwicklung nicht zur Verfügung?
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
m-werk 
      
Beiträge: 51
|
Verfasst: Mi 02.10.02 09:18
Hi, hab ich das so richtig verstanden:
Ich kann im OI ganz normal den Connectionstring eingeben auf die Datenbank, auf die ich zugreifen möchte.
Den Code, den ich oben habe, kann ich auch so lassen.
Dann wenn das Programm gestartet wird, wird die Datenbank hergenommen, auf die der Pfad in der Registry verweist, obwohl in der Connectionstring im OI ein anderer Pfad steht.
Hab ich das so richtig verstanden?
Wenn ja, dann komm ich jetzt klar.
_________________ Grüße, m-werk
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 02.10.02 09:22
| m-werk hat folgendes geschrieben: | Hab ich das so richtig verstanden?
|
Ja hast du
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
m-werk 
      
Beiträge: 51
|
Verfasst: Mi 02.10.02 09:40
Danke sehr, du hast mir sehr geholfen.
Für diese Antwort, (hab auch schon in anderen Foren gefragt) habe ich jetzt 2 Wochen gebraucht.
Jetzt kann ich alles so machen, wie ich es zuerst wollte.
_________________ Grüße, m-werk
|
|
|