Laden...

Forenbeiträge von juetho Ingesamt 3.331 Beiträge

08.10.2009 - 15:37 Uhr

Ich lasse mich aber gerne belehren, denn wenn OleDB - Treiber(?) ebenso gut verbreitet sein sollten wie ODBCs, bin ich nicht auf ODBC angewiesen.

Oledb ist eine Winzigkeit besser, bietet aber noch weniger Schemata. Die Seite, die ich vorhin zitiert hatte, enthält alles, was die Standardtreiber von ADO.NET anbieten.

Ich las grade "neben den allgemeinen [...] folgende spezifische".
Heißt das, dass "Tables" per GetSchema eventuell gar nicht verfügbar ist?

Nein, "Tables" werden immer geliefert. Aber mit den Indizes fangen die Spezialitäten schon an. Eine csv-Datei beispielsweise hat keinen Index; also kann GetSchema auch nichts liefern (auch wenn es in obiger Liste enthalten ist; wahrscheinlich ist das eine leere Tabelle).

Gibt es eine Liste oder ähnliches, die mir sagt auf was ich mich bei ODBC verlassen kann?

Siehe mein obiges Zitat - das ist diese Liste.

Jürgen

Nachtrag: Eine spezielle Datenquelle kann weitere Spezialitäten enthalten. Diese sind natürlich irgendwie gespeichert. Je nachdem können sie auch irgendwie abgefragt werden; aber Odbc enthält keinen allgemein passenden Befehl.

08.10.2009 - 15:30 Uhr

Du hast den Timer im Designer hinzugefügt; also hat er (d.h. die dadurch erzeugte Instanz) einen Namen. Unter diesem Namen kannst du ihn (wie jedes Control auch) im gesamten Formular ansprechen.

Der Timer hat eine Reihe von Eigenschaften. Eine davon willst du zur Laufzeit ändern. Du musst also in :rtfm: nachlesen, welche das ist. (Tipp: Es handelt sich nicht um eine feste Zeit, sondern um eine Zeitdauer.)

Das Tick ist das Ereignis, das zum Ablauf dieser Zeitdauer durch den Timer ausgelöst wird. Ist es sinnvoll, dort die Änderung vorzunehmen? Nein, sondern das muss dann geschehen, wenn der Benutzer es durch einen Button festlegt, oder immer dann, wenn er den Wert des NumericUpDown ändert - also innerhalb eines dazu passenden Ereignisses; welches das ist, solltest du in :rtfm: heraussuchen.

Übrigens muss bei Value und der Zeitdauer noch auf den richtigen Datentyp geachtet werden; insofern war Lenny zu kurz angebunden.

Gruß Jürgen

08.10.2009 - 13:11 Uhr

Hallo,

dein Ziel kann vermutlich nicht mit GetSchema erreicht werden. In :rtfm: heißt es:

Verstehen der anbieterspezifischen Schemaauflistungen

Der Microsoft SQL Server Jet ODBC-Treiber unterstützt neben den allgemeinen Schemaauflistungen auch die folgenden spezifischen Schemaauflistungen:
* Tables
* Indexes
* Columns
* Procedures
* ProcedureColumns
* ProcedureParameters
* Views

Von ForeignKeys ist leider nicht die Rede.

Was für eine Datenquelle hast du denn? Vielleicht gibt es einen besser geeigneten DbProvider als ausgerechnet die Minimalversion Odbc?

Gruß Jürgen

07.10.2009 - 11:41 Uhr

Hallo,

ich glaube, dass Jacks Antwort nicht hilft. In :rtfm: lese ich dazu:

... und Texte von rechts nach links geschrieben ...

Diese Eigenschaft bezieht sich also wohl eher auf Sprachen wie Arabisch, Hebräisch usw.

Zum Problem selbst bin ich über die Forumssuche nach statusbar rechts auf StatusStrip: Problem gestoßen; das könnte helfen.

Jürgen

06.10.2009 - 09:14 Uhr

Mir fallen noch zwei Punkte auf:

            string datum;
            datum = "" + k_datum.Day + "/" + k_datum.Month + "/" + k_datum.Year;
// später
                DB_datum = cmd.Parameters.Add("@Datum", SqlDbType.SmallDateTime);
                DB_datum.Value = datum;

So etwas ist Quatsch: aus einem DateTime einen String in spezieller Formatierung zu erzeugen und den als Value eines DateTime-Parameteres zu verwenden. Ich nehme an, dass der SqlProvider die Konvertierung von DateTime zu SmallDateTime richtig vornimmt (es geht dabei eigentlich nur um den zulässigen Wertebereich); aber wenn du es unbedingt deklarieren willst/musst, dann geht es einfach so:

cmd.Parameters.Add("@Datum", SqlDbType.SmallDateTime).Value = k_datum;

Der "normale" Weg geht aber so, wie Khalid in seiner letzten Zeile sagt.

Außerdem [Tipp] Anfängerfehler == true / == false (bezieht sich auf die if-Abfrage zu k_check).

Jürgen

05.10.2009 - 11:36 Uhr

Das geht nur in seltenen Ausnahmefällen. Lies einmal [Artikelserie] Parameter von SQL Befehlen durch. Auch wenn es dir für dein Problem nicht hilft, bekommst du wohl ein Gefühl dafür, was mit Parametern möglich ist und was nicht.

Mit dem Designer geht das dann wohl wirklich nur mit unterschiedlichen Fill-Befehlen, wie ja auch die SELECT-Befehle sich wesentlich unterscheiden müssen; und es ist ein wesentlicher Unterschied, ob in WHERE eine Bedingung steckt oder zwei mit OR verknüpfte.

Gruß Jürgen

05.10.2009 - 11:30 Uhr

Hallo,

ich finde in :rtfm: DataColumn.Expression Abs nicht in der Liste der unterstützten Funktionen. Vielleicht musst du mit IIF arbeiten oder zuvor eine weitere berechnete Spalte verwenden, die für die Anzeige ausgeblendet wird.

Gruß Jürgen

03.10.2009 - 19:07 Uhr

Hallo,

benutze lieber Dictionary<Key, Value> - das ist genau dafür vorgesehen.

Jürgen

02.10.2009 - 12:45 Uhr

Hallo,

ich verstehe die Datenstruktur insgesamt noch nicht ganz. Es kommt mir so vor, als wenn du zusätzlich ein GROUP BY in einem SELF JOIN benötigst.

Jürgen

02.10.2009 - 12:35 Uhr

Wenn Du eine Zeile von einer Tabelle in eine andere Tabelle einfügen willst dann die Zeile besser neu einfügen und die Werte einzeln übertragen.

Zur Vereinfachung gibt es ImportRow; das entspricht in etwa einem CopyRow.

if (rw[1].ToString() == rw2[1].ToString())  

Diese Variante ist zumindest riskant. Es ist nicht gesagt, dass ToString den Inhalt der Spalte geliefert; es kann auch passieren, dass stattdessen der Typ der Spalte verglichen wird, und der wäre natürlich immer gleich. Wenn überhaupt, dann sollte wirklich der Wert verglichen werden (natürlich jeweils nach dem richtigen Datentyp):

if ( (int)rw[1] == (int)rw2[1])

Siehe außerdem [Tipp] Anfängerfehler == true / == false

Jürgen

30.09.2009 - 11:10 Uhr

Hallo und willkommen,

mir fällt nur switch(ExcNam) ein. Da die Anzahl der Parameter sich unterscheidet, geht es nicht mit Delegates.

Jürgen

28.09.2009 - 12:20 Uhr

Hallo,

das DataSet ist keine SQL-Datenbank. Darin (und folglich in DataTable) kannst du nur das benutzen, was dafür vorgesehen ist. Einzelheiten zu DataTable.Select findest du in DataColumn.Expression.

Jürgen

Nachtrag: Ich habe jetzt keine Lust, wieder einmal die Einzelheiten anzuschauen. Es könnte sein, dass du vorher noch eine berechnete Spalte hinzufügen musst (mit der gewünschten Länge) und diese erst danach benutzen kannst.

25.09.2009 - 19:29 Uhr

Unter Oledb werden die Parameter im SQL-Befehl durch '?' gekennzeichnet. Siehe [Artikelserie] Parameter von SQL Befehlen, vor allem den 3. Beitrag. Jürgen

25.09.2009 - 11:36 Uhr

Hallo,

genauer geht das nur mit direktem Vergleich der beiden Daten, nicht mit einem TimeSpan-Member. Siehe auch die Hinweise in Geburtsdatum ausrechnen.

Jürgen

25.09.2009 - 09:40 Uhr

Hallo und willkommen,

