DBExpress Verbindung \ Daten mit DBGrid anzeigen
-
Hallo zusammen,
Ich hab mit DBexpress eine Datenbankverbindung zu einem SQLserver aufgebaut. das ganze war soweit kein Problem. Mit einem TSQLQuery kann auch Problemlos darauf zugreifen.
ich würde aber jetzt gerne mit den von Borland gegebenen Komponenten ausgewählte Tabellen oder Tabellenteile in einem DBGrid anzeigen lassen.
Wie stelle ich das an? in der Faq ist sowas beschrieben aber nur mit BDE. Alle bemühungen die ich bisher angestellt haben endeten entwedermit dem Fehler das keine Tabllen ausgewählt sind oder das es nicht geht weil unidirektional. Google hat mir auch nur soweit geholfen das es wohl mölich ist, hab aber nirgens gefunden wie.
-
Hast Du mal versucht die Daten in TSQLClientDataSet zu laden und mit TDataSource in dem Grid darzustellen?
Was nimmst Du für eine Bibliothek/Treiber um auf den MSSQL_Server zuzugreifen? Kann das der Builder selbner oder ist es eine 3rd-Party-Software?
-
Hallo
Das sollte bei allen von TDataSet abgeleiteten Komponenten (TSQLQuery dürfte das sein) einfach mittels TDataSource gehen, was zwischen TDataSet und TDBGrid geschaltet wird.
Damit das Grid auch aktiv Daten anzeigt muß das TDataSet natürlich aktiv sein, d.h. die Abfrage muß mindestens einmal nach Programmstart ausgeführt worden sein.Es gibt im Builder auch Beispielprogramme die die Verwendung der Datenbank-Komponenten demonstrieren (<BCB-Path>/Examples/DBTasks). Diese verwenden als DB zwar Paradox und BDE, aber die GUI-Komponenten sind ja genau die die du auch einsetzen willst.
bis bald
akari
-
@witte:
TSQLClientDataSet gibt es bei mir nicht. es gibt nur TClientDataSet und damit kann ich keine verbindung zu TSQLConnection aufbauen, dazwischen muss nochwas fehlen.
TSQLConnection baut eine Verbindung zu einem MYSQL Server auf.@akari
Was muss ich welche Komponente sagen damit die Tabellen angezeit werden?Irgendwo muss ich dem ja sagen welche Tabllen er nehmen soll, oder?
Also was bis jetzt meiner Meinung nach am sinnigsten ist ist
TSQLConnection->TSQLDataSet->TDataSource->TDBGridWenn ich TSQLDataSet jetzt Aktiv schalte, kann kommt die Fehlermeldung "Fehlende Abfrage, Tabellen oder Prozedurnamen".
Vielleicht noch zur info, ich befinde mich nicht in der Laufzeit
Ich weiß zwar nicht warum aber die Beispiele funktionieren alle bei mir nicht, bekomm die gar nicht erst geladen.
-
Hast Du in CommandText Deine SQL-Anweisung reingeschrieben? Steht CommandType auf
ctQuery?
-
Hmm.. das hab ich nicht gemacht, jetzt aber und nu hab ich mal wieder meinen unidirektional Fehler.
genauer gesagt:"Diese Operation ist bei einer unidirektionalen Datenmenge nicht gestattet".
was das heißt ist klar, aber was kann ich dagegen machen?
-
Dann kannst Du über einen Provider gehen:
- TSQLConnection stellt die Verbindung zur Datenbank her
- TSQLQuery erstellt einen Serverseitigen ForwardOnly-Cursor ("unidirektionale Datenmange"). Dieser bekommt als SQLConnection das obige Objekt verpasst und das SQL wird angegeben
- TDataSetProvider vermittelt den Cursor des TSQLQuery mit einem ClientDataSet. (Die Daten müssen lokal gespeichert werden, da der Cursor keine freien operator[]-Zugriff auf die Daten ermöglicht. Er bekommt als DataSet dieses TSQLQuery-Objekt
- TClientDataSet ist der lokale Cache dieser Daten. Er bekommt in ProviderName den
TDataSetProvider .
- eine TDataSource vermittelt zwischen den Daten im TClientDataSet und Deiner Controls. Sie bekommt als DataSet das TClientDataSet .
- Dein DBGrid bekommt als DataSource das TDataSource-Obnjekt.
-
Danke,
So hab ich mir das vor gestellt. Wenn du mir jetzt noch verräts wie ich geänderte daten wieder hoch laden kan, dann bin ich vollkommen glücklich
Ich denk ja mal das es sone art update Funktion oder sowas gibt, mit dem die änderungen im grid sich auf die DB auswirken, oder?!
-
Du kannst TClientDataSet::ApplyUpdates() verwenden. Wenn Du eine Fehlerbehandlung brauchst weil die Daten beispielsweise von der Datenbank aus Konsistenzgründen nicht akzeptiert werden kannst Du Dir mal TClientDataSet::OnReconcileError anschauen.
-
Das schein nicht zu funktionieren, oder ich hab was vergessen. wenn ich ApplyUpdates ausführe (0 fehler) dann kommt die fehlermeldung:
Erste Gelegenheit für Exception bei $7C812AEB. Exception-Klasse EDatabaseError mit Meldung 'SQLDataSet1: Eine Datenmenge, die nur zum Lesen ist, kann nicht geändert werden'. Prozess Project1.exe (3016)
-
ReadOnly muss auf false eingestellt sein und das SQL-Statement muß so beschaffen sein, dass es aktualisierbar ist. Ich weiss nicht, was Dein mysql-Treiber da braucht. Klappt denn ein einfaches SELECT * FROM mytable ?
-
ReadOnly ist auf False überall. Als SQL Statement hab ich Select * from Adressen
Aber mit select kann man doch nur auslesen und nicht schreiben, oder?
-
Also bei mir klappt es mit Postgresql. Das mysql bekomme ich nicht zum Laufen. Wie hast Du den mysql-Support installiert? Von welcher Site?
-
Der Mysql Server läuft auf einem Suse 10.3 System von strato. Die libmysql.dll hab ich irgenwo von google. war sone seite auf der man sämtliche dlls runter laden kann. Der rest ist bei Borland dabei gewesen.