Entwickler-Ecke

Datenbanken - ADO Probleme beim erstellen einer Tabelle Festgefahren


Arne Danikowski - Mo 31.03.08 10:48
Titel: ADO Probleme beim erstellen einer Tabelle Festgefahren
Hallo erst mal.
Ich hänge total fest. Brauch da echt mal Unterstützung:

Ich lese über folgenden Code die Feleigenschaften einer DBase Datei aus:


Delphi-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:
37:
38:
39:
40:
41:
42:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer; s: string;
  function getAccessType(fd: TFieldDef): string;
  var ft: TFieldType;
  begin
      memo1.Visible:=True;
      FoundFiles.Visible:=false;

      ft := fd.DataType;
    case ft of
      ftAutoInc: Result := 'COUNTER';
      ftString: Result := 'TEXT(' + IntToStr(fd.Size) + ')';
      ftSmallint: Result := 'SMALLINT';
      ftInteger: Result := 'INTEGER';
      ftWord: Result := 'WORD';
      ftBoolean: Result := 'YESNO';
      ftFloat: Result := 'FLOAT';
      ftCurrency: Result := 'CURRENCY';
      ftDate, ftTime, ftDateTime: Result := 'DATETIME';
      ftBlob, ftGraphic: Result := 'LONGBINARY';
      ftMemo, ftFmtMemo: Result := 'MEMO'
    else
      Result := 'MEMO'
    end
  end;
begin

  Table1.TableName := dbfname;
  Table1.FieldDefs.Update;
  s := 'CREATE TABLE ' + Table1.TableName + ' (';
  with Table1.FieldDefs do begin
    for i := 0 to Count - 1 do begin
      s := s + ' ' + Items[i].Name; s := s + ' ' + getAccessType(Items[i]);
      s := s + ','
    end;
    s[Length(s)] := ')'
  end;
  Memo1.Clear; Memo1.Lines.Add(s);
  button2.Enabled := true;
  AccessTabelleinDatenbankerstellen1.Enabled:=true;
  StatusBar.SimpleText:='SQL Anweisung erfolgreich erzeugt'
  end;


Das funktioniert auch so weit. Ich erhalte im Momofeld folgendes Ergebnis:


SQL-Anweisung
1:
CREATE TABLE ARTIKEL ( ARTNR TEXT(25), MATCH TEXT(36), ARTBEZ1 TEXT(50), ARTBEZ2 TEXT(50), KURZ TEXT(3), ERSATZ TEXT(16), EINHEIT TEXT(10), WGR TEXT(10), HERSTELLER TEXT(25), LIEFERANT TEXT(20), SYMBOLNR TEXT(3), SYMBOLDAT TEXT(2), MAKRO TEXT(16), BESTAND FLOAT, MBESTAND FLOAT, X FLOAT, Y FLOAT, Z FLOAT, ZEIT FLOAT, LOHNK FLOAT, MWST FLOAT, EK FLOAT, VK FLOAT, KNG TEXT(3), LAGERORT TEXT(10), LAND1 TEXT(50), LAND2 TEXT(50), LAND3 TEXT(50), LAND4 TEXT(50), LAND5 TEXT(50), ARTBEZ3 TEXT(50), MATKEY TEXT(30), MKZ TEXT(1), GEWICHT FLOAT, WAEHRUNG TEXT(3), ZUSARTNR TEXT(5), TEILEART TEXT(1), PRODUKTGR TEXT(3), BEMERKUNG TEXT(20), STATUS TEXT(1), STATNR TEXT(11), ERFASSER TEXT(20), ERFDAT DATETIME, AENDERNAME TEXT(20), AENDERDAT DATETIME, DOKVERW TEXT(80), BESTANDKZ TEXT(3), GEWICHTKZ TEXT(1), ENTSPRICHT TEXT(16), BAUFORM TEXT(20), TECHDAT TEXT(20), TDAT MEMO)                    


Über einen zweiten Button versuche ich eine Tabelle in einer Accessdatenbank anzulegen. Hier der Code des 2.Buttons:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button2Click(Sender: TObject);
begin
  try
    ADOCommand1.CommandText := 'DROP TABLE ' + combobox1.text;
    ADOCommand1.Execute
  except
  end;
  ADOCommand1.CommandText := Memo1.Text;
  ADOCommand1.Execute;
  button3.Enabled := true;
  DatenKopieren1.Enabled:=true;
  StatusBar.SimpleText:='Tabelle wurde erstellt';
  end;


Nun erhalte ich zwei Fehlermeldungen:
1. Tabelle nicht forhanden
2. Syntextfehler in Felddefinition

Wenn ich den ausgelesenen Code in Access als SQL Anweisung eingebe, funktioniert aber alles.

Wo liegt mein Fehler? Kann da jemand weiterhelfen?

Moderiert von user profile iconKlabautermann: SQL-Tag hinzugefügt.


