Autor Beitrag
m-werk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Di 01.10.02 10:16 
Welche Felder?

Was meinst du damit?

_________________
Grüße, m-werk
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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:
ausblenden volle Höhe Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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. :think: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: Mi 02.10.02 09:22 
m-werk hat folgendes geschrieben:
Hab ich das so richtig verstanden?

Ja hast du :D

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
m-werk Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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