Laden...

Forenbeiträge von juetho Ingesamt 3.331 Beiträge

30.11.2009 - 15:29 Uhr

Hallo,

in der IDE per Designer geht es wie bei jedem anderen Control auch: Element auswählen, Eigenschaften-Fenster nach Ereignisse wechseln, Ereignis auswählen, Code hinzufügen.

Wie es per Code (ohne Designer) geht, steht in :rtfm: ToolStripButton-Klasse im Beispiel.

Wie du siehst, wird empfohlen, statt ToolBar mit **ToolStrip **zu arbeiten.

Gruß Jürgen

26.11.2009 - 15:49 Uhr

wie ich einer Zelle machen kann

Was für ein unverständlicher Satzbau... Und was du nur mit Zellen hast: Denkst du Monopoly: "Gehe in das Gefängnis..."? 8)

Bei Datenbanken spricht man von Zeilen, Spalten und einzelnen Werten. Deine Formulierung lässt mich befürchten, dass du zuerst an etwas wie das DataGridView denkst. Von dieser Denkweise solltest du dich schleunigst verabschieden: Wenn es dir um die Daten geht, dann befasse dich ausschließlich mit den Daten-Klassen; wenn es dir um das UI geht, dann darf etwas wie das DGV behandelt werden.

Zu deiner Frage siehe :rtfm: DataTable.ColumnChanged-Ereignis. Das Beispiel zeigt sehr schön, wie die einzelnen Werte von **DataColumnChangeEventArgs **abgefragt werden können.

Jürgen

26.11.2009 - 11:39 Uhr

Die Forumssuche nach update foreignkey* liefert mir ein paar Ergebnisse; vielleicht findest auch du nützliche Hinweise. Jürgen

26.11.2009 - 11:32 Uhr

Die entscheidende Information verschweigst du uns: Um welches Datenbanksystem handelt es sich? Denn der TableAdapter kann nur solche Informationen herausgeben, die er von der DB bekommt.

Wenn du die Diskussion im richtigen Unterforum Datentechnologien erstellt hättest, wärest du direkt auf die Frage nach dem DBMS hingewiesen worden. Beim MS-SQL Server hilft die Suche nach SELECT @@IDENTITY.

Was der TableAdapter ansonsten noch kann, weiß ich nicht, weil ich ihn nicht benutze. Gruß Jürgen

26.11.2009 - 11:25 Uhr

Für so etwas gibt es Ereignisse, auch bei DataTable. Jürgen

25.11.2009 - 11:34 Uhr

Such einmal nach Parser. Jürgen

24.11.2009 - 12:13 Uhr

Diese Formulierung halte ich schon für ziemlich dreist:

... also bin ich halt "unhöflich".

Hast du die Erläuterung unter Wie poste ich richtig? Punkt 2.2 durchgelesen? Offensichtlich nicht, sonst würdest du dich wenigstens entschuldigen und ankündigen, dass du dich künftig "richtig" verhalten willst.

Jürgen

24.11.2009 - 11:25 Uhr

Wie poste ich richtig? Punkt 2.2

Mehrfach-Post: siehe hier und hier

Jürgen

23.11.2009 - 13:55 Uhr

Hallo,

du solltest dir vor allem abgewöhnen, Daten direkt ins DataGridView zu schreiben. Daten gehören in Daten-Klassen, z.B. eine DataTable; das DGV dient "nur" dazu, diese Daten dem UI zur Verfügung zu stellen.

Dann hast du nämlich auch keine Probleme, die Daten an Excel zu übergeben; das geht mit einer OledbConnection, die sich die Daten aus der DataTable holt.

Jürgen

23.11.2009 - 09:09 Uhr

zu 1. Das sinnvollste Verfahren wäre eine DataGridViewNumericColumn. Wie bei einer ComboBoxColumn wird dabei ein NumericUpDown eingebettet. Wie das zu realisieren ist, steht in :rtfm: Gewusst wie: Hosten von Steuerelementen für eine CalenderColumn oder in den Snippets für MaskedTextBox in einer DataGridViewColumn oder DateTimePickerColumn im DataGridView

zu 2. Im Moment fällt mir nichts Passendes ein.

Gruß Jürgen