alzaimar - Mo 31.03.08 12:03

Semikolon am Ende vielleicht? :nixweiss:


iKilledKenny - Mo 31.03.08 12:32

Die erste Meldung kommt wohl daher, dass beim DROP TABLE die Tabelle nicht vorhanden ist. Das gibt einen Fehler, ist aber erst einmal nicht weiter schlimm.

Versuch mal im CREATE TABLE statement die FLOATs durch DOUBLE zu ersetzen.


Arne Danikowski - Mo 31.03.08 13:37

Hallo, danke für die schnellen Antworten.

zu alzaimar

ich wüsste nicht, wo da ein Simikolon hin sollte


zu iKilledKenny

Stimmt es kann vorkommen, das die Tabelle nicht vorhanden ist, daher dachte ich versuch ich es mit einem Try. Komisch ist nur, das es manchmal funktioniert und manchmal nicht. Ist aber echt nicht so wichtig, damit kann ich mich beschäftigen, wenn es soweit ist

ich habe die

Delphi-Quelltext
1:
ftFloat: Result := 'FLOAT';                    


in

Delphi-Quelltext
1:
ftFloat: Result := 'DOUBLE';                    


geändert.

Der Fehler bleibt. Mir ist allerdings aufgefallen, wenn ich die SQL Anweisung im Momofeld auf einen Eintrag beschränke also sum Beispiel


SQL-Anweisung
1:
CREATE TABLE ARTIKEL ( ARTNR TEXT(25))                    


funktioniert es.

Noch ne Idee? Oder braucht jemand mehr Code?


iKilledKenny - Mo 31.03.08 13:59

Dann nimm der Reihe nach ein Feld nach dem anderen mit dazu, irgendwann kriegst du den Fehler und du weisst, woran es lag... :idea:


Arne Danikowski - Mo 31.03.08 14:05

Da wird doch der Hund in der Pfanne verrückt.

Es liegt ab der Felddefinition


SQL-Anweisung
1:
CREATE TABLE ARTIKEL ( MATCH TEXT(25))                    


Alle anderen Felder funktionieren, nun kapier ich aber nicht warum, die Feldbezeichnung ist nunmal MATCH. Das muss auch so bleiben.
Der Feldtyp stimmt auch. In der Dbase Datei als <C> gekennzeichnet, also Text.

Was nun ?


iKilledKenny - Mo 31.03.08 14:08

Versuch mal, das MATCH in Anführungszeichen zu setzen, das kannst du auch gefahrlos mit allen anderen Feldern machen.

Wenn das nicht geht, musst du wohl oder übel das Feld umbennen...


alzaimar - Mo 31.03.08 14:09

'MATCH' ist wohl ein reserviertes Wort, klammere es in '[' und ']' oder '"', je nachdem, was Access so kann.

Ach, und das Semikolon könnte ans Ende, einige DBs sind da zigig.


Arne Danikowski - Mo 31.03.08 14:27

Hab alles ausprobiert, geht nicht wenn ich Access öffne und über Abfragen die SQL Anweisung in die SQL Abfrage kopiere und ausführe, dann funktioniert das tadellos.
Bin total am Ende meiner Weisheit, und die ist eh schon nicht besonders groß! :)


iKilledKenny - Mo 31.03.08 14:41

user profile iconArne Danikowski hat folgendes geschrieben:
Hab alles ausprobiert, geht nicht wenn ich Access öffne und über Abfragen die SQL Anweisung in die SQL Abfrage kopiere und ausführe, dann funktioniert das tadellos.
Bin total am Ende meiner Weisheit, und die ist eh schon nicht besonders groß! :)


Was hast du alles ausprobiert? Nur die Anführungszeichen, oder auch die eckigen Klammern, oder auch die Kombination von beidem? Anführungszeichen gibts einzeln und doppelt...

Probier bitte alle Kombinationen aus um sicher zu gehen, ansonsten: Feld umbenennen... :?


Arne Danikowski - Mo 31.03.08 15:43

Alle Kombinationen ausprobiert [] [''] '' "" [""] etc.

Das Feld kann ich nicht umbenennen, da die Datenbank ja nur ins Access Format konvertiert wird, die Anwendung greift ja auf das Feld zu.
Die Tabellen sind alle miteinander verknüft über mehrere Anwendungen :(


iKilledKenny - Mo 31.03.08 20:52

Habs probiert, funktioniert prima bei mir... :nixweiss:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);

var   cmd : TAdoCommand;
begin
  ADOConnection1.Connected := True;
  cmd := TAdoCommand.Create (nil);
  cmd.Connection := ADOConnection1;

  cmd.CommandText := 'create table test ([MATCH] text(25))';
  cmd.CommandType := cmdText;
  cmd.Execute; 
end;


Die Connection liegt auf einer Form und ist mit einer Access 2003 DB verknüpft. Ich nutze Delphi 5 Enterprise.