OPEN und CLOSE klingen sehr nach reservierten Wörtern - im SQL-Standard sind beide reserviert. Besser wäre es, andere Spaltennamen zu verwenden. Wenn dies nicht (mehr) möglich ist, müssten sie im SELECT-Befehl in [] oder "" o.ä. gesetzt werden; das ist je nach DBMS unterschiedlich.

Gruß Jürgen

25.09.2009 - 09:35 Uhr

Hallo,

natürlich geht das. Das nennt sich TabControl; jede einzelne **TabPage **kann ein eigenes DataGridView bekommen; jedes DGV hat seine eigene DataSource.

Wegen der Ressourcenverschwendung (das DGV ist sehr aufwändig) solltest du aber an ein anderes Verfahren denken: Nenne in einer **ComboBox **oder **ListBox **alle DataTables; je nach aktueller Auswahl wird dann eine bestimmte DataTable an ein einziges DGV angebunden.

Übrigens arbeitet FireFox (soweit ich weiß) nicht mit TabControl, sondern mit der dockpanelsuite; aber das spielt insofern keine Rolle.

Gruß Jürgen

24.09.2009 - 13:12 Uhr

Hallo und willkommen,

  • Kann ich das DataGridView direkt mit dem SQL-Statement befüllen

Ja, aber das wäre eine sehr schlechte Lösung.

oder Brauche ich noch etwas "dazwischen"?

Sinnvollerweise wird dazu ein **DataSet **mit wenigstens einer **DataTable **erstellt. Diese brauchen keinerlei Einzelheiten zu bekommen; das geht mit dem nächsten Schritt.

  • Hat jemand einen einfachen Ansatz für mich der mir dabei weiterhelfen könnte?

Naja, einfach... Das ganze Konzept von ADO.NET ist komplex. Benutze DbDataAdapter.Fill; dann landet das Ergebnis der Abfrage in der DataTable. Diese wird als DataSource an das DataGridView gebunden.

Sei es ein externer Link Datenbanken How-To
🛈 Kap. 25 ff.

Wenn ich von Db-Klassen schreibe, sind immer diejenigen des betreffenden Providers zu verwenden, für Access also Oledb-Klassen.

Gruß Jürgen

/Edit
vbprogger meint genau das Gleiche.

24.09.2009 - 10:03 Uhr

Hat sich erledigt!

Du bist so lange dabei; dann solltest du dich nach Wie poste ich richtig? 9. Eigene Lösungen posten richten (wobei ich annehme, dass du etwas wie JunkyXL oder talla gemacht hast). Jürgen

24.09.2009 - 09:59 Uhr

Bitte nicht trennen! Die weitaus meisten Fragen betreffen C# und NET. Außerdem unterscheiden sich VS und #D (abgesehen von TableAdapter einerseits und der "Offenheit" z.B. des Editors andererseits) nicht so wesentlich, dass getrennte Unterforen sinnvoll wären. Das würde nur dazu führen, dass herbivore falsch platzierte "allgemeine" Diskussionen schließen oder verschieben müsste; und diese Zusatzarbeit sollten wir ihm ersparen. Jürgen

Übrigens geht es hier um #D 3.1, nicht um die Forenstruktur. Und ich benutze fast ausschließlich #D und bleibe dabei.

23.09.2009 - 13:13 Uhr

das findich für son Monstrum noch vertretbar.

Da stimme ich voll zu, aber "schnuckelig" ist etwas anderes. Jürgen

23.09.2009 - 13:11 Uhr

Wenn du anstelle von ExecuteReader einen **DbDataAdapter **(d.h. die Sql-Ableitung) mit **Fill **benutzt, hast du als Ergebnis sofort eine DataTable.

Es gibt auch eine Konvertierung von DataReader zu DataTable mit einem einzigen Befehl; aber ich vergesse immer wieder, zu welcher Klasse der gehört - da musst du leider etwas in :rtfm: suchen.

/Edit
So, ich habe jetzt selbst nochmal gesucht. DataTable.Load(reader) macht das.

Jürgen

23.09.2009 - 13:05 Uhr

Du musst "rückwärts" durch die for-Schleife gehen.

Überlege doch, was passiert, wenn du mit Remove das Element an der Position i entfernst: dann rücken alle übrigen um eine Position vor; dann gehst du einen Schritt weiter - und übergehst das Element, das jetzt an die Position i gekommen ist.

Jürgen

PS. Mit dem #-Button bekommst du die Code-Markierung für C#. Das "this" ist meistens überflüssig und kann weggelassen werden.

23.09.2009 - 11:45 Uhr

Ohne TableAdapter sind typ.Datasets doch wirklich nurnoch schnuckelig, findeste nicht?

1 MB für die Designer.cs findest du schnuckelig? Naja... Jürgen

23.09.2009 - 11:42 Uhr

Als kleine Ergänzung [FAQ] Variablennamen zur Laufzeit zusammensetzen. Das hast du ja schon berücksichtigt; aber vielleicht findest du in den Links auch noch etwas direkt für dein Problem. Jürgen

23.09.2009 - 11:36 Uhr

Ich glaube, auch für Dateien gelten die Hinweise in [Artikelserie] Parameter von SQL Befehlen. Für Access sind wohl noch andere Hinweise wichtig; da hilft aber mit Sicherheit die Forumssuche (nach meiner Erinnerung gab es dazu schon häufiger Diskussionen).

Jürgen

22.09.2009 - 18:51 Uhr

Das Binding beenden war der Schlüssel zum Erfolg!

Nachdem dieses Problem schon 100x festgestellt und beantwortet wurde, konnte ich mich daran erinnern und den Hinweis geben, auch wenn deine Problembeschreibung darauf nicht hingedeutet hat.

Ich habe mir den UpdateCommand (der vom CommandBuilder generiert wurde) ...
Bis zum WHERE ist mir alles klar...die ID versteht sich von selbst. Nur der Sermon der danach kommt ist mir schleierhaft.
Warum wird da so eine komplexe Abfrage generiert? Nicht dass ich jetzt ein SQL-Guru wäre...aber ich hätte einfach nach der ID-Angabe aufgehört.

Das ist der Unterschied zwischen einem Menschen und einem Automaten. Der Mensch denkt zuerst nach; der Automat bastelt alles zusammen, was als NULL und Leerstring denkbar ist. (Das ist einer der Gründe, warum typ.DataSet und TableAdapter solche Code-Monster erzeugen und teilweise abgelehnt werden.)

wie kann ich mir denn den UpdateCommand mit eingefügten Parametern anschauen?

Grundsätzlich gar nicht (vielleicht bei Access, aber bei einer richtigen Datenbank nicht). Das gehört zur Sicherheit bei den Parametern:

Der DB-Server übernimmt zuerst den Befehl selbst und bereitet ihn vor, dann fügt er die Parameter-Werte ein.

Der DB-Server macht das, nicht das NET-Programm. Siehe auch [Artikelserie] Parameter von SQL Befehlen

Jürgen

22.09.2009 - 12:24 Uhr

FK = ForeignKey

(im DataSet ist es eine DataRelation)

Jürgen

22.09.2009 - 09:14 Uhr

Auch ich vermisse den **UpdateCommand **- wie lautet der denn? Zusätzlich könnte es sein, dass BindingSource.EndEdit vor das Speichern gesetzt werden muss. Die Eingabe wird normalerweise erst dann abgeschlossen, wenn der aktive Datensatz gewechselt wird; wenn das Speichern zu früh ausgelöst wird, fehlt dies noch; dann muss per Befehl die Eingabe bewusst beendet werden.

Jürgen

@Lars
Was ist denn mit dem Benutzer blackcoin passiert? Gefiel dir der Name nicht mehr? (Bisher hatte ich leider noch keine Gelegenheit zu dieser Frage.)

22.09.2009 - 09:03 Uhr

Ich nutze einen SQLCompact Server.

Schön, dass diese Angabe jetzt schon kommt. Dafür ist der SqlServerCe-Provider zuständig; du darfst also keine Sql-Klassen benutzen, sondern musst auf SqlCe-Klassen umsteigen.

Du wurdest ganz am Anfang nach dem verwendeten Datenbanksystem gefragt. Hättest du dann nicht auf den Gedanken kommen können, vollständig zu antworten?

Ergänzung zu Thomas' Hinweis: AcceptChanges ist entgegen dem üblichen Sprachgebrauch keine Bestätigung des Benutzers an das Programm, dass die Änderungen gültig seien und zu speichern sind. Es handelt sich vielmehr um die Feststellung des Programmierers für das DataSet, dass die Änderungen erledigt sind und bei späterem Update nicht mehr beachtet werden sollen.

Jürgen

22.09.2009 - 08:52 Uhr