23.11.2009 - 09:01 Uhr

Hallo,

informiere dich mal über :rtfm: ConfigurationSectionGroup; das entspricht einer ini-Section am ehesten. Da eine config-Datei aber beliebig verschachtelt sein kann, hat man überhaupt keine Probleme, Einstellungen zu speichern. Im Gegenteil: Die config-Dateien sind erheblich flexibler, siehe z.B. den Hinweis:

Eine ConfigurationSectionGroup kann auch andere ConfigurationSectionGroup-Objekte enthalten, auf die über die SectionGroups-Eigenschaft zugegriffen werden kann.

Gruß Jürgen

20.11.2009 - 19:39 Uhr

Hallo,

zum Compact Server gehören die Klassen aus dem System.Data.SqlServerCe Namespace; wie sie heißen, sagt Khalid. Wenn man den falschen DbProvider nimmt, gibt es eher kryptische Fehlermeldungen.

Gruß Jürgen

20.11.2009 - 11:37 Uhr

Wir haben vor einigen Tagen einen :::

Hast du dich hier verschrieben?

Hast du den NET-OdbcProvider versucht, wie unter ConnectionStrings beschrieben?

Gruß Jürgen

20.11.2009 - 11:32 Uhr

Den entscheidenden Hinweis hat Jack gegeben. Ich möchte noch auf zwei andere wesentliche Punkte hinweisen, die mit dem Problem selbst nichts, aber mit der Anwendung insgesamt viel zu tun haben.

  1. Statt Convert.ToDecimal solltest du besser Decimal.TryParse verwenden. Was passiert bei dir denn, wenn der Anwender etwas Unzulässiges eingegeben hat?

  2. Die Art, wie du Update eingebaut hast, lässt mich vermuten, dass du einen schon existierenden DataAdapter benutzt, zu dem eine Connection dauerhaft geöffnet ist. Das wäre ziemlich ungünstig, siehe z.B. [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

Gruß Jürgen

20.11.2009 - 11:24 Uhr

Siehe :rtfm: Environment.SpecialFolder-Enumeration.
Entschuldige, da war ich mir so sicher, dass ich meine Antwort nicht kontrolliert habe. Aber von Daniel kam ja jetzt die richtige Lösung.

Jürgen

18.11.2009 - 11:11 Uhr

Hallo Da_Flo,

nein, Bernd meint den DataRowState von DataTable.Rows[n].

Aber ich kann überhaupt nicht erkennen, wie die Daten aus dem DataAdapter in das DataGridView und zurück kommen. Werden die Daten etwa direkt ins DGV gefüllt? Das wäre ziemlich unüblich (um nicht zu sagen Quatsch, gefährlich, abwegig).

Du verschweigst uns noch, welche Spalte für den PrimaryKey benutzt wird. Das ist nach der Fehlermeldung eine äußerst wichtige Information.

Sollte es _Artikel _sein? Bei deinem INSERT-Befehl benutzt du eine Variante, bei der alle Spalten befüllt werden sollen. Woher kommt der Wert für "Artikel"?

Außerdem ist es eher widersinnig, bei manchen Spalten Parameter zu verwenden und bei anderen nicht. Ausgerechnet die Kontaktnummer (was nach Zahl aussieht) wird in Hochkommata gesetzt. 8o

Du solltest alles nochmals gemäß [Artikelserie] Parameter von SQL Befehlen überprüfen.

Jürgen

18.11.2009 - 09:43 Uhr

Ayke hat auf einen wichtigen Punkt hingewiesen. Es wundert mich, dass der Compiler das akzeptiert.

Aber laut Fehlermeldung stößt er sich an der nächsten Situation: Im if-Zweig gibt es eine Zuweisung, im else if-Zweig ebenfalls. Aber im dazu gehörenden letzten else-Zweig fehlt sie. Das ist vermutlich der Grund dafür, dass der Compiler glaubt, dass der Variablen noch nichts zugewiesen wurde.

In einer solchen Situation sollte die Anfangszuweisung auf **null **gesetzt werden. Dann weiß der Compiler auf jeden Fall Bescheid.

Nachtrag:

Es ist eine Zeichenfolge von Zahlen getrennt mit ","! z.b. so: 22, 13,621,15,34, usw..

Nein, dein Hinweis passt nicht zur Situation. Wo wird dieser String benutzt? Genaue Angaben bitte!

string[] strTaskIDArray = new String;

Das erzeugt einen neuen String (ohne jede Zusatzinformation) und weist diesen einem String-Array zu. Wie soll das funktionieren?

Übrigens werden Strings nicht auf Gleichheit mit einem leeren String geprüft, sondern mit String.IsNullOrEmpty
.
Gruß Jürgen

18.11.2009 - 09:29 Uhr

Hallo,

diese Situation deutet auf schlechtes Datenbank-Design hin. Eine Spalte, die den PK darstellt, sollte in aller Regel keine andere Bedeutung haben. Dem widerspricht es, wenn die Art der Reihenfolge eine Rolle spielt.

Grundsätzlich kann mit **COLLATE **die Sortierung auch bei jeder Abfrage eingestellt werden, z.B.:

ORDER BY <Spalte> COLLATE <Collation-Name>

Ob Access das unterstützt und ggf. mit welchen Begriffen, musst du selbst recherchieren. (Die MSDN streikt im Moment.)

Gruß Jürgen

17.11.2009 - 14:02 Uhr

Dort, wo du DataGridView.DataSource festgelegt hast.

Es ist meistens Quatsch, ein DataSet im Zusammenhang mit dem DataAdapter zu deklarieren. Das DataSet ist ein Objekt, dessen Struktur schon beim Form-Load o.ä. erstellt und zugewiesen wird. Durch den DataAdapter erhält es nur noch Inhalte.

Beim Speichern, d.h. bei DataAdapter.Update, wird einfach der Verweis auf das einmalig erstellte DataSet bzw. die jeweils relevante DataTable genommen.

Jürgen

PS. Der Hinweis auf "falscher Post" besagt: Im Debugger kannst du selbst feststellen, welches DataSet (Name, Inhalt) jeweils benutzt wird. Wenn du das nicht merkst, hast du den Debugger nicht (bzw. nicht ausreichend) benutzt.

10.11.2009 - 18:07 Uhr

gibt es dafür bestimmte operationen / einstellungen die ich double.parse mitgeben kann?

Wie gfoidl schon sagte:

Eigentlich steht alles in der Referenz zu Double.Parse

Du musst nur daran denken, dass es nicht nur eine Version gibt, sondern mehrere Überladungen. Jürgen

05.11.2009 - 15:38 Uhr

Ich meinte gelesen zu haben, dass es Transactions in Access nicht gibt. Jürgen

05.11.2009 - 12:34 Uhr

Verbesserungsvorschlag: Benutze File.ReadAllLines; dann stehen alle Zeilen für sich in einem Array und du sparst dir das Fummeln mit einzelnen Zeilen, Zeilenumbruch usw. Damit wird vieles einfacher und vermeidet Fehler.

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

05.11.2009 - 12:28 Uhr

Hallo,

ich habe folgende Gedanken:

  1. Ist es möglich, den Primärschlüssel zu deaktivieren? Dann könntest du das machen, die Datensätze ändern und dann den Primärschlüssel wieder zu aktivieren.

  2. Nach dem Fill werden die Datensätze in der DB gelöscht; mit Update sollen sie wieder eingefügt werden. Dann musst du natürlich auf den **DataRowState **achten.

  3. Dass das Ganze sehr lange dauert, ist mit **Transaction **wesentlich zu verbessern. Ich habe nicht bedacht, dass es um Access geht.

wird es mit den ständigen Updates

Das ist doch wohl trotzdem eine einmalige Aktion, oder?

Gruß Jürgen

05.11.2009 - 11:47 Uhr

Das geht mit den "normalen" Verfahren von [FAQ] Kommunikation von 2 Forms: Du weißt doch, von wo aus dein LoadingForm erzeugt und angezeigt wird; von dort aus kannst du es auch schließen.

Jürgen

05.11.2009 - 09:00 Uhr

Der Nutzer schreibt die Daten ja direkt ins DGV. Wird das an die Daten-Tabelle weiter gegeben? Bzw kann man das abgleichen?

Du solltest dich mal mit den Grundsätzen der Datenverarbeitung unter NET befassen. Kurz gesagt, gehören Daten in Daten-Klassen, z.B. DataTable, und nicht in GUI-Klassen wie das DGV. Der "Abgleich" geschieht durch die Datenbindung weitestgehend automatisch; allenfalls ist ein EndEdit nötig, damit auch die letzten Änderungen im aktuellen Datensatz übernommen werden.

Jürgen

02.11.2009 - 08:49 Uhr

Hallo,

warum es bei dir nicht klappt, kann ich nicht sagen und will es auch nicht nachprüfen. Mich wundert aber, warum du es nicht viel einfacher machst:

  1. "+=" bei Strings ist gelinde gesagt suboptimal, weil ein String unveränderlich ist. Bei dieser Operation wird der String ständig (bei dir also für jedes einzelne Zeichen) umkopiert. Wenn überhaupt, sollte **StringBuilder **verwendet werden.

  2. Für diesen Zweck gibt es aber String.Replace.

  3. Die Zeilenumbrüche sind einfacher durch Environment.Newline oder einzeln durch '\r' sowie '\n' zu erkennen; das ständige Vergleichen per String.Format als Hex-Darstellung - ich weiß ja nicht.

  4. Zum Speichern gibt es die einfache Variante File.WriteAllText, wie auch herbivore sagt.

Gruß Jürgen

31.10.2009 - 17:03 Uhr

Für diesen Zweck ist die **BindingSource **vorgesehen: Gib ihr die DataTable als Quelle und hänge sie als DataSource sowohl an das DataGridView als auch an die TextBox. Sie berücksichtigt automatisch den Zeilenwechsel; lediglich vor dem Update Richtung Datenbank ist BindingSource.EndEdit einzufügen.

Gruß Jürgen

29.10.2009 - 18:53 Uhr

Seltsamerweise heißt die passende Methode weder Copy noch Clone, sondern ImportRow. Aber auf den PK musst du aufpassen.

Dein Versuch klappt auch deshalb nicht, weil "newRow" nur "neu" heißt, aber tatsächlich keine neue Zeile erzeugt.

Jürgen

29.10.2009 - 08:44 Uhr

Muss ich evtl der BindingSource mitteilen dass sich der Eintrag geändert hat?

Wenn du schon selbst diese Idee hast, dann schau in :rtfm: **BindingSource **nach; dort gibt es eine Methode, die genau dieses Problem regelt:

Wendet ausstehende Änderungen auf die zugrunde liegende Datenquelle an.

(Na gut, über die Formulierung "wendet an" könnte man streiten.) Hintergrund ist, dass eine "manuelle" Änderung erst dann automatisch übernommen wird, wenn der Datensatz gewechselt wird; wenn das nicht sowieso möglich ist, ist die o.g. Methode zu verwenden.

Wenn ich jedoch nun TableAdapter.Update(mydataset), oder TableAdapter.Update(mydataset.mytable) aufrufe, bleibt die Datenbank unberührt.
Die Methode liefert mir auch immer 0 zurück (Schätze das ist die Anzahl der geänderten Datensätze?)

Bei :rtfm: DbDataAdapter.Update findest du das als Erklärung des Rückgabewertes; das TableAdapter.Update "versteckt" das nur.

Zum Rest kann ich nichts sagen, weil ich weder mit TableAdapter noch mit Access arbeite. Jürgen

28.10.2009 - 08:59 Uhr

Bitte lies zunächst einmal [Artikelserie] Parameter von SQL Befehlen durch, damit du verstehst, worum es geht. Du sollst nicht irgendeinen Code per Copy & Paste übernehmen, sondern es richtig lernen.

  1. Bei deinem ersten Command fügst du mit Parameters.AddWithValue ausdrücklich einen String ein. Damit bleibt das gleiche Problem mit der Übergabe eines Strings an MySql wie vorher bestehen. Stattdessen sollst du eine DateTime-Variable verwenden:
DateTime myDate = DateTime.Today.AddHours(10);
MYSQL_Command.Parameters.AddWithValue("Datum", myDate);
  1. Kontrolliere in dem Artikel, wie bei Deinem MySql-Provider Parameter einzufügen sind: Fragezeichen, Doppelpunkt, Klammeraffe.

  2. Auch beim INSERT-Befehl ist genauso mit Parametern zu arbeiten.

  3. Gleichheit bei DateTime zu prüfen ist riskant. Du musst bereits bei den Werten, die gespeichert werden, genau darauf achten, ob sich nicht vielleicht Sekunden und Bruchteile einschleichen.

Außerdem machst du den Grundfehler, eine DbConnection dauerhaft zu verwenden. Siehe dazu [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen.

Gruß Jürgen

27.10.2009 - 08:56 Uhr

Ebenfalls sollten Tabellen immer im Plural geschrieben werden, da eine Tabelle ja mehrere Daten enthält.

Das lese ich aber sehr oft genau andersherum: Der Tabellenname sollte immer im Singular geschrieben werden; denn es ist einfacher, von einem "User" zu sprechen statt von einem "Datensatz aus Users".

Wobei man auf jeden Fall vermeiden sollte, reservierte Wörter wie USER als Tabellen- oder Spaltennamen zu verwenden.

Gruß Jürgen

26.10.2009 - 08:54 Uhr

Access to external file "file.txt" is denied by server administrator

Das sieht doch nach einem einfachen Zugriffsfehler ist. Du brauchst natürlich Schreibrechte in dem entsprechenden Verzeichnis; wenn das nicht angegeben ist, wird das aktuelle Arbeitsverzeichnis genommen, und was das gerade ist, kann meistens gewürfelt werden.

Muss ich meine Datensätze auf 10 bzw. 20 zeichen auffülllen?

Ich sage doch schon vorher: feste Feldlängen.

Jürgen

26.10.2009 - 08:49 Uhr

Hallo und willkommen!

Ich habe den Eindruck, du musst dir die Hinweise unter :rtfm: DataSet.Merge noch genauer durchlesen. Dort wird auch auf **DataRowState **eingegangen; **GetChanges **wird am Anfang vor dem Merge verwendet.

Zur detaillierten Untersuchung wäre es praktischer, erst einmal eine einzelne DataTable zu mischen und zu vergleichen. Dann wird dir vermutlich klarer, wie vorzugehen ist.

Gruß Jürgen

25.10.2009 - 18:14 Uhr

juetho, kannst du mir evtl sagen wie man tricksen kann? Oder wo man darüber etwas lesen kann?

Ich habe diese Kenntnis aus einem alten Buch von Andreas Kosch "Interbase-Datenbankentwicklung mit Delphi". Die FB-ReleaseNotes enthalten nichts dazu; also gelten die alten Interbase-Anleitungen wie DataDef.pdf weiter.

CREATE TABLE EXT_TBL EXTERNAL FILE 'file.txt'
  (FNAME CHAR(10),
   LNAME CHAR(20),
   HDATE CHAR(8),
   NEWLINE CHAR(2));

CR/LF ist wie eine Spalte NEWLINE zu verarbeiten, unter Windows also mit 2 Bytes.

Aber ein SQL-Dump ist das natürlich nicht, nur eine Notlösung. Jürgen

25.10.2009 - 14:28 Uhr

Gibt es bei Frebird keine Möglichkeit, ein CSV Datei zu importieren?

Leider nicht. Mit CREATE TABLE ... EXTERNAL FILE kann nur auf feste Feldlängen zugegriffen werden; und für CR/LF muss getrickst werden.

Jürgen

20.10.2009 - 19:09 Uhr

Hallo,

dein Hauptfehler ist, dass der Datensatz in der Datenbank gelöscht wird, in der Datenmenge, die hinter der BindingSource steckt (vermutlich DataTable), aber noch enthalten ist. Du musst umgekehrt vorgehen:

* zuerst den Datensatz in der Datenmenge löschen; das aktualisiert die BindingSource automatisch
* dann die Datenmenge als Ganzes mit den Änderungen speichern

Zum ersten Punkt gibt es DataTable.Delete. Achtung: DataTable.Remove ist falsch! Es gibt außerdem BindingSource.RemoveCurrent; ich weiß aber nicht, ob das in der DataTable als Delete oder als Remove ausgeführt wird (wahrscheinlicher ist wegen der Namen Remove).

Zum zweiten Punkt ist DataAdapter.Update besser als einzelne Execute-Befehle.

Weitere Kritikpunkte: ExecuteScalar könnte funktionieren. Aber gedacht ist für einen solchen SQL-Befehl ExecuteNonQuery. Die ID als Text in den String einzubauen und dann auch noch mit Hochkommata zu verbinden (das ist doch sicher eine Zahl), ist höchstgefährlich. Siehe [Artikelserie] Parameter von SQL Befehlen

Gruß Jürgen

15.10.2009 - 19:05 Uhr

Hallo,

ich kann mir nicht vorstellen, dass das möglich ist. Ein FK bezieht sich immer auf den PK einer Tabelle. Siehe FOREIGN KEY-Einschränkungen (Hervorhebung von mir):

In einem Fremdschlüsselverweis wird zwischen zwei Tabellen eine Verknüpfung erstellt, wenn eine Spalte bzw. mehrere Spalten einer Tabelle auf die Spalte bzw. Spalten mit dem :::

Vielleicht geht es über eine Zwischentabelle, die nur die Werte aus Tabelle B.Feld2 enthält, aber ob das sinnvoll ist?

Jürgen

15.10.2009 - 16:40 Uhr

wie kann ich nun die for-schleife in den konstrukor packen, dass er dies jedes mal automatisch tut....

Welchen Konstruktor meinst du? Den deiner Klasse? Das kann doch nicht gehen, weil du dann innerhalb der Klasse einen Verweis auf ein Array von mehreren Instanzen von sich selbst benutzen willst.

Oder einen Konstruktor (z.B. ein Formular oder ein "Datenmodul") für eine Klasse, die mit einem Array solcher Objekte arbeiten soll? Dann pack es doch einfach dort hinein.

bei string[] usw geht es ja auch...

Was und wo geht mit einem String-Array? Auch ein solches muss irgendwo definiert werden. Hast du schon einmal versucht, innerhalb der String-Klasse ein String-Array einzubetten? Oder was meinst du damit?

Nebenbei: List<T> ist im Zweifelsfall praktischer als ein Array.

Jürgen

15.10.2009 - 09:02 Uhr

Hallo,

schon dein SELECT-String sieht mysteriös aus durch das eingebaue char() und ToString. Das bringt vielleicht auch den Update-Befehl durcheinander. Mach es konsequent wie in [Artikelserie] Parameter von SQL Befehlen beschrieben.

Fehlende Erläuterungen sind außerdem: Was für ein Datentyp ist "note"? Sind das wirklich Zahlen oder Texte? Außerdem habe ich über die Forumssuche einen Link zu reservierten Wörtern in Access 2000 gefunden.

Jürgen

15.10.2009 - 08:55 Uhr

Hallo,

die Regeln für Select werden in :rtfm: DataColumn.Expression beschrieben. Einen Hinweis auf dein Problem habe ich auf die Schnelle allerdings auch nicht gefunden.

Gruß Jürgen

13.10.2009 - 17:25 Uhr

Hallo,

mit RIGHT erhältst du die letzten n Zeichen des Quelltextes, nicht alle Zeichen ab Position n. Du musst deshalb noch LENGTH berücksichtigen.

Aber sinnvoller ist es sowieso, die Spalten aufzuteilen - warum, ist ja offensichtlich.

Gruß Jürgen

13.10.2009 - 10:15 Uhr

FZelle hat die beiden wichtigsten Punkte genannt, siehe auch [Artikelserie] Parameter von SQL Befehlen mit Hinweisen auf das richtige Verfahren in Schleifen.

Ich möchte FZelle noch ergänzen. An drei Stellen vermischst du Befehle. Bei deiner Variante übergibst du durch AddWithValue einen Wert vom Typ DbType und weist diesem Parameter einen String zu. Das kann nur schief gehen.

// falsch
SCC.Parameters.AddWithValue("VK", SqlDbType.Money).Value = values[7];
// richtig eher so:
SCC.Parameters.Add("VK", SqlDbType.Money).Value = values[7] as decimal;

Aber dazu muss natürlich korrekt konvertiert werden. Das würdest du mit korrekter Wertübergabe (statt String.Split) automatisch erreichen.

Gruß Jürgen

13.10.2009 - 10:06 Uhr

(Falls es tatsächlich MySql ist, möchte ich nochmals den Vorschlag mit RegEx einbringen. Dazu gibt es für die WHERE-Klausel den REGEXP-Parameter, siehe String-Vergleichsfunktionen. Je nachdem, wie komplex der String ist und wie viele Bestandteile auszuwerten ist, könnte das trotz aller bisherigen Anmerkungen sinnvoll sein.){gray}

Aber wichtiger ist natürlich, die Datenstruktur sinnvoll zu ändern. Jürgen

12.10.2009 - 14:03 Uhr

Ich habe nicht gesehen, welches DBMS du verwendest (SQL ist kein System, sondern eine Sprache - 'L'=Language). Vielleicht kann es etwas mit RegEx anfangen; dann dürftest du besser vorankommen.

Jürgen

12.10.2009 - 13:25 Uhr

Etwas genauer:

  1. Darf man dem Between-Ausdruck eigentlich nur Ganzzahlen übergeben?

Es gilt für alles, was man per größer/kleiner vergleichen kann: alle Zahlen, Zeichenketten, Datums-/Zeitwerte. BETWEEN AND ist eine Kurzschreibweise für "ist größer/gleich AND ist kleiner/gleich".

Wenn dein Feldinhalt wirklich so aussieht, kann das nur nach String-Regeln verglichen werden.

Ich weiß, die Einträge sind nicht sonderlich "freundlich"

Das ist nicht nur euphemistisch ausgedrückt. Eine solche Spalte würde sämtlichen Normalisierungsregeln widersprechen.

Jürgen

12.10.2009 - 09:48 Uhr

Hallo,

das hängt vor allem davon ab, was du damit machen willst. Es geht z.B. über Rows[Rows.Count-1] oder über BindingSource.MoveLast. Du musst aber bedenken, dass die Zeilen grundsätzlich unsortiert in der DataTable stehen (genauer: so, wie du sie geladen hast).

Gruß Jürgen

12.10.2009 - 09:36 Uhr

Bei der DockPanelSuite scheint leider kein Quellcode dabei zu sein, ...

Unter Files gibt es auch die Quelldateien zum Download.

Aber die DockPanelSuite geht über die Toolbox weit hinaus. Deshalb hätte ich sie nicht vorgeschlagen, sondern ebenso auf CodeProject verwiesen.

Gruß Jürgen

12.10.2009 - 09:30 Uhr

Hallo,

für solche Wünsche ist CodeProject immer eine gute Adresse. Außerdem geht es auch mit "Bordmitteln" des Framework, siehe ConnectionStrings mit einer Schema.Ini.

Gruß Jürgen

10.10.2009 - 10:24 Uhr

Ich möchte herbivores Aufstellung unterstreichen.

Als Berliner war man auch früher (ich meine: als Wessi zur Mauerzeit) in einer besonderen Situation: 2 große, hervorragend ausgestattete Unis, 2 landesweite Bibliotheken (Amerika-Gedenkbibliothek AGB und Staatsbibliothek Stabi), dazu viele Stadtbibliotheken in den Stadtteilen, viele Buchhandlungen usw. Da war es sicher leichter als anderswo, an Informationen heranzukommen.

Übrigens habe ich in den 70er Jahren studiert, als ein Computer vom "Anwender" noch mit Lochkarten gefüttert wurde und man das Arbeitsergebnis erst am nächsten Tag beim Rechenzentrum abholen konnte. (Um Missverständnissen vorzubeugen: Ich bin erst nach der Bundeswehr zum Studium nach Berlin gegangen. Und es galt schon damals: Wer seit vier Wochen in Berlin wohnt und sich wohl fühlt, darf sich als Berliner bezeichnen.

Gruß Jürgen

09.10.2009 - 17:09 Uhr

Kleine Ergänzung: Das ConnectionPooling sorgt dafür, dass der zweite, dritte usw. Zugriff (genauer: das Connection.Open) erheblich schneller gehen als der erste. Jürgen

//sprachlicher Fehler beseitigt