Datenbank in VC++ .NET ??
-
Hallo!
Bisher habe ich nur im C++Builder von Borland programmiert und mir jetzt aber Visual C++ .NET 2003 zugelegt.
Spiele damit gerade so mal rum...Wie bekomme ich es denn hin, dass in einem Grid eine Datenbanktabelle angezeigt wird, die dann hier auch bearbeitet werden kann?
Ist das mit einer Access-Datenbank möglich?Ich habe das schon fast hinbekommen: Ich habe mir im Server-Explorer eine Datenverbindung zu meiner Access-Datenbank aufgebaut. Dann habe ich die Tabelle einfach mit der Maus ins Formular gezogen.
Automatisch erstellt hat er mir dann folgende Komponenten:
-odbcConnection1
-odbcDataAdapter1
-dataSet1Dann habe ich mir einfach ein "DataGrid" ins Formular gezogen und als DataSource "dataSet1.Tabelle1" ausgewählt.
Soweit so gut.Dann habe ich mir einen Button hinzugefügt und im Click-Event hinzugefügt: odbcDataAdapter1->Fill(dataSet1);
Dann sehe ich in meinem Grid alle Daten. Wenn ich aber nochmal auf dem Button klicke, sind diese doppelt drin...
Wenn im Grid was geändert wird, werden die Daten auch nicht übernommen.Ist es denn nicht möglich, dass mit Visual C++ diese Arbeit weitgehendst abnimmt??
Im c++builder musste ich hierzu einfach ein Grid einfügen, ein DataSource und ein DataSet. Dann ein paar Eigenschaften setzen und ich habe mich um nichts mehr kümmern müssen. Kann das VC++ auch??
Ich bin wirklich blutiger Anfänger mit Visual C++ .NET !
Kann mir jemand ein gutes Buch zu Visual C++.NET empfehlen (Nicht zu C++ allgemein, habe ja schon im C++Builder programmiert, für mich ist also nur die IDE und .NET neu!)
Freue mich über jede Antwort!
tschüss
RobertAchso, falls das wichtig ist: Ich habe Visual C++ .NET 2003 Enterprise Architect
-
Im c++builder musste ich hierzu einfach ein Grid einfügen, ein DataSource und ein DataSet. Dann ein paar Eigenschaften setzen und ich habe mich um nichts mehr kümmern müssen. Kann das VC++ auch??
Hmm, ich glaube ich schmeiß all meine Softwareentwickler raus und kaufe mir den C++ Builder.
Zu Fill( ... )
Fill aktualisiert bestehende Daten im Dataset bzw. fügt neue hinzu. Auf deutsch, du mußt vor dem Fill dein Dataset ( bzw die einzelne Tabelle ) mit Clear() löschen.Wenn im Grid was geändert wird, werden die Daten auch nicht übernommen.
Im DataAdapter Update aufrufen.
-
Hallo!
Danke für deine Hilfe!!
So funktionierts! Obwohl sich dataSet1->Tabelle1->Clear() ja ziemlich böse anhört
Wie kann man denn in der Tabelle selbst navigieren, also z.B. zum nächsten Datensatz springen?
Gibts eigentlich schon irgendeine "Spitzen-Page" im Internet, wo .NET Komponenten zum Download angeboten werden? (wie beim BCB die Torry-Page z.B.)
Achja: Stelle bitte blos keine Leute aus - bleib bei MS VC++ !! Mir gefällt die Sache allmählich immer besser... Und diese Geschwindigkeit von IntelliSense - unglaublich! Bei Borland ist hier immer Warten angesagt...
Danke dir schonmal!!
tschüss
Robert
-
Navigieren im DataGrid?
Wenn mich nicht alles täuscht: CurrentRowIndexÜber die Tabelle: über Tablle.Rows[index] bekommst ne DataRow Zeile zurück.
CodeProject.com
csharp-corner.com
oder einfach googlen.
-
rowisoft,
rowisoft schrieb:
Wie kann man denn in der Tabelle selbst navigieren, also z.B. zum nächsten Datensatz springen?
die schlechte Nachricht lautet, daß die neuen DotNet-Datenbank-Komponenten eine Navigation in Tabellen wie in Delphi/CBuilder (also Next, Prev, Last, First) momentan nicht unterstützen. Das liegt daran, daß keine Server-seitigen Cursor untersützt werden. Für diesen Zweck müßtest Du auf ADO 2.x zurückgehen, auf die neue DotNet-Version warten oder das ganze selbst programmieren ...
-
Es gibt in .NET die BindingManagerBase und die CurrencyManager Klasse, mit denen man sowas zienlich einfach realisieren kann.
-
Dominic schrieb:
Es gibt in .NET die BindingManagerBase und die CurrencyManager Klasse, mit denen man sowas zienlich einfach realisieren kann.
Diese Klassen werden vom Binding-Framework zur Verfügung gestellt und überlagern praktisch nur die dahinter liegende Datenmenge (ArrayList, DataTable ... was auch immer). Natürlich kann man damit eine Datenmenge durchlaufen. Das geht aber auch schon mit der DataTable oder der ArrayList selbst.
Eine DataTable arbeitet jedoch stets auf einem lokal gepufferten Teilbereich der tatsächlichen Tabelle. Um alle Datensätze einer Tabelle zu durchlaufen, müßte man also auch alle in den Hauptspeicher laden.
-
Was meinst Du mit BindingFramework? Diese Klassen gehören zum .NET Framework und sind meiner Meinung sehr einfach und ideal zu benutzen, um durch Datensätze zu navigieren.
Weil einfacher als z.B. "currencyManager.Position++;" geht es ja kaum noch.
-
Dominic schrieb:
Was meinst Du mit BindingFramework? Diese Klassen gehören zum .NET Framework ...
Ja schon, aber ".Net Framework" ist vor allem ein Marketing-Begriff. Ein Framework in der Softwareentwicklung ist so etwas wie ein Grundgerüst, um das herum man seine individuellen Lösungen erstellt. Und das .Net Framework läßt sich in - sagen wir - "Sub-Frameworks" unterteilen, die jeweils die Grundlage für die Lösung bestimmter Problemklassen bieten. Eines davon wird häufig als "binding framework" bezeichnet. Dieser Begriff wird dann als eine Art faule Kurzform für "alles, was mit binding zu tun hat" verwendet. Über solche Sachen kann man stundenlang philosophieren ...
Dominic schrieb:
...einfacher als z.B. "currencyManager.Position++;" geht es ja kaum noch.
Also die Frage war:
rowisoft schrieb:
Wie kann man denn in der Tabelle selbst navigieren, also z.B. zum nächsten Datensatz springen?
Fall 1: Mit "Tabelle" ist eine Instanz einer der DotNet-Klassen gemeint - also z.B. ein Objekt vom Typ DataTable. In diesem Fall kann man mit
foreach (DataRow row in myTable)
einfach durch die Tabelle iterieren, per Indexer direkt auf Zeilen zugreifen oder eben das Binding-Framework verwenden (CurrencyManager), wenn man die Daten z.B. in einem Grid darstellen will.
Fall 2: Mit "Tabelle" ist die Tabelle in der Datenbank gemeint.
In diesem Fall ist ein Springen auf den nächsten Datensatz nicht direkt möglich, da keine Verbindung (CURSOR) zur Datenbank aufrecht erhalten wird. Das soll erst wieder in der nächsten DotNet-Version möglich sein.