2009-04-18 7 views
7

Ich möchte eine Abfrage wie als nächstes tun:information_schema.columns auf SQLite

SELECT table_name, column_name, data_type, is_nullable, ... 
FROM information_schema.columns 

auf einer SQLite-Datenbank.

Ich habe

PRAGMA table_info(table_name); 

aber meine Bedürfnisse nicht passt, nur Felder überprüfen ein Tisch.

Ich habe

select * from sqlite_master where type = 'table'; 

Aber dies wird nur Tabellennamen und Erstellung Abfrage.

Gibt es eine Möglichkeit, diese mit Methoden "beizutreten"? oder irgendwelche anderen Vorschläge oder Ideen? tx

+0

Können Sie erklären, warum PRAGMA nicht Ihren Anforderungen entspricht? Für mich gibt es für jedes Feld eine Zeile mit Spaltenname, Datentyp etc. Was brauchst du noch? –

+0

Was ich brauchte, war eine Abfrage wie SELECT * FROM information_schema.columns ohne ein wo. PRAGMA arbeitet für nur einen Tisch jeder einmal –

Antwort

4

Ich weiß, dass Sie dies nicht hören wollen, aber Sie werden nicht in der Lage sein, die Verbindung von SQL mit SQLite zu machen. Das Pragma table_info ist nicht einer Standardabfrage zugeordnet, sondern ein Programm für virtuelle Maschinen, das in den SQLite-Quellen fest codiert ist. Dieses Programm unterstützt nur eine einzige Tabelle. Punkt. :)

Wenn Ihre Bedürfnisse nur testen, sollte es nicht zu schwer sein, Skript zu schreiben, um zu tun, was Sie wollen. Andernfalls müssen Sie dies in Ihre Anwendung schreiben. In beiden Fällen wählen Sie den Tabellennamen aus sqlite_master mit Ihrer sqlite_master-Abfrage aus, erstellen eine SQL-Abfrage unter Verwendung von sqlite3_mprintf("pragma table_info(%s);",name) und bereiten diese vor bzw. führen sie aus.

3

Es gibt viel mehr Unterstützung in der SQLite C API für diese Art von Sache; siehe zum Beispiel this page.

+0

defekten Link, und ich bin auf der Suche nach einem nativen Weg –

3

FYI, wenn Sie .Net verwenden, können Sie die DbConnection.GetSchema-Methode verwenden, um Informationen abzurufen, die sich normalerweise in INFORMATION_SCHEMA befinden. Wenn Sie eine Abstraktionsschicht haben, können Sie den gleichen Code für alle Arten von Datenbanken haben (Beachten Sie, dass MySQL die ersten 2 Argumente des restrictions -Arrays zu übertragen scheint).