Avatar billede hugopedersen Nybegynder
22. november 2009 - 20:04 Der er 18 kommentarer og
1 løsning

Check om tabel eksisterer for oprettelse - SQL

Findes der en funktion i Access SQL der ligner 'CREATE TABLE IF NOT EXISTS'?

Det er et 100% must at det er ren SQL statements da det skal bruges fra et Delphi program til at checke om en tabel eksisterer før jeg prøver at oprette den.

Jeg er ved at lave en opdateringsrutine til et program der kan køre på flere forskellige databaser og derfor skal det laves i ren SQL
Avatar billede arne_v Ekspert
22. november 2009 - 20:29 #1
Hvorfor ikke bare:
  SELECT FROM dintabel
og test paa fejl?
Avatar billede arne_v Ekspert
22. november 2009 - 20:30 #2
Ellers proev:

SELECT name FROM MSysObjects WHERE type=1 AND flags=0
Avatar billede terry Ekspert
22. november 2009 - 20:34 #3
"Det er et 100% must at det er ren SQL statements .."

Why not just try and create and catch any error, nothing at all wrong in doing that.
Avatar billede hrc Mester
22. november 2009 - 21:06 #4
terry: Arne_v already suggested that (in Danish).

Knowing this is used in a Delphi-application it is very easy to try-catch if table already exists. Had it just been SQL-server where the answer lay in the system-tables. With Access you'll have to catch the exceptions.

so, in Delphi:

function TableExists(const aTablename: string): boolean;
var
  Query: TSomeQueryComponent;
begin
  result := true;
  Query := TSomeQueryComponent.Create(aConnection);
  try
    Query.SQL.Add(      'select *');
    Query.SQL.Add(format('from %s',[aTablename]));
    Query.SQL.Add(      'where (ID = 0)');
    try
      Query.Open;
    except
      result := false;
    end;
  finally
    Query.Free;
  end;
end;
Avatar billede terry Ekspert
22. november 2009 - 21:13 #5
:o)
Arne suggested selecting, I suggested creating only which only requires one operation
Avatar billede hrc Mester
22. november 2009 - 21:24 #6
terry: You are right. No need to peek. Just try to create a table if needed. That would work fine (the Access way)
Avatar billede terry Ekspert
22. november 2009 - 21:29 #7
I'm lazy :o)
Avatar billede Slettet bruger
22. november 2009 - 23:10 #8
inspireret af:
http://msdn.microsoft.com/en-us/library/aa165325(office.10).aspx

i vbscript: (erstat mdb path)


Set cat = createobject("adox.Catalog")
cat.ActiveConnection ="provider=microsoft.jet.oledb.4.0;data source=<path to .mdb fil>"
For Each tblList In cat.Tables
      If tblList.Type = "TABLE" or tblList.type="LINK" Then
        lst = lst & tblList.Name & vbTab & vbcrlf
      End If
Next
Set cat = Nothing
MsgBox lst,,"Tables"
Avatar billede hugopedersen Nybegynder
23. november 2009 - 07:13 #9
Min Delphi kode ser sådan her ud for nuværende
Det er UniDAC UnifiedSQL script der bruges så jeg kan klare alle de databasetyper jeg skulle komme ud for. Problemet nu er at fejlen i Execute ikke bliver fanget.

Procedure DB_Create_Table(aTable : String);
  Var
    CreateTable            : TUniScript;
Begin
  CreateTable := TUniScript.Create(Nil);
  CreateTable.Connection := frmDataConnection.conDBserver;
  Try
    With CreateTable Do
      Begin
        SQL.Clear;
        SQL.Add( ' {IF ACCESS} ');
        SQL.Add( ' CREATE TABLE ' + aTable );
        SQL.Add( ' {ELSE} ');
        SQL.Add( ' CREATE TABLE IF NOT EXISTS ' + aTable );
        SQL.Add(' {ENDIF}');
        SQL.Add(' (ID INTEGER NOT NULL PRIMARY KEY)');
        SQL.Add( ' {IF MYSQL} ');
        SQL.Add(' (ENGINE=InnoDB DEFAULT CHARSET=latin1');
        SQL.Add(' {ENDIF}');
        Try
          Execute
        Except
          On E:Exception Do
            Begin
              Log_Error(E.Message);
            End
        End;
      End;
  Finally
    CreateTable.Free;
  End;
End;
Avatar billede terry Ekspert
23. november 2009 - 08:38 #10
Hi Hugo
Maybe you have a better chance of getting an answer to your Delphi code in that category
Avatar billede arne_v Ekspert
24. november 2009 - 01:14 #11
Returnerer Execute en status værdi ?

Ellers kan det jo være at du bliver nødt til at teste om tabellen eksisterer.
Avatar billede hugopedersen Nybegynder
24. november 2009 - 09:00 #12
Desværre er Execute en procedure uden parametre og returnerer derfor ikke noget resultat.
Efter lang tid søgen fandt jeg ud af at hvis jeg smed den visuelle part af UniScript på min dataconnection form, så fik jeg lige pludselig en OnError event jeg kan bruge til noget.
(jeg kan ikke lige gennemskue om den kan bruges som jeg startede)

Men da der er kommet mange gode input fra arne_v, terry og hrc, synes jeg at i skal smide et svar.
Avatar billede hugopedersen Nybegynder
24. november 2009 - 09:05 #13
HRC> jeg studser lidt over Query.SQL.Add(format('from %s',[aTablename]));
Hvorfor format?
Avatar billede arne_v Ekspert
24. november 2009 - 16:06 #14
svar fra mig
Avatar billede hrc Mester
25. november 2009 - 03:49 #15
hugo: Fordi jeg ikke kan lade være med at bruge Format. Det er hyppig kilde til fejl.
Avatar billede hugopedersen Nybegynder
30. november 2009 - 08:45 #16
OK - ja fejl er aldrig godt.

Afventer svar fra HRC & Terry
Avatar billede arne_v Ekspert
14. december 2009 - 03:07 #17
hrc og terry !!!!
Avatar billede hugopedersen Nybegynder
28. december 2009 - 11:33 #18
arne_v>  da hrc og terry ikke har reageret får du hele puljen som forsinket julegave :-)
Avatar billede terry Ekspert
28. december 2009 - 12:24 #19
Oops, sorry for my absence, actually don't think I received any mails concerning this Q!

Anyway I see Arne doesn't need so many more point to get past the 1 million so lets support him there.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester