Laden...

Forenbeiträge von juetho Ingesamt 3.331 Beiträge

25.03.2010 - 19:56 Uhr

Du schreibst da "TimeOfDay" in die Parameter. Das ist nur eine Zeit, ohne Datumsanteil.

Schau dir alles dazu an. Als ich diesen Vorschlag gemacht hatte, geht es darum:
* ein DateTimePicker für das Datum (also ohne Zeitanteil)
* ein DateTimePicker für die Uhrzeit (also für den 01.01.0001)
* beides wird mit Add(TimeOfDay) verknüpft
Es ist also eigentlich eine vollständige Datum/Zeit-Angabe.

Aber was er damit wirklich macht, kann ich nicht nachvollziehen. Jürgen

25.03.2010 - 19:09 Uhr

bitte nicht gleich losschreien X(

Wundert dich das nach diesem Durcheinander? Aber jetzt läuft es eigentlich.

Aber das ist für mich ein Widerspruch:

Mein Problem ist das ,dass ich aber keine Ausgabe von der Datenbank bekomme.

Wenn ich eine Abfrage direkt auf der Db mache , bekomme ich die Spalte "dtTime" in diesem Format

2010-03-25 14:40:33,130  

vielleicht liegt es an dem Format ?
In der DataGridView wird die gleiche Spalte so ausgegeben

25.03.2010 14:40  

Also bekommst du doch eine Ausgabe, und zwar offensichtlich eine richtige: Beide Datumsangaben sind identisch!

Das eine ist das Format vermutlich des Management Studio, also einer neutralen Anzeige (oder en-US oder so), das andere das Format deiner (deutschen) .NET-Installation. Wenn du nicht dieses Format haben willst, gibt es verschiedene Wege, aber wozu? In Deutschland schreiben wir Datum/Uhrzeit so. Punkt.

Jürgen

25.03.2010 - 16:17 Uhr

Benutze für Oracle nicht Odbc und auch nicht Oledb (und auch nicht den Oracle-Provider von MS), sondern einen der speziellen Oracle-Provider. Siehe connectionstrings. Mit dem "richtigen" Provider fallen viele sonst unerklärliche Probleme weg.

Wahrscheinlich enthält dein ConnectionString nicht die richtigen Angaben für Oracle.

Gruß Jürgen

PS.

  1. Statt Convert.ToString solltest du ToString benutzen, das hat schließlich jedes Objekt.
  2. Zu conn.Close gehört auch conn.Dispose, siehe [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
  3. Deshalb wird das am besten in einen using-Block gepackt.
25.03.2010 - 15:18 Uhr

Du hast vor allem diese Möglichkeiten:

  1. Nimm eine (andere) DataGridViewDateTimePickerColumn, die MinDate und MaxDate zur Verfügung stellt.

  2. Erzeuge dir selbst eine DataGridViewDateTimePickerColumn, die MinDate und MaxDate zur Verfügung stellt. Anleitungen dazu gibt es hier im Forum und "im Internet" zuhauf.

  3. Frage das Ereignis **EditingControlShowing **ab. In diesem Moment bekommst du "das DateTimePicker-Objekt zu fassen".

Gruß Jürgen

25.03.2010 - 13:29 Uhr

Suche nach SqlDependency, so nennt sich diese Funktionalität bei MS-SQL. Jürgen

25.03.2010 - 13:28 Uhr

Eigentlich möchte ich sagen, dass es nicht geht. Die Werte sind schließlich an eine vorhandene Datenmenge gebunden.

Es gibt aber wohl Leute, die das schon umgesetzt haben; also einfach die Suchfunktion benutzen. Jürgen

25.03.2010 - 08:33 Uhr

Hallo,

wenn es manuell im Code gehen soll, dann nach dem Muster, das im 4. Beitrag der Artikelserie unter Wiederholte Verwendung der gleichen Parameter steht.

Gruß Jürgen

24.03.2010 - 12:30 Uhr

Hallo Andreas,

der erste und vielleicht wichtigste Ratschlag lautet: Benutze bloß nicht Odbc (oder Oledb), sondern einen speziellen DbProvider, wie er auch unter connectionstrings angegeben ist. Das vermeidet viele praktische Probleme.

Zum DbNull-Problem steht etwas im Parameter-Artikel. Ich bin mir aber nicht sicher, ob das zu deinem Problem passt oder ob vbprogger auf das richtige Problem hinweist.

Gruß Jürgen

23.03.2010 - 09:29 Uhr

Hallo,

das mit den doppelten Werten kann bei einem Enum nicht funktionieren. Lass dir in einer Konsolenanwendung doch alle Werte ausgeben, z.B. so:

foreach(Noten item in Enum.GetValues(typeof(Noten))){
	Console.WriteLine("{0} => {1}", (int)item, item.ToString());
}
Console.WriteLine("----------------------");
foreach(string s in Enum.GetNames(typeof(Noten))) {
	Console.WriteLine("{0} => {1}", s, (int)Enum.Parse(typeof(Noten), s));
}

Ausgehend von den Werte bekommst du alle doppelten Werte auch doppelt, aber immer nur mit demselben Text.

Wenn du wirklich unterscheiden willst (z.B. wegen der Violine), dann musst du auch verschiedene Werte zuordnen.

Gruß Jürgen

23.03.2010 - 09:02 Uhr

Vielleicht hilft es dir, wie ich es unter Formular/Control drucken oder als Bitmap speichern gemacht hatte. Jürgen

22.03.2010 - 19:05 Uhr

Ergänzung: Je nachdem, wie du vorgehen willst, steht auch Enum.Parse zur Verfügung. Jürgen

22.03.2010 - 14:01 Uhr

Das geht überhaupt nicht. DataGridView gehört zu Windows-Forms. Bei Web-Technologien sind z.B. GridView und ein Verfahren der Web-Datenbindung, z.B. ObjectDataSource zu verwenden. Jürgen

21.03.2010 - 10:51 Uhr

Dann hast du anscheinend ein großes Verständnisproblem. Eine **DataRelation **ist keine Tabelle (DataTable), sondern es stellt - genau wie ein ForeignKey in einer Datenbank - eine Verknüpfung her zwischen zwei vorhandenen Tabellen über passende Spalten. Dein Ansatz über "new DataTable" ist völlig abwegig.

Also nochmals: :rtfm: **DataRelation **(Konstruktor). Eine DataRelation ist übrigens Bestandteil des DataSet, aber nicht von DataSet.Tables, sondern von DataSet.Relations (was ebenfalls deutlich macht, dass es etwas völlig Anderes ist).

Jürgen

21.03.2010 - 10:45 Uhr

Wo ist das Problem, einen String als Ressource zu benutzen? Jürgen

21.03.2010 - 10:35 Uhr

Hallo und willkommen,

guckst du in :rtfm: DataRelation. Dann findest du u.a. Beispiele, am besten im Bereich Konstruktor: Für eine DataRelation werden die beteiligten Tabellen (per Name, also String) und die beteiligten Spalten (wahlweise als DataColumn oder Spaltenname oder auch als Arrays) angegeben.

Einfach noch etwas mehr in :rtfm: stöbern!

Gruß Jürgen

PS. Was glaubst du wohl, welchen Zweck das Unterforum Datentechnologien hat?

PS 2. Was macht wohl die folgende Zeile:

m_DataTableRelation = new DataTable(m_sTableRelation);

Du erzeugst eine neue DataTable? Wo ist denn der dort eingetragene Name festgelegt? Was hat eine neue DataTable mit einer DataRelation zu tun?

PS 3. Deine Variablennamen solltest du überdenken, siehe .NET Richtlinien für Namen. Unter anderem ist die ungarische Notation zu vermeiden.

21.03.2010 - 10:29 Uhr

Hallo Thomas,

eine wirkliche Erklärung habe ich nicht. Aber unter Steuerzeichen steht, dass es sich bei \x1C um einen FileSeparator handelt. Das könnte es erklären, warum dieses Zeichen unter verschiedenen Betriebssystemen unterschiedlich angezeigt wird.

Gruß Jürgen

20.03.2010 - 09:13 Uhr

Hallo Hendrik,

eine solche Änderung kann mit einem "normalen" SQL-Befehl an die DB geschickt werden:

CREATE OR REPLACE PROCEDURE ...

Das kannst du auch über DbCommand.ExecuteNonQuery erledigen. Also musst du den SQL-String nur irgendwie mit deiner Anwendung zur Verfügung stellen: direkt im Code einer Änderungs-DLL, als Ressource oder als externe Textdatei.

Gruß Jürgen

19.03.2010 - 14:00 Uhr

Die Erklärung von MarsStein ist korrekt. Dummerweise gibt es zu IsInputKey kein Beispiel.

Über die Forumssuche nach IsInputKey solltest du fündig werden; auch ein Beitrag hinsichtlich Escape klingt erfolgversprechend.

Gruß Jürgen

PS. Naja, wenn ein Standardverhalten einer Standardtaste beeinflusst werden soll, ist es zwangsläufig nicht ganz so einfach.

19.03.2010 - 12:36 Uhr

Hallo Michael,

unter :rtfm: Control.KeyDown heißt es u.a.:

Bestimmte Tasten , z. B. die EINGABETASTE, TAB und ESC sowie die Pfeiltasten, werden von Steuerelementen automatisch behandelt. Damit diese Tasten das KeyDown-Ereignis auslösen, müssen Sie in jedem Steuerelement des Formulars die IsInputKey-Methode überschreiben.

"In jedem" beschränkt sich bei dir vermutlich auf die eingebettete TextBox und möglicherweise das DataGridView selbst.

Gruß Jürgen

18.03.2010 - 11:46 Uhr

Ist es möglich die Items jeder Combobox Cell in einer Spalte einzeln zu setzen ? Oder ist sowas mit dem DGV garnicht machbar ?

Stimmt, so geht es überhaupt nicht. Die Items werden in der DGVComboBoxColumn gesetzt und automatisch an alle Cells weitergegeben.

Aber sollte es nicht mit DisplayMember, ValueMember, DataPropertyName der ComboBoxColumn funktionieren?

Wenn das nicht klappt und du nicht auf DataTable/DataSet umsteigen, sondern bei deiner List<> bleiben willst, fallen mir folgende Möglichkeiten ein:

  1. Du erstellst eine weitere Klasse, die eine DataRelation nachbildet und den Value deiner Klasse mit dem Anzeigetext des Werte-Mapping verknüpft. Die Anzeige und Auswahl kann dann so ähnlich gehen, wie unter DataGridView: Master/Detail über ComboBox beschrieben.

  2. Du erweiterst deine Klasse um die Mappings und eine weitere Eigenschaft, die den Wert als Text ausgibt. Wie du dann am einfachsten die Mappings gleichzeitig in die List<> und in die ComboBox als Items bekommst, kann ich mir allerdings noch nicht vorstellen.

Gruß Jürgen

18.03.2010 - 11:34 Uhr

Hallo und willkommen,

hat es einen besonderen Grund, warum du die Spalten bereits per Designer festlegst? Wenn du **AutoGenerateColumns **auf true setzt, werden die Spalten beim Zuordnen der DataSource automatisch erstellt und zugewiesen.

Gruß Jürgen

17.03.2010 - 16:32 Uhr

Verd..., benutze Parameter! Die Hochkommata sagen der Datenbank, dass dort ein String mit diesem Inhalt steht. In der DB stehen aber Date(Time)-Werte, die mit Sicherheit nicht diesen String-Inhalt haben. Ein DateTime ist kein String!

Mein obiger Code, zusammen mit zwei DateTime-Variablen, passt; alles andere ist mehr oder weniger falsch und führt dich, wie du merkst, immer in die Irre.

Jürgen

PS. Das wird b.a.w. mein letzter Beitrag zu dieser Frage sein. Wenn du dich mit deinen Überlegungen nicht bewegst, sehe ich keinen Sinn darin, weiter für dich nachzudenken.

17.03.2010 - 14:57 Uhr

Indem du die o.g. Tipps übernimmst: Arbeite mit **DirectoryInfo **und **FileInfo **sowie mit einer List<T>. Jürgen

17.03.2010 - 11:49 Uhr

Ergänzung zu Bernd:

So ungefähr geht es dann weiter:

DbCommand cmd = conn.CreateCommand();
...
conn.Dispose();

Alles, was mit einer Create-Methode erzeugt wird, ist dann Instanz einer passenden Klasse.

Gruß Jürgen

17.03.2010 - 11:23 Uhr

@Bernd
Er hat recht, das Code-Monster TableAdapter bezieht sich auf eine DbConnection usw. Das ist natürlich ein Grund mehr, auf das, was der Designer macht und versteckt, zu verzichten.

@chanderegg
Du kannst trotzdem DbDataAdapter.Fill verwenden, wie es Bernd vorschlägt. - Es genügt nicht, die DbConnection per Close zu schließen, sondern sie soll auch per Dispose aufgelöst werden. Besser noch: man kapselt sie in einem using-Block, dann geht beides automatisch.

Aber das hat mit dem Problem nichts zu tun. Bernd hatte schon vorgeschlagen, den String selbst (Variable a1) zu untersuchen. Wie wird dort eine Zeile beendet? Environment.NewLine? Nur '\r'? Nur '\n'? Oder etwa '\0' (wer weiß denn, woher der String ursprünglich kommt)? Letzteres wäre eine Erklärung für das Abschneiden des restlichen Textes. Benutze doch mal IndexOfAny oder so.

Jürgen

17.03.2010 - 11:12 Uhr

TextRenderer.MeasureText

Jürgen

/Edit
herbivore hat recht. Ich hatte nicht suchen wollen, sondern habe nur das, was mir sofort eingefallen war, aufgeschrieben.

17.03.2010 - 10:19 Uhr

Hallo,

unter :rtfm: OracleType-Enumeration lese ich:

LongVarChar
Ein Oracle-LONG-Datentyp, der eine Zeichenfolge mit variabler Länge und einer Maximalgröße von 2 Gigabyte enthält. Verwenden Sie in Value den .NET Framework-String-Datentyp oder den OracleClient-OracleString-Datentyp.

Also musst du es natürlich als String übernehmen. Das machst du ja, auch wenn das ToString beim Reader eher seltsam aussieht (aber dazu unten mehr). Der Wert kommt damit in der DataTable wirklich als String an, und zwar in der tatsächlichen Länge.

Kann mir jemand von euch sagen, wie ich es schaffe, dass der ganze String ins DataSet kommt?

Woran glaubst du zu erkennen, dass nur ein Teil in der DataTable landet? DataGridView, Debugger oder was auch immer? Nach deinem Code wird immer der ganze String geliefert.

Die Probleme lösen sich vielleicht auf, wenn du Datenbank und DataSet so verbindest, wie es gedacht ist. Du hast Alternativen:
* Benutze für das Ziel "DataTable" nicht ExecuteReader, sondern DbDataAdapter.Fill.
* Oder benutze DataTable.Load(myReader).
Auf jeden Fall solltest du nicht alle Daten per ToString übernehmen, sondern die korrekte Get-Methode.

Zusätzlich weise ich dich auf [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen hin. Dein Code sieht so aus, als ob du eine dauerhafte Connection benutzt, das wäre sehr schlecht.

Gruß Jürgen

17.03.2010 - 08:45 Uhr

Nach ein bisschen rumprobieren mit div. Events bin ich draufgekommen, dass anscheinend die letzte Row in meinem DataGridView aus irgendeinem Grund nie den RowState "Modified" bekommt.. sehr seltsam...
Weis jemand vielleicht wie das zustandekommen kann ?

Der DataRowState wird automatisch dann geändert, wenn vom DataGridView aus der "Cursor" auf eine andere Zeile gesetzt wird. Wenn du immer "von oben nach unten" wanderst, kommst du von der letzten Zeile aus nicht weiter; also merkt das DGV nichts davon, dass die aktive Zeile sich ändern soll.

Lösung: Vor dem Speichern (d.h. das Übertragen in die DB) ist DataGridView.EndEdit oder BindingSource.EndEdit aufzurufen.

Unabhängig davon stimme ich ErfinderDesRades zu: Bewusstes Speichern ist in der Regel besser (freundlicher zum Nutzer und zum Programmierer) als automatisches.

Gruß Jürgen

16.03.2010 - 16:40 Uhr

Das stimmt ich arbeite das erste mal mit einer Datenbank...und Blicke da nochnicht so durch.

Ich habe auf Datentypen hingewiesen. Das hat zwar auch etwas mit Datenbanken zu tun, gilt aber generell für die EDV, siehe z.B. [Wikibooks] Datentypen und die folgenden Kapitel, vor allem auch Andere Typen. Wenn ein DateTime verlangt wird, muss ein DateTime geliefert werden und kein String, wie du es auch in deinem letzten SELECT-Code wieder versucht hast.

Was ist wenn ich nach einer bestimmten Zeit filtern will die Variable Start und End muss ja irgendwie deklariert werden

Natürlich, irgendwo in deinem Programm. Wir wissen aber überhaupt nicht, wann, wo und wie du diese Zeiten festlegen willst. Wenn es über zwei DateTimePicker geschieht, dann geht es z.B. so:

// startDatePicker als DateTimePicker für das Datum
// startTimePicker als DateTimePicker für die Uhrzeit
DateTime start = startDatePicker.Value.Add(startTimePicker.Value.TimeOfDay);

So, jetzt hast du deine Startzeit.

Aber die ganzen Fragen und Nachfragen lassen mich an den Grundlagenkenntnissen zweifeln. Hast du dich mal von Anfang an, z.B. mit 🛈 in C# eingearbeitet? Jürgen

@xxMUROxx
Das war wohl nur ein Copy&Paste-Fehler, im Text hat er es richtig beschrieben. Ich bin mir ziemlich sicher, dass es an der String-Darstellung des DateTime liegt.

16.03.2010 - 14:08 Uhr

Hallo,

DataSet und DataTable sind keine Elemente von SQL-Datenbanken, sondern .NET-Klassen. Du darfst also die Funktionalitäten einer SQL-Datenbank nicht mit denen eines (typisierten) DataSet vermischen.

JOIN ist eine Sache des SELECT, wie Daten von einer DB geholt werden. Das Ergebnis eines SELECT (egal ob aus 1 oder aus 20 Tabellen gemischt) ist immer eine Datenmenge, die ggf. (je nach Verfahren) in einer DataTable landet. Ein DataTable.Select ist etwas ganz anderes; das kann sich auch immer nur auf die bereits vorhandene DataTable beziehen.

Deine Hauptfrage lautet ja nun:

Wie mache ich ein join, wie kann ich über mehrere Datenbanken Abfragen schreiben?

Die Antwort ist ganz eindeutig keine Angelegenheit von .NET (oder C#), sondern eine von MS-SQL. Informationen dazu findest du unter SQL-Server. Vielleicht hilft dir auch Einführung in SQL, beginnend mit dem Kapitel über "Mehrere Tabellen".

Gruß Jürgen

PS. Fragen zu Datenbanken gehören ins Unterforum Datentechnologien. [EDIT=herbivore]verschoben[/EDIT]

PS2. Vielleicht bietet Linq Möglichkeiten, um DataTables zu verknüpfen. Dazu habe ich aber (noch) keine Ahnung.

16.03.2010 - 12:54 Uhr

MenuItem != ToolStripItem

Jürgen

16.03.2010 - 11:32 Uhr

Start- und Endezeit wirst du doch wohl nicht als Konstante im Quellcode haben, sondern aus DateTime-Variablen holen.

Diese **Variablen **sind zu verwenden, darauf bezieht sich auch tabstop.

kommt das Datum rein in dem Format z.B "15.02.2010 14:30"

Eine solche Formulierung deutet darauf hin, dass du das Thema "Datentypen" noch nicht verstanden hast. Ein DateTime ist ein DateTime ist ein DateTime; das Format zeigt nur eine String-Darstellung eines DateTime-Wertes. Relevant ist aber niemals (NIEMALS!) irgendeine String-Darstellung, sondern immer der Wert an sich.

Jürgen

16.03.2010 - 11:29 Uhr

Hallo und willkommen!

Eine Datei besteht niemals aus Spalten (das sieht höchstens so aus), sondern allenfalls aus Zeilen. Du musst also zunächst die Datei zeilenweise einlesen und die einzelnen Zeilen analysieren. Zum Einlesen gibt es sehr viele Varianten; die praktischste dürfte File.ReadAllLines sein.

Zum Verarbeiten bzw. Auswerten von Textzeilen bietet die String-Klasse viele Möglichkeiten, vor allem **IndexOf **und **Substring **mit vielen Überladungen. Unter Umständen ist auch **Split **hilfreich.

Um aus Textteilen Zahlen zu machen, gibt es (natürlich) ebenfalls viele Möglichkeiten. Die sicherste ist int.TryParse; bei einer solchen Textdatei würde ich die Alternative int.Parse gar nicht erst versuchen (und Convert.ToInt32 ist nichts anderes).

Da du den Aufbau einer einzelnen Zeile nicht genauer angibst, musst du selbst in :rtfm: blättern, was für dich am besten passt. Aber dieses eigene Suchen hilft dir auf Dauer sowieso am meisten.

Gruß Jürgen

PS. Keine Doppel-Posts, siehe Wie poste ich richtig? Punkt 2.2; Begründung steht dort - komm mir also nicht mit "ich wollte mehrere Erfahrungen bekommen".

16.03.2010 - 09:57 Uhr

Natürlich mit WHERE und unbedingt mit Parametern! Start- und Endezeit wirst du doch wohl nicht als Konstante im Quellcode haben, sondern aus DateTime-Variablen holen. Dafür ist dieses Verfahren vorgesehen:

SELECT dtTime, lError, strPartNumber FROM dbo.V_PICKUPERROR6
 WHERE dtTime BETWEEN @Start AND @End;
using(SqlConnection conn = new SqlConnection(connectionString) ) {
   SqlCommand cmd = new SqlCommand(sqlString);
   cmd.Parameters.AddWithValue("@Start", startDateTime);
   cmd.Parameters.AddWithValue("@End", finalDateTime);
   dataAdapter = new SqlDataAdapter();
   dataAdapter.Connection = conn;
   dataAdapter.SelectCommand = cmd;
   // usw.
}

Zu den Parametern siehe [Artikelserie] Parameter von SQL Befehlen, zum using-Block siehe [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen.

Gruß Jürgen

/Edit: Fehlerhinweis von xxMUROxx übernommen; so geht das mit Copy&Paste.

16.03.2010 - 08:52 Uhr

Hallo,

Ein solches DB-Modell ist durchaus sinnvoll. Auf SubSelects solltest du, wenn es irgend geht, immer verzichten; das läuft in aller Regel langsamer ab.

Per JOIN ist es ohne Weiteres möglich. Genauso wie du eine Tabelle mit sich selbst verknüpfen kannst, kannst du auch TabA zweimal mit TabB verknüpfen; du musst dann nur Tabellen-Aliase verwenden. Mehr dazu siehe z.B. Einführung in SQL und die folgenden Kapitel.

Aber JOIN ist nur dann sinnvoll, wenn die Ergebnismenge wirklich und für alle Zeit nur angezeigt werden soll (im DGV). Wenn daraus auch Bearbeitung und Speicherung entstehen sollen, ist dringend davon abzuraten, weil das nur durch umfangreiche manuelle Vorarbeit möglich ist (z.B. DbCommandBuilder geht dann nicht).

Das vermutlich schönste Verfahren sind zwei **DataRelations **(= ForeignKeys) auf die gleichen Tabellen. Da sie sich auf verschiedene Spalten der Aufträge-Tabelle beziehen, sollte es keine Probleme geben. Dann kann das DGV mit ComboBox-Spalten versehen werden.

Gruß Jürgen

15.03.2010 - 20:16 Uhr

Hallo,

im Form-Konstruktor wird InitializeComponent aufgerufen. Das führt alles das aus, was der Designer als Code vorbereitet hat. Danach kannst du alle Controls und Einzelheiten "überschreiben", z.B. EventHandler manuell anhängen oder abhängen, Control.Text ändern, neue Controls erzeugen und hinzufügen usw.

Auch zum TableAdapter gehört ein Designer sowie entsprechender Code, deshalb wurde das für WinForms als Beispiel bezeichnet.

Gruß Jürgen

15.03.2010 - 20:10 Uhr

Hallo und willkommen,

damit keine Missverständnisse aufkommen: ADO ist etwas anderes als ADO.NET; und zu .NET gehört natürlich ADO.NET. Die speziellen DbProvider sind nicht etwas anderes als ADO.NET von Microsoft, sondern sind Ergänzungen, damit die Db-Klassen auf die Besonderheiten eines DBMS besser abgestimmt sind.

Beispiel: DbConnection ist die Basisklasse für eine DB-Verbindung. Davon abgeleitet werden z.B. OledbConnection, SqlConnection (für MS-SQL), FbConnection usw.

Wenn du dir eine Factory schreiben willst, dann suche einmal nach O/R-Mapper, das sind genau solche "Dinger", die den "gemeinsamen" Zugriff auf verschiedene DBMS regeln können.

Gruß Jürgen

15.03.2010 - 08:34 Uhr

(Und damit ihr mit der Suche mehr Erfolg habt, solltet ihr den Namen richtig schreiben: Pythagoras (nebenbei: mit Betonung auf dem ersten a). Das gilt erst recht, wenn der passende Wiki-Link gebracht wird (mit einem zweiten Schreibfehler). Jürgen){gray}

14.03.2010 - 23:23 Uhr

Hallo,

ich hatte so etwas einmal versucht. Es war zwar möglich, aber eher unübersichtlich, wie diese verschachtelten Tabellen verarbeitet werden. Es war erheblich leichter möglich, die "inneren" Tabellen herauszuholen, als "parallele" normale Tabellen zu definieren und per ForeignKey (= DataRelation) die Verbindungen herzustellen.

Gruß Jürgen

12.03.2010 - 15:33 Uhr

Na und? Alles, was der Designer mit DataSet fabriziert, kann auch manuell im Code geschrieben werden. Das Code-Monster TableAdapter muss es ja nicht sein; ein typisiertes DataSet kann auch halbautomatisch aus einer xsd-Datei erzeugt werden. Dann hat man jederzeit den vollen Überblick über alles, was abläuft; nichts wird im Hintergrund versteckt.

Alles frisch ans Werk und viel Erfolg! Jürgen

12.03.2010 - 12:26 Uhr

Fehlermeldungen sollten hier direkt angegeben werden. Du kannst einen Dateianhang hinzufügen; schöner ist aber das direkte Zitat - siehe dazu [Tipp] Strg-C kopiert MessageBox-Inhalt.

Die Fehlermeldung ist aber genau genug. Schon in den Zeilen 2 und 3 wird darauf hingewiesen, dass die Configuration nicht in Ordnung ist, nämlich Oracle doppelt eingetragen wurde. Du musst also machine.config und app.config überprüfen und dort einen Fehler beseitigen. Informationen dazu bekommst du über :rtfm: **Computerkonfigurationsdateien **und viele Links von dort aus.

Gruß Jürgen

12.03.2010 - 11:21 Uhr

Hallo und willkommen,

was ist "mdb"? Access oder etwas anderes? (Ich arbeite selbst nicht so intensiv mit Office.)

Wenn du weißt, dass du an dieser Stelle eine Exception bekommst, dann frag sie doch mit try-catch und ex.ToString detailliert ab (ex.ToString liefert mehr Informationen als ex.Message). Ausgerechnet die Lösung bei TypeInitializationException ist oft etwas knifflig, sodass wir mehr Informationen benötigen.

Gruß Jürgen

PS. Bitte benutze die Vorschau und achte darauf, dass der Beitrag nicht zu breit wird. Nicht alle Nutzer haben 1920x1600-Bildschirme, und horizontales Scrollen ist lästig.

11.03.2010 - 09:02 Uhr

man kann alles mit ... in einen string umwandeln.

Eben, das ist so grundlegend, dass es sich verbietet, eine solche Frage überhaupt zu stellen (zumal nach 4 Wochen Arbeit mit C#), siehe Wie poste ich richtig?; ebenso verbietet es sich, darauf konkret zu antworten. Nur ein Hinweis wie der von Lothi ist zulässig. Wenn herbivore dies gesehen hätte, wäre die Frage sofort geschlossen worden. Jürgen

11.03.2010 - 08:59 Uhr

Die **BindingSource **ist auch die richtige Vorgehensweise: Die bietet die Navigation durch die Datenmenge; der "aktuelle Satz" wird durch die BindingSource bestimmt und wirkt sich dann auf alle angebundenen Controls aus.

BindingSource bs = new BindingSource();
bs.DataSource = (DataSet);
bs.DataMember = "DataTable";
dgv.DataSource = bs;
textBox.DataBindings.Add(new Binding("Text", bs, "Spalte"));

Gruß Jürgen

PS. Ich empfehle gerade, nicht alles von TableAdapter erledigen zu lassen. Bei diesem Code-Monster blickt man kaum durch; das Verständnis wird durch eigene Arbeit und eigenes Nachdenken erheblich gefördert.

10.03.2010 - 19:43 Uhr

Hallo und willkommen!

Die SDK-Doku ist das allerwichtigste Hilfsmittel, siehe [Hinweis] Bitte schau in die SDK-/MSDN-Doku - ganz am Ende stehen noch ein paar nützliche Links.

Eine kurze Möglichkeit lautet: Im Code-Editor von VS bzw. #D den Namen einer Klasse oder einer Variablen tippen, dann den Punkt und kurz warten - dann werden Varianten, wie es weitergehen könnte, angezeigt.

Gruß und viel Erfolg! Jürgen

10.03.2010 - 11:09 Uhr

Das deutet m.E. darauf hin, dass irgendwo noch ein Rest-Code eines Ereignisses (BindingSource.ListChanged o.a.) herumliegt, der den Eintrag der TextBox leert. Du musst wohl alle Quelldateien (vor allem die Designer-Dateien) durchwühlen und Referenzen auf die betreffende Textbox suchen.

Jürgen

09.03.2010 - 13:56 Uhr

Hallo Annett,

an dem bisher gezeigten Code kann das nicht liegen. Was passiert denn danach?

Die aktuelle DataRow erhält man z.B. so und daraus dann die ID:

DataRow row = dgv.CurrentRow.DataBoundItem as DataRow;
int id = (int)row["ID"];

Nebenbei:

  1. Das Ding heißt hoffentlich nicht dataGridView1, siehe .NET Richtlinien für Namen.
  2. Noch besser wäre es, wenn die DbConnection in einen using-Block eingeschlossen würde.
  3. Wenn du die Abfrage in eine DataTable leitest, warum verwendest du dann nicht DbDataAdapter.Fill? Das macht es um vieles einfacher. Oder es geht auch DataTable.Load(DbDataReader).

Gruß Jürgen

09.03.2010 - 12:20 Uhr

Hallo und ebenfalls willkommen!

Beachte außerdem:

ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.

Jürgen

09.03.2010 - 08:54 Uhr

Tut mir leid, aber auch wenn du noch mehrmals nachfragen solltest: Du wirst keine bessere Antwort bekommen als die von FZelle. Das DataGridView dient, wie schon der Name sagt, dazu, Daten in einem Grid zur Anzeige zu bringen. Wenn die Daten manipuliert werden sollen (und es sei auch nur zur Sortierung), sind die Daten zu bearbeiten und nicht das Grid. Du brauchst also eine Daten-Klasse - fertig. Ob das wirklich DataTable ist oder eine BindingList<eigene Klasse< oder noch etwas anderes, ist zweitrangig; aber eine separate Daten-Klasse ist nötig.

Wenn man - wie du - die Daten direkt in das DGV schreibt, stößt man früher oder später (eher früher als später) an solche Grenzen, die das ganze (eigene) Konzept fragwürdig werden lassen. Also nimm dir die Empfehlung zu Herzen:

Packe deine daten in ein DataTable oder eine BindingList,

Gruß Jürgen

08.03.2010 - 16:48 Uhr

Du hast anscheinend noch nicht verstanden, wie .NET mit Datenbank, DataTable und GUI (vertreten durch das DGV) arbeitet. Der Insert-Befehl schickt irgendetwas an die Datenbank; dann weiß die Datenbank Bescheid, aber DataTable und GUI sind davon nicht betroffen. Wenn die DataTable geleert wird, sind die Daten im Arbeitsspeicher weg (und das DGV hat nichts mehr zum Anzeigen), aber die Datenbank ist davon nicht betroffen.

In dieser Form kann man sich noch andere Situationen erklären; auch die Reihenfolge der Befehle spielt dabei eine Rolle.

Du musst nur die Maßnahmen richtig kombinieren: Änderungen wie ein Insert werden in der DataTable vorgenommen; dann weiß die GUI (DGV) sofort Bescheid. In die Datenbank wird danach (oder irgendwann später) alles durch DataAdapter.Update übertragen und aktualisiert.

Hast du schon einmal eine Einführung in ADO.NET durchgearbeitet, z.B. 🛈 Kap.25 ff.?

Jürgen

PS. Merkst du, dass dein Problem eigentlich fast nichts mit dem DataGridView zu tun hat? Es gehört nicht in das Unterforum "Windows Forms", sondern zu "Datentechnologien".