Nach diesem Problem wurde schon mehrfach gefragt. Benutze die Forumssuche, z.B. nach datagridview leerzeile. Siehe auch Wie poste ich richtig? Zuerst suchen

Übrigens ist es kein gutes Verfahren, das **DataGridView **"von Hand" zu füllen. Es ist, wie schon der Name sagt, dazu gedacht, Daten in einem Grid zur Anzeige zu bringen; also ist die Benutzung von **DataSource **dringend zu empfehlen. Sonst kommst du eher früher als später zu neuen Problemen (auch wenn die überzählige Leerzeile damit nichts zu tun hat).

Jürgen

21.09.2009 - 15:50 Uhr

Hallo,

es ist zumindest unüblich, die DB und die Tabelle mit Gänsefüßchen zu bezeichnen. (Aber vielleicht geht das unter Oracle vorzugsweise so.) Dann rate ich davon ab, den OracleProvider von MS zu verwenden; benutze lieber einen der speziellen DbProvider, siehe connectionstrings. Weitere Problemstellen: Ist in dem SELECT-Befehl ein PK-Feld enthalten? Wird vor dem Update-Befehl der DbCommandBuilder aufgerufen?

Gruß Jürgen

21.09.2009 - 09:39 Uhr

Auch wenn es mit dem Problem nichts zu tun hat, möchte ich dich darauf hinweisen: Oledb (und Odbc) sind nur Notlösungen, wenn es wirklich nichts Besseres gibt. Für Oracle liefert NET bereits eine MS-Lösung in System.Data.OracleClient.dll und dem Namespace System.Data.OracleClient mit. Außerdem sind über SQL-Parameter: Unterschiede der DbProvider Hinweise und Links auf spezialisierte, also viel bessere Oracle-Provider zu finden. Jürgen

20.09.2009 - 10:17 Uhr

Ich würde mit einem zusätzlichen Eintrag in der Datenquelle arbeiten und diesen "(alle)" o.ä. bezeichnen, also mit einem Sonderzeichen, das in der üblichen Sortierung zuerst kommt. Das klappt freilich nicht, wenn ein Eintrag mit einem Leerzeichen o.ä. anfängt.

Jürgen

19.09.2009 - 17:17 Uhr

Bei OleDb werden **Parameter mit '?' **angegeben, siehe [Artikelserie] Parameter von SQL Befehlen. Die Fehlermeldung klingt in diesem Zusammenhang zwar sehr seltsam; aber so ist das bei diesem Fehler - das könnte schon die Lösung sein. Jürgen

19.09.2009 - 12:14 Uhr

Danke für die Erläuterung! Jürgen

19.09.2009 - 12:11 Uhr

Hallo herbivore,

Cookies sind dauerhaft erlaubt, bis Firefox geschlossen wird (also normalerweise einmal wöchentlich).

Auf das "www" werde ich mal achten.

Danke für die Verkürzung des Umwegs.

Vor ein paar Tagen hatte ich ein ähnliches Problem mit "Kontakt und Hilfe" zur Deutschen Post. Es gibt dazu über https ein Email-Formular. Wehe, man braucht zu lange, um den Text zu schreiben und die Angaben auszufüllen. Wenn man dann auf "Senden" drückt, bekommt man die Meldung "Ihre aktuelle Sitzung ist leider abgelaufen. Bitte Starten Sie die aktuelle Anwendung noch einmal. Wir danken für Ihr Verständnis. (PIF-15111)" Weil es sich um eine sichere Verbindung handelt, kam ich nicht zurück zum Eingabeformular; also konnte ich meinen Text nicht kopieren, sondern musste alles nochmals neu formulieren. Mein nächster Text begann mit "Verdammte Scheiße..."

Da ist mycsharp viel angenehmer zu bedienen. Jürgen

19.09.2009 - 11:44 Uhr

Stimmt, danke!

Für künftige derartige Fälle als Information: Womit kann ich eigentlich rechnen, wie lange es dauert, bis ein Beitrag aus dem Post-Cache herausfällt? Mir ist klar, dass das von der Menge der Beiträge abhängt, also am Wochenende erheblich länger dauert; aber vielleicht gibt es vage Anhaltspunkte.

Schönes Wochenende! Jürgen

19.09.2009 - 11:17 Uhr

Hallo,

seit ein paar Wochen muss ich mich wieder einmal doppelt anmelden, bevor ich einen Beitrag abschicken kann.

Normalerweise arbeite ich so:1.anonymer Aufruf des Community-Index 1.Beiträge der letzten 24 Stunden anzeigen 1.bei "interessanten" Themen auf den letzten Beitrag gehen 1.auf "zitieren" oder "Antwort erstellen" gehen 1.persönliche Anmeldung 1.Beitrag schreiben 1."Vorschau" oder "Beitrag speichern" drücken 1.alles geht seinen Gang

Immer wieder einmal (unregelmäßig) geht dabei die Anmeldung verloren:1.normaler Gang wie oben bis "Beitrag schreiben" 1."Vorschau" oder "Beitrag speichern" drücken 1.Aufforderung zur persönlichen Anmeldung 1.Weiter zur Startseite des Forums 1.(anstelle der Wiederholung des normalen Ablaufs will ich wenigstens den Beitrag retten) 1.mit der Historie von Firefox zurück zu "Beitrag schreiben" 1.Text in die Zwischenablage kopieren 1.suche erneut die gewünschte Diskussion mit "Antwort erstellen" 1.Text des neuen Beitrags aus der Zwischenablage einfügen 1.Smilies aktivieren, soweit vorgesehen 1."Vorschau" oder "Beitrag speichern" drücken 1.jetzt geht alles seinen Gang

Unter welchen Bedingungen es "falsch" abläuft, konnte ich bisher nicht nachvollziehen. Habt ihr eine Möglichkeit, den Umweg auszuschalten?

Recht herzlichen Dank! Jürgen

Oops, jetzt musste ich mich schon zum dritten Mal anmelden.

19.09.2009 - 11:02 Uhr

Das ging ja (wieder einmal) superschnell, danke! Aber warum wird es dort (noch) nicht angezeigt? Jürgen

/Edit
Den Internet-Cache und die Chronik zu löschen, hat nichts gebracht.

19.09.2009 - 10:51 Uhr

Hallo herbivore,

ich bitte darum, das Wikipedia-Logo auch für die WikiBooks zu verwenden. Die Begründung ist die gleiche wie die für Wikipedia: das eigentliche Logo wäre zu winzig, aber das "W" kann auf alle WikiMedia-Projekte verweisen.

Danke! Jürgen

19.09.2009 - 10:38 Uhr

OK, ich versuche mich besser auszudrücken.

Mit einem SELECT bekommst du über DbDataAdapter.Fill immer nur eine DataTable in ein DataSet. Wenn du die Daten in verschiedene DataTables haben willst, brauchst du mehrere SELECTs auf jeweils genau eine DB-Tabelle mit entsprechendem mehrfachem Aufruf von DbDataAdapter.Fill. Wenn du verschiedene DB-Tabellen auf einen Schlag abrufen willst, brauchst du einen SELECT mit komplexem JOIN und WHERE (vielleicht auch UNION); aber für das DataSet ist das dann genau eine DataTable (und du kannst nicht zurückverfolgen, aus welcher DB-Tabelle die einzelnen Spalten kommen).

Du solltest dich wohl grundsätzlicher mit den verschiedenen Themen befassen: auf der einen Seite die Arbeit mit SQL-Datenbanken, siehe z.B. Einführung in SQL mit den Kapiteln über WHERE und "Mehrere Tabellen"; auf der anderen Seite die DB-Verarbeitung unter NET, siehe z.B. 🛈 Kap.25 ff.

Deine Fragen und Nachfragen sowie die Antworten von Florian und mir gehen inzwischen doch ziemlich durcheinander.

Jürgen

18.09.2009 - 15:07 Uhr

Ich will aber alle ORDERS von diesem Kunden, sobald eine in diesem Zeitraum trifft **
Dafür gibt es diese Konstruktion:

SELECT * FROM Orders
 WHERE CustomerID = @CID
   AND EXISTS ( SELECT ID FROM Orders
                         WHERE CustomerID = @CID
                           AND Datum >= @Datum )

Wenn sich das auf die Daten eines Kunden bezieht (und passendes Indizes definiert sind), sollte es ausreichend schnell sein.

Bevor eine Nachfrage kommt "was soll das @CID" bedeuten, dann lies [Artikelserie] Parameter von SQL Befehlen.

Jürgen

18.09.2009 - 11:53 Uhr

Nur das Kombinieren zweier DataTables in einem DataGridView ist eben so nicht möglich.

Das gilt zwar grundsätzlich, weil das DGV die Ansicht für eine einzige Tabelle liefert. Aber eine Nachschlagetabelle (in Delphi: LookupTable) kann durchaus in dieses DGV einbezogen werden durch eine DGV-ComboBox. Das ist in meinem o.g. Link beschrieben.

Offensichtlich ist diese "alte" Diskussion als Arbeitsanleitung nur bedingt geeignet. Ich werde meine Beiträge wohl nochmals überarbeiten müssen, damit der Lösungsweg sofort klar wird.

Gruß Jürgen

18.09.2009 - 11:49 Uhr

Zu jedem Customer alle Orders eines Datums? Mit SQL wird das schwierig, vor allem wenn du es in einem SELECT erschlagen willst. Suche einmal unter dem Stichwort Pivot.

Jürgen

18.09.2009 - 08:58 Uhr

@kleines_eichhoernchen
Er sagte nicht, dass ihm #D nicht gefällt. Er sucht aber eine IDE, die ohne Installation auskommt, und das bietet #D eigentlich ebensowenig wie VS. Einen Ausweg habe ich ihm genannt.
Jürgen

18.09.2009 - 08:51 Uhr

#D kann auch auf einem USB-Stick installiert und von dort aus gestartet werden. Suche einmal unter #D Community nach "SharpDevelop portable". Jürgen

17.09.2009 - 18:57 Uhr

Ein konkreter Hinweis als Ergänzung zu dem, was FZelle sagt. Überleg doch einmal (am besten vorher), was diese beiden Zeilen beim Speichern eigentlich zu suchen haben:

        sql_ds = new DataSet();
        sql_da.Fill(sql_ds, "adressen");

Das ist doch völliger Blödsinn (entschuldige, aber das ist so, und mit ein wenig Nachdenken hätte es dir auch auffallen können), unmittelbar vor dem Speichern ein neues DataSet zu erstellen und dort Datensätze einzulesen - ohne Sinn und Verstand, weil sie sofort nach dem Ende der Methode wieder verschwunden sind.

Übrigens ist using(connection) sehr vernünftig. Nur auf das Open/Close kannst du verzichten, das macht der DbDataAdapter selbständig.

Also befasse dich mit Grundlagen, wenigstens mit 🛈 Kap.25 ff.

Jürgen

17.09.2009 - 18:49 Uhr

Hallo,

ich möchte es noch etwas komplizierter machen. Das soll aber dazu führen, dass es künftig einfacher wird.

Du musst trennen zwischen den Daten auf der Festplatte (Datenbank DB), den Daten im Arbeitsspeicher (z.B. DataSet DS mit DataTables) und der Anzeige (DataGridView, TextBoxen usw.). Das DataSet ist keine SQL-Datenbank, hat also mit Normalisierung wenig zu tun.

Es ist allerdings zu empfehlen, dass die Tabellen in der DB zu denen im DS passen. Wenn die Daten nur angezeigt werden sollen, ist ein SELECT mit JOIN durchaus sinnvoll. Sobald aber Änderungen bzw. Neuaufnahmen vorgesehen sind, geht das faktisch nicht (theoretisch schon, aber es verlangt diverse Umwege und Notlösungen).

Eines der möglichen Wege, DB und DS anzupassen, ist das typisierte DataSet. _Wenn dir das nichts sagt, dann suche Beiträge von ErfinderDesRades zu diesem Stichwort; er gibt mindestens einmal täglich einen Link auf Tutorials u.ä. _Ein anderer möglicher Weg sind O/R-Mapper; auch dazu hilft die Forumssuche.

Außerdem solltest du beachten: In der Regel werden nur diejenigen Daten abgerufen, die ganz konkret benötigt werden. Also nicht vorsorglich alle Reiter, alle Pferde, alle Sättel usw., sondern zunächst den gewünschten Reiter, dann seine Pferde und seine Sättel und Preise.

Ich hoffe, ich konnte dir ein paar sinnvolle Tipps geben. Jürgen

16.09.2009 - 20:14 Uhr

Hallo,

grundsätzlich gibt es zu SELECT auch eine WHERE-Klausel. Wie diese beim Zugriff auf Excel aussehen kann, weiß ich allerdings nicht. Wenn die Daten bereits in der DataTable sind, kannst du mit DataView oder BindingSource filtern.

Jürgen

16.09.2009 - 13:58 Uhr

Hast du auch DataGridView: Master/Detail über ComboBox untersucht? Jürgen