![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS
Allgemeines Datenbankproblem bei SQL Abfrage
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo mal wieder,
also, ich habe mal wieder ein Problem mit der Datenbankabfrage über SQL. Leider denke ich, das ich da einen Grundlegenden Fehler in meiner Datenbank habe. Ich habe drei neue Tabelle über IBExpert angelegt, kann aber nur auf eine davon zugreifen. Im Anhang, habe ich mal die Fehlermeldung von Delphi. In der Datenbank existieren momentan 4 Tabellen. 1. Eine Tabelle zum Datenspeichern. 2. Eine Tabelle zum Datenspeichern. 3. Eine Tabelle für die USER-Einstellungen 4. Eine Tabelle für die Konfigurationseinstellung. Auf 1 und 2 kann ich zugreifen. Ich habe es auch mal im Designmode versucht. Wenn ich im SQL Code folgende Zeilen eingebe, kann ich auf die ersten beiden im Designmode zugreifen und bei den anderen nicht.
SQL-Code:
Geht...
SELECT * FROM MB256PLUS
SQL-Code:
Geht...
SELECT * FROM MB100
SQL-Code:
Geht nicht...
SELECT * FROM User
SQL-Code:
Geht auch nicht...
SELECT * FROM Config
Vieleicht kann mir ja mal jemand sagen, was ich da falsch mache. Die Datenbank stelle ich mal in den Anhang. Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
User und Config sind evtl. reservierte Namen innerhalb Deines DBMS...
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Ich weiß jetzt nicht, wie es bei Firebird ist. Aber versuch mal <Datenbankname>.Config / <Datenbankname>.User
Eventuell hilft das dann weiter. Ansonsten bleibt dir nichts anderes übrig als deine Tabellen umzubennen. |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Sind die Tabellen in 3 und 4 von Dir angelegt worden ?
Edit: Denn User und Config sind reservierte Namen bei Firebird. Probiere die Namen Config und User mal in Anführungszeichen zu setzen. Vielleicht klappt es dann. So habe ich es bei einer Tabellenspalte gemacht, die den Namen Sequence bekommen hat von mir. Sequence ist ebenfalls ein reservierter Name. |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Du könntest die Tabellennamen quoten. Aber besser wäre es diese umzubenennen
SQL-Code:
SELECT * FROM "User";
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Habe ich jetzt auch gemacht,
das funktioniert auch so jetzt, allerdings habe ich festgestellt, das ich die Tabellen nur dann Abfragen kann wenn ich die durchgehend in Großbuchstaben geschrieben habe. Tabellenname über IBExpert : 'Benutzer' lässt sich nicht abfragen. Tabellenname über IBExpert : 'BENUTZER' lässt sich abfragen. Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Durch Quoten wird der name auch casesensitiv. Im IBExpert gibt es dehalb die Option, gequotete Bezeichner automatisch in Großbuchstaben wandeln zu lassen. Ich würde die Tabellennamen aber ändern.
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
[edit] Ich kaufe ein "d" :mrgreen: Außerdem: ![]() |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
"Besser" ist eher eine gelinde "Besserung". 8) Man beachte die quotes "". :mrgreen: Das ist wie mit "Made In Germany". Erdacht als Ächtung und heute noch Qualitätssiegel. Als nicht-englisch-Muttersprachler ist es doch wirklich sehr einfach "Benutzer" zu verwenden und den ganzen unnötigen Kram aus dem Weg zu gehen.
Uff, roter Kasten war schneller. :shock: Das Gesagte bleibt. Und die "Quotes" sind echt ein Problem. Es gilt : einmal Quotes immer Quotes ! Der SQL-Dialekt MUSS 3 sein !! @ roter Kasten 2 : jo. @ roter Kasten 3 : quotes müssen weg. :mrgreen: |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Erstmal vielen dank,
ich muss jetzt erstmal meine Hausaufgaben machen. Werde jetzt mal die Einstellungen anpassen, und nochmal die Anleitung zur Firebird lesen. Zitat:
Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Ich hab das so verstanden, dass Du deutsche Bezeichner nehmen sollst, da diese sich mit ziemlicher Sicherheit nicht mit reservierten Bezeichnern beißen.
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo Jens,
ich habe es dir bereits ![]() Aber nochmal: Nur Großbuchstaben A..Z, Ziffern 0..9 und den Unterstrich für Feldnamen+Tabellen+Trigger usw. verwenden. Keine Sonderzeichen oder Umlaute. Desweiteren keine ![]() Du machs dir das Leben damit definitv leichter! alex |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Naja, aber jetzt.
ich war bis jetzt der Überzeugung, das man versuche sollte englische Bezeichner zu nehmen. Aber es klingt mir logisch. Englische Bezeichner könnten Belegt sein, und deutsche nicht. Werde jetzt nochmal die ganze Sache überarbeiten. Hat den mal jemand in die Datenbank reingesehen, und kann mir vieleicht sagen, ob es da sonst noch irgendwelche Sachen gibt, die ich nicht verstanden habe. Gruß Jens PS: Danke an alle. Hat mich aufjedenfall nochmal ein bißchen näher ans verstehen der DB´s gebracht. |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo nochmal,
ich häng mal ne simple Frage zum Thema an. Ich habe auf der IBExpert-Page folgende Anleitung gefunden. ![]() Da ich aber jemand bin der gerne was in Papierform hat, meine Frage, Gibt es diese Anleitung auch irgendwo als PDF oder so. Ich weiß im Downloadbereich, aber leider nur auf Englisch. Es wäre für mich halt wesendlich einfacher in Deutsch. Vieleicht gibt es da ja irgendwas. Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo Jens,
meine Empfehlung: - Tabelle MB100 und MB256PLUS Feldtyp von Datum als DATE statt CHAR(10) Feldtyp von Uhrzeit als TIME statt CHAR( 8) - Tabelle USER umbenennen in BENUTZER Feld Benutzer umbenennen in BENUTZER_NAME für BENUTZER_NAME und PASSWORT statt CHAR VARCHAR verwenden - Tabelle Config umbenennen in KONFIGURATION o.ä. Feld ID als Primary Key hinzufügen - SysDatum und SysTime (einmal deutsch einmal englisch!?) als TIMESTAMP zusammenfassen. generell: - wie schon geschrieben, alle Tabellen, Feldname usw in GROSSBUCHSTABEN ohne Sonderzeichen und keine reservierten oder Keywords (siehe Link). - ALLE Tabellen sollten eine ein Feld ID als Primary Key besitzen Diese ID hat, außer einem eindeutigen Wert, grundsätzlich keine Information. (und ja, es kann Ausnahmen geben, aber nur in Bezug auf den Inhalt) - Definiere die eigene Domänen. Wenn du es nicht machst, mach es Firebird für dich automatisch und zwar für jeder Feld eine eigene (zu sehen in den Systemtabellen). Damit verringerst du den den Aufwand den Firebird beim Parsen der Statements hat. Außerden hast du eine bessere Übersicht über deine verwendeten Feldtypen. Beispiele:
SQL-Code:
- Boolsche Werte als INTEGER (0/1)
CREATE DOMAIN DOM_BENUTZER AS VARCHAR(40) COLLATE DE_DE; -- eigene Benutzerverwaltung
CREATE DOMAIN DOM_BLOB AS BLOB SUB_TYPE 0 SEGMENT SIZE 80; CREATE DOMAIN DOM_BOOL AS INTEGER DEFAULT 0; CREATE DOMAIN DOM_CHAR10 AS CHAR(10) COLLATE DE_DE; CREATE DOMAIN DOM_CURRENCY AS NUMERIC(16,4); CREATE DOMAIN DOM_DATE AS DATE; CREATE DOMAIN DOM_DATETIME AS TIMESTAMP; CREATE DOMAIN DOM_ID AS INTEGER NOT NULL; CREATE DOMAIN DOM_LINK AS INTEGER NOT NULL; CREATE DOMAIN DOM_LINK_LOOSE AS INTEGER; CREATE DOMAIN DOM_INT AS INTEGER; CREATE DOMAIN DOM_MEMO AS BLOB SUB_TYPE 1 SEGMENT SIZE 80; CREATE DOMAIN DOM_NUM9_2 AS NUMERIC(9,2); CREATE DOMAIN DOM_PLZ AS CHAR(7) DEFAULT ''; CREATE DOMAIN DOM_PROZENT AS NUMERIC(9,2); CREATE DOMAIN DOM_TIME AS TIME; CREATE DOMAIN DOM_VCHAR10 AS VARCHAR(10) COLLATE DE_DE; CREATE DOMAIN DOM_VCHAR100 AS VARCHAR(100) COLLATE DE_DE; .... - jede Tabelle bekommt Felder aus denen zu ersehen ist wann und von wem der Datensatz angelegt und das letzte mal geändert wurde. Das Eintragen diese Werte erfolgt über Before-Trigger die beim Insert und Update gefeuert werden. Damit ist allein Firebird bzw. der Rechner aus dem Firebird läuft für der Inhalt zuständig und nicht irgendein Client-Rechner oder das Programm. Hilft ungemein beim Interpretieren der Daten, bei der Fehlersuche und beim "Bewerten" von Kundenaussagen. Beispiel: DC, DM sind DOM_DATETIME, UC, UM sind DOM_BENUTZER
SQL-Code:
CREATE OR ALTER TRIGGER TRIG_TESTTAB_BIU FOR TESTTAB
ACTIVE BEFORE INSERT OR UPDATE POSITION 1 AS BEGIN IF(NEW.ID IS NULL) THEN NEW.ID = GEN_ID(GEN_TESTTAB_ID, 1); if (inserting) then begin NEW.DC = current_timestamp; NEW.UC = CURRENT_USER; /* oder wie bei uns über eine Prozedur wenn nicht mit unterschiedlichen Firebird-Usern gearbeitet wird EXECUTE PROCEDURE SP_GET_CURRENT_USER RETURNING_VALUES NEW.UC; */ end if (updating) then begin NEW.DM = current_timestamp; NEW.UM = CURRENT_USER; /* EXECUTE PROCEDURE SP_GET_CURRENT_USER RETURNING_VALUES NEW.UM; */ end END alex |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
alex |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Kleine Ergänzung zu Alex' Empfehlungen in #17: Inzwischen kennt Firebird den BOOLEAN-Datentyp (ich finde nicht genau, seit welcher Version). Es gibt aber immer wieder einmal ein Problem bei der Anwendung; und intern ist dieser sowieso genauso deklariert wie bei Alex' Vorschlag. Dieser "alte" Vorschlag INTEGER (0/1) (seit Interbase 4.x oder früher) hat also immer noch seine Berechtigung. Jürgen
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
hatte ich gesehen, ist halt nur echt aufwendig die ganze Page zu drucken. Zitat:
Naja, vieleicht versuch ich es mal mit der Englischen Anleitung. Das Problem ist halt bei mir auch die Zeit. Ich habe mal angefangen zu programmieren, als ich den Techniker gemacht habe, es hat mir Spaß gemacht, und ich habe angefangen eine Software für unser Unternehmen zu schreiben. Dadurch, das es halt mittlerweile eingesetzt werden soll, muss ich mich halt intensiver damit befassen. Das versuche ich halt. Und da ist natürlich Englisch für mich ziemlich Zeitintensiv. Trotzdem, danke für deine antworten. :thumb: Werde die mal durcharbeiten. Einige Sachen habe ich gestern schon angepasst. Zitat:
Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
falls du diese Daten auswerten willst ist es auf jeden Fall sinnvoll.
Die Umwandlung solltes du im Delphi-Programm machen und die Werte über
Delphi-Quellcode:
setzten. Damit ist das korrekte Eintragen gewährleistet.
MyDataSet.ParamByName('DATUM').AsDate := ..
MyDataSet.ParamByName('UHRZEIT').AsTime := .. Zusätzlich könnte man den von Gerät für das Ereignis gelieferten String als Original in einem VARCHAR oder Blob speichern um bei evtuellen Problemen darauf zugreifen zu können. alex |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
Weißt Du, ich habe genau aus dem Grund (weil ich davon ausgegangen bin, das man englisch verwenden sollte) z.B. USER genommen statt BENUTZER. Es ist auch nicht so, das ich Table und Database nicht übersetzt bekomme. Ich bekomme es auch hin einen ganz Text zu lesen. Es ist nur einfacher, für mich in Deutsch , weil ich halt einen Text in englisch nicht fehlerfrei und schnell lesen kann. Außerdem, ist aller Anfang schwer, und die ganzen Informationen zu sortieren, zu verstehen und anschließende Fehlerfrei umzusetzten, ist halt nicht einfach. Und dafür, das ich das Thema nicht beruflich mache, denke ich bin ich schon echt weitgekommen. Und wenn es da ein Buch zu IBExpert und Firebird in Deutsch gibt, bin ich auch bereit sowas zu kaufen und zu lesen. Ich hoffe Du kannst mich wenigstens ein wenig verstehen, auch wenn wir zwei schon öfters verschiedener Ansichten waren. Trotzdem Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo,
noch zum Datum. Falls die Nutzer mal eine Einschränkung wollen, z.B. die Daten eines Monats, geht das per Extract mit einem Date viel viel einfacher als mit einem String. Heiko |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
Das sind alles so Aufgabe, die ich mir gesetzt habe, wenn ich das Programm soweit fertig habe, den Code zu optimieren, was man aber jetzt schon machen kann, sollte man auch tun. Daher werde ich mich heute direkt an Eure Vorschläge geben. Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Im Anhang, habe ich übrigens mal die geänderte Datenbank, vieleicht kann mir ja mal jemand sagen, ob das jetzt besser aussieht. Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo Jens,
- Bevor du etwas anders macht, leg einen neuen Firebird-User an und erstelle deine Datenbank mit diesem neuen User als Owner. Also weg von SYSDBA/masterkey. Das wird dir Probleme beim Kunden ersparen. Und der nachträgliche Umstieg ist nicht ganz trivial. Zitat:
in einer "Context Variable" hinterlegen. Wenn du das im Context der Session machst, steht diese Variablen solange zur Verfügung wie die Connection besteht. Diese Variable kannst du dann im Trigger abfragen und in das entsprechende Datenfeld eintragen. Damit muss nicht jeder Benutzer einen eigenen Datenbankzugang haben. ![]() - Für die ID solltest du so wie für alle anderen Felder eine Domäne anlegen, die außerdem Not NULL sein sollte. - Je nach gewünschter Auswertung wirst du später noch Indizes anlegen müssen um die Abfragen entsprechend performant zu gestallten. alex |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo Alex,
werde jetzt erstmal diese Sachen versuchen umzusetzen. alex hat geschrieben: Zitat:
Für das Feld ID hatte ich eine Domäne angelegt, konnte diese allerdings, nicht ändern, da das Feld der Primärschlüssel ist, und IBExpert kein Commit zugelassen hat. Danke für die freundliche Hilfe Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
An manchen Stellen ist IBExpert in der Tat sehr restriktiv. Aber gerade den PK kannst du doch relativ einfach ausschalten, dann die Domain ändern und danach den PK neu setzen. Gruß Jürgen |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Zitat:
Gruß Jens [ZITAT, Geht ja] |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
PK löschen, Domäne ändern, PK neu anlegen.
|
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Das hab ich jetzt gemacht, und es geht auch. Den Rest werde ich heute abend und morgen mal testen und meine DB umbauen. Das mit dem User und so.
Also Danke schon Gruß Jens :thumb: |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Hallo nochmal,
habe das mit den USER Einstellungen für Firebird jetzt alles hinbekommen. Habe dann in IBExpert, meine Datenbankregitrierung auch mal auf meinen neuen USER umgestellt, und ich bekomme auch Connection. Dann habe ich allerdings nicht mehr die Möglichkeit unter Tabellen, mir die vorhanden Daten anzusehen. Das ist ein Problem bei Tabellen, in den ich Einstellungsparameter bereitstellen möchte, weil ich die ja mit gewissen Vorgaben fertig zur Verfügung stellen will. Mache ich das jetzt in der Domäne mit den Einstellungen Default für jede Spalte, oder melde ich mich bei IBExpert mit SYSDBA an. Gruß Jens |
Re: Allgemeines Datenbankproblem bei SQL Abfrage
Du musst die entsprechenden Rechte für dein neuen Benutzer setzen (GRANT)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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