Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Kommando und ADO (https://www.delphipraxis.net/90592-sql-kommando-und-ado.html)

WS1976 20. Apr 2007 06:34

Datenbank: ACCESS 2003 • Zugriff über: ADO

SQL Kommando und ADO
 
Hallo,
ich habe ein ganz simples Problem. Vielleicht ganz easy aber ich kanns nicht lösen:

Ich möchte mit Hilfe der ADO Komponenten ein SQL Kommando absetzen. Die einfachen Dinge wie sellect
insert usw funktionieren.
Sobald ich etwas benutzen will copy, create oder sonst etwas bekomme ich die fhlermeldung, dass das nicht geht.
Hintergrund:
Ich will eine vorhandene Tabelle, ohne Inhalte, kopieren.

Danke im Vorraus

mkinzler 20. Apr 2007 06:40

Re: SQL Kommando und ADO
 
Wie meinst du "Kopieren" eine Tabelle?

alzaimar 20. Apr 2007 06:41

Re: SQL Kommando und ADO
 
Zitat:

Zitat von WS1976
Sobald ich etwas benutzen will copy, create oder sonst etwas bekomme ich die fhlermeldung, dass das nicht geht.

Also DAS sagt Dir ADO bestimmt nicht. Wie lautet denn die Fehlermeldung?

WS1976 20. Apr 2007 08:59

Re: SQL Kommando und ADO
 
Hallo
Fehlermeldug:
Im Projekt sowieso ist eine Exception der Klasse OLEException aufgetreten.
Meldung: Unzulässige SQL Anweisung 'DELETE, INSERT, SELECT oder UPDATE' erwrtet.
Ich habe versucht ein copy SQL-command, (ich wollte eine Tabelle kopieren)
zu benutzen.

Kann ich mit ADO überhaupt SQL Befehle verwenden die nicht gerade 'DELETE, INSERT, SELECT oder UPDATE' sind.
Steh ich auf der Leitung?

Danke

alzaimar 20. Apr 2007 09:20

Re: SQL Kommando und ADO
 
'COPY' ist kein SQL-Kommando.

WS1976 20. Apr 2007 10:27

Re: SQL Kommando und ADO
 
Oooooh,

das ist mir doch völlig egal ob das jetzt copy oder sonstetwas ist, ich will wissen wie man ein anderes SQL Kommando (ausser den vieren die ich oben genannt habe) benutzen kann.


Danke

Bernhard Geyer 20. Apr 2007 10:29

Re: SQL Kommando und ADO
 
Zitat:

Zitat von WS1976
das ist mir doch völlig egal ob das jetzt copy oder sonstetwas ist, ich will wissen wie man ein anderes SQL Kommando (ausser den vieren die ich oben genannt habe) benutzen kann.

Genauso wie die vier oberen. Jedoch muß es halt dieses "sonstetwas" im SQL-Sprachschatz der Zieldatenbank geben.

Udontknow 20. Apr 2007 10:34

Re: SQL Kommando und ADO
 
Hallo!

Definiere doch mal genau, was du machen willst. Willst du Daten von einer Tabelle in eine andere kopieren? Willst du eine Tabelle kopieren, also anlegen und Daten einfügen?

Cu,
Udontknow

alzaimar 20. Apr 2007 10:38

Re: SQL Kommando und ADO
 
Zitat:

Zitat von WS1976
Oooooh,
das ist mir doch völlig egal ob das jetzt copy oder sonstetwas ist, ich will ...

Klingt für mich ein wenig nach "Unbeherrscht". Arbeite mal an deinem Tonfall.

Berhard hat meinen minimalistischen Beitrag schon richtig interpretiert.

Um eine nicht existierende Tabelle zu kopieren, musst Du sie erstmal erzeugen ('CREATE TABLE'). Dazu musst Du Dir die Struktur der Tabelle aus der Quell-DB rauslesen. Hierzu eignet sich ein TADODataset und ein 'Select * from Tabelle where 1=0'. Damit bekommst Du alle Felder samt Feldtyp. Daraus bastelst Du dir das 'CREATE TABLE' Skript und führst es aus.

Anschließend kopierst Du einfach Record für Record in das Zielsystem.

[edit]Ob ADO DDL-Kommandos zulässt, weiß ich nicht, aber ich kann mir vorstellen, das die Execute-Methode der ADOConnection keine Zicken macht (bei mir geht's jedenfalls)[/edit]

Udontknow 20. Apr 2007 10:43

Re: SQL Kommando und ADO
 
ADO selber wird da nicht meckern, es leitet den Commandtext ja einfach nur durch zum SQL-Server. Dieser muss dann natürlich mit den DDL-Kommandos was anfangen können.

Cu,
Udontknow

WS1976 20. Apr 2007 10:45

Re: SQL Kommando und ADO
 
Hallo,

alzaimar: zu deinen Bemerkungen gebe ich hier keinen Kommentar.

ich hatte ganz klar beschrieben was ich machen wollte, nämlich eine Tabelle kopieren, sonst nichts.
Lösung: select * into Tabelle2 from Tabelle1

Wenn mir noch jemand sagt wie man das ohne Inhalte macht bin ich zufrieden.

Danke

Bernhard Geyer 20. Apr 2007 10:51

Re: SQL Kommando und ADO
 
Zitat:

Zitat von WS1976
alzaimar: zu deinen Bemerkungen gebe ich hier keinen Kommentar.

Zitat:

Zitat von WS1976
ich hatte ganz klar beschrieben was ich machen wollte, nämlich eine Tabelle kopieren, sonst nichts.
Lösung: select * into Tabelle2 from Tabelle1

Hast du nicht. Nicht nur alzaimer war nicht klar was du genau meinst. Deshalb auch die nachfragen.

Zitat:

Zitat von WS1976
Wenn mir noch jemand sagt wie man das ohne Inhalte macht bin ich zufrieden.

Und schon wieder hat alzaimar einen Lösungsweg beschrieben. Es könnte natürlich sein das hier wieder Access eigene Wege gehen kann/will umd sowas einfacher zu lösen wovon alzaimer nichts weiß. Jedoch ist die vorgeschlagene Lösung eine allgemeine.

alzaimar 20. Apr 2007 10:53

Re: SQL Kommando und ADO
 
Zitat:

Zitat von WS1976
Hallo,
alzaimar: zu deinen Bemerkungen gebe ich hier keinen Kommentar.

Gut so.
Zitat:

Zitat von WS1976
ich hatte ganz klar beschrieben was ich machen wollte, nämlich eine Tabelle kopieren, sonst nichts.

Dein Niveau, dein Niveau. Tss, Tss, Tss. :roll:

Du hast übrigens *nicht* ganz klar beschrieben, was Du machen wollstest: Du hast von 'COPY' Befehlen gefalselt, aber nicht, WOHIN eine Tabelle kopiert werden soll. Du bist auch nicht auf die Fragen der anderen Teilnehmer eingegangen.

mkinzler 20. Apr 2007 10:54

Re: SQL Kommando und ADO
 
Ich hatte in #1 schon gefragt wie du das meinst, diese Frage hast du deinerseits ja nie beantwortet.
Du willst also eine neue Tabelle mit der selben Struktur einer anderen anlegen

Udontknow 20. Apr 2007 10:56

Re: SQL Kommando und ADO
 
Zitat:

Zitat von WS1976
Hallo,

alzaimar: zu deinen Bemerkungen gebe ich hier keinen Kommentar.

ich hatte ganz klar beschrieben was ich machen wollte, nämlich eine Tabelle kopieren, sonst nichts.
Lösung: select * into Tabelle2 from Tabelle1

Wenn mir noch jemand sagt wie man das ohne Inhalte macht bin ich zufrieden.

Danke

Entspanne dich. :)

Das war leider nicht so klar, wie du meinst. Eine Tabelle hast du hier nämlich nicht kopiert, sondern Daten von Tab A nach Tab B geschoben. Ein Kopieren impliziert die Neuanlage der Tabelle(nstruktur), und da hat alzaimar dann recht, da müsste man dann erst ein Kommando zum Erstellen aufbauen.

Hier ein bisserl Code für den Aufbau (evtl. DB2-spezifisch und durchaus noch zu verbessern):

Delphi-Quellcode:
procedure GenerateDDLOfDataset(Dataset: TDataset; DDL: TStrings; Options: TGenerateOptions);
var i: integer;
var Str: string;
var Field: TField;
begin
  //Create-Befehl
  DDL.Clear;

  DDL.Add('CREATE TABLE "SCHEMA"."TABELLE"');
  DDL.Add('(');

  //Alle Felder auflisten
  for i := 0 to Dataset.Fields.Count - 1 do
  begin
    //Feldnamen
    Field := Dataset.Fields[i];

    //nicht sichtbare Felder ignorieren?
    if not Field.Visible and (goIgnoreUnvisibleFields in Options) then
      Continue;

    Str := '"' + Uppercase(Field.FieldName) + '"';

    //Feldtyp
    if Field is TIntegerField then
      Str := Str + ' integer'
    else
      if Field is TFloatField then
        Str := Str + ' double'
      else
        if Field is TStringField then
          Str := Str + ' varchar(' + IntToStr(TStringfield(Field).Size) + ')'
        else
          if Field is TDateField then
            Str := Str + ' date'
          else
            if Field is TTimeField then
              Str := Str + ' time'
            else
              if Field is TDateTimeField then
                Str := Str + ' timestamp'
              else
                if Field is TSQLTimeStampField then
                  Str := Str + ' timestamp'
                else
                  if Field is TMemoField then
                    Str := Str + ' clob(???) logged'
                  else
                    if Field is TBlobField then
                      Str := Str + ' blob(???) logged'
                    else

                      raise Exception.CreateFmt('Feldtyp für Klasse %s unbekannt.', [Field.ClassName]);

    //nicht null?
    if Field.Required then
      Str := Str + ' not null';

    //Letztes Feld? Kein Komma
    if i < Dataset.Fields.Count - 1 then
      Str := Str + ',';

    DDL.Add(Str);
  end;
  DDL.Add(')');
  DDL.Add('IN "USERSPACE1";');
end;
Cu,
Udontknow

WS1976 20. Apr 2007 11:21

Re: SQL Kommando und ADO
 
Hallo,

es funktioniert genauso wie ich oben beschrieben hatte.
select * into Tabelle2 from Tabelle

die Tabelle wird angelegt und der Inhalt mitkopiert.

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 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