![]() |
Datenbank: SQLite • Zugriff über: SQLite DB Delphi Wrapper
Überprüfen ob Spalte existiert
Hallo ihr,
ich benutze den ![]() Zuerst dachte ich ich mach es mithilfe eines SQL-Zugriffes, und wenn die SpaltenAnzahl nicht so groß ist, wie da Anzahl der geforderten, dann existiert diese Spalte nicht. Das Problem ist, aber das er intern nun bereits einen Fehler hervorruft, dass er nicht auf bestimmte Spalten zugreifen konnte :) Wie würdet ihr jetzt an das Problem gehen? Ich könnte natürlich den Fehler abfangen, aber ich wollte ja gerade das verhindern :P MfG xZise |
Re: Überprüfen ob Spalte existiert
Ich weiß ja nicht, ob das auch bei SQLite geht, aber es sollte so gehen:
SQL-Code:
Und dann einfach schauen, ob ein Ergebnis gefunden wurde, also die Anzahl > 0 ist.
SHOW COLUMNS FROM tabellenname WHERE Field=...
![]() |
Re: Überprüfen ob Spalte existiert
Naja das war ja sogut wie meine vorgehensweise (bis auf dem Umstand das du mit SHOW und ich mit SELECT gearbeitet habe). Und auf den Ersten Blick unterstützt SQLite kein SHOW.
MfG xZise |
Re: Überprüfen ob Spalte existiert
Zitat:
Aber wenn das bei SQLite ohnehin nicht geht, hat sich das ja erledigt. Mit der unten auf der verlinkten SELECT-Abfrage sollte es aber auch gehen, vielleicht geht das ja. Und wie hast du es denn jetzt gemacht, dass da ein Fehler kommt? |
Re: Überprüfen ob Spalte existiert
Also ich habe es im Moment einfach mit "SELECT <Gesuchte Spalte> FROM <Tabelle>" und da kam dann auch der Fehler.
MfG xZise |
Re: Überprüfen ob Spalte existiert
Ja, ok, das ist ja auch etwas vollkommen anderes als das was ich mache...
Ich frage ja nur die Spalteninformationen ab und versuche nicht den Inhalt der Spalte aus der Tabelle auszulesen. Dass bei diesem Zugriff bei dir ein Fehler kommt, ist ja klar. Du kannst es ja wie gesagt mit einem SELECT auf die Tabelleninformationen versuchen wie es auf der verlinkten Seite noch steht, wenn SQLite SHOW nicht unterstützt. |
Re: Überprüfen ob Spalte existiert
Hallo,
ich mache das so
SQL-Code:
Dann Open / Clsoe und per Schleife prüfen
Select * From Table1 Where Id=0
for i:= 0 to Fields.Count-1 Heiko |
Re: Überprüfen ob Spalte existiert
Statt die eine bestimmte Id abzufragen kann auch einfach die Anzahl der Ergebnisse mittels LIMIT auf 1 gesetzt werden, so dass der Inhalt für die Abfrage egal ist.
Problem evtl.: Es muss mindestens eine Zeile vorhanden sein, sonst wird das wohl nicht klappen, oder? |
Re: Überprüfen ob Spalte existiert
LIMIT ist MySQL-spezifisch, genauso wie SHOW FIELDS und dergleichen. Da muss halt mal die Dokumentation des DBMS bemüht werden, ob es etwas ähnliches gibt, oder eine universelle Abfrage wie die von Heiko auf die Tabelle losgelassen werden.
|
Re: Überprüfen ob Spalte existiert
Zitat:
Zitat:
Zitat:
MfG xZise |
Re: Überprüfen ob Spalte existiert
So, jetzt habe ich mal für dich kurz in die Dokumentation geschaut wie man das in SQLite machen sollte... :roll:
![]() Über PRAGMA table_info(table-name); bekommst du die Infos frei Haus geliefert welche Spalten vorhanden sind usw. Und für die Infos zu den vorhandenen Tabellen gibts SQLITE_MASTER, wie in den FAQ sogar leicht zu finden ist: ![]() |
Re: Überprüfen ob Spalte existiert
Hallo,
Open/Close kommt von der Query. Nach dem Open kommt dann z.B.
Delphi-Quellcode:
function FieldExists(theDataSet: TDataSet; const theFieldName: String): Boolean;
var iFieldIndex: Integer; begin Result:= False; for iFieldIndex:=0 to theDataSet.FieldCount-1 do begin if CompareText(theDataSet.Fields[iFieldIndex].FieldName,theFieldName)=0 then begin Result:= True; Exit; end; end; end; { FieldExists } Heiko |
Re: Überprüfen ob Spalte existiert
Naja,
ich habe es jetzt über den SQLITE_MASTER gelöst:
Delphi-Quellcode:
MfG
function TDatenbankWrapper.ColumnExists(const ATableName, AColumnName: string;
const AWrapper: TDatenbankWrapper): Boolean; var BufferTable : TSQLiteTable; TableDesc, ColumnName : string; Offset, NameEnd : Integer; begin Result := false; BufferTable := GetTable('SELECT sql FROM SQLITE_MASTER WHERE name = "' + ATableName + '"', AWrapper); try TableDesc := BufferTable.FieldAsString(0); Offset := Pos('(', TableDesc); while (Offset > 0) or (not Result) do begin // Ignoring leading spaces while TableDesc[Offset + 1] = ' ' do Inc(Offset); NameEnd := PosEx(' ', TableDesc, Offset + 1); if NameEnd = 0 then NameEnd := Pos(')', TableDesc); ColumnName := Copy(TableDesc, Offset + 1, NameEnd - Offset - 1); if ColumnName = AColumnName then Result := true; Offset := PosEx(',', TableDesc, Offset + 1); end; finally BufferTable.Free; end; end; xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz