Laden...

Forenbeiträge von juetho Ingesamt 3.331 Beiträge

27.09.2016 - 12:53 Uhr

Danke für die Hinweise. Ich habe deine (sheitman) Vorschläge eingearbeitet.

Bei der Gelegenheit habe ich die Anzeige der Anwendung etwas erweitert, sodass man Ostersonntag und Buß- und Bettag für ein "beliebiges" Jahr direkt prüfen kann. Damit kommen solche Fehler hoffentlich nicht mehr vor.

Ich wundere mich, dass ich den Buß- und Bettag nicht kontrolliert hatte. Ebenso wundere ich mich über die Convert-Anweisung beim Ostersonntag; solche Konstruktionen hatte ich eigentlich schon vor neun Jahren als schlechten Stil abgelehnt. Besser spät als nie korrigieren!

Die Version von Feiertage.zip habe ich entsprechend ergänzt.

14.07.2016 - 16:28 Uhr

Wichtiger Hinweis: Die vorstehende Berechnung genügt nicht: Zwei Ausnahmeregeln wurden bei den obigen Lösungen nicht in die Gaußsche Formel eingearbeitet. Der Ordnung halber folgt hier die berichtigte Berechnung:


	/// <summary>
	/// Errechnet das Datum des Ostersonntags aus dem übergebenen Jahr
	/// </summary>
	/// <param name="jahr">Das Jahr YYYY als integer-Wert</param>
	/// <returns>Das errechnete Datum des Ostersonntags in dem angegebenen Jahr</returns>
	private DateTime GetOstersonntag(int jahr) 
	{
      int x = jahr;   // das Jahr
      int k;          // die Säkularzahl
      int m;          // die säkulare Mondschaltung
      int s;          // die säkulare Sonnenschaltung
      int a;          // der Mondparameter
      int d;          // der Keim für den ersten Vollmond im Frühling
      int r;          // die kalendarische Korrekturgröße
      int og;         // die Ostergrenze
      int sz;         // der ersten Sonntag im März
      int oe;         // die Entfernung des Ostersonntags von der Ostergrenze
      int os;         // das Datum des Ostersonntags als Märzdatum (32.März = 1.April)
      int OsterTag;
      int OsterMonat;
      
      k = x / 100;
      m = 15 + (3 * k + 3) / 4 - (8 * k + 13) / 25;
      s = 2 - (3 * k + 3) / 4;
      a = x % 19;
      d = (19 * a + m) % 30;
      r = (d + a / 11) / 29;
      og = 21 + d - r;
      sz = 7 - (x + x / 4 + s) % 7;
      oe = 7 - (og - sz) % 7;
      os = og + oe;
      
      OsterMonat = 2 + (int)(os + 30) / 31;
      OsterTag = os - 31 * ((int)OsterMonat / 4);
    
      return Convert.ToDateTime(OsterTag.ToString() + "." + OsterMonat + "." + jahr);
	}

Auf diesen Fehler wurde ich kürzlich durch eine Änderung bei der Wikibooks-Algorithmensammlung aufmerksam gemacht.

Die hier stehende Version von Feiertage.zip habe ich entsprechend ergänzt.

Quelle: Gaußsche Osterformel (mit Ergänzung)
Hinweis: Der letzte Beitrag bei Osterformel nach Carl Friedrich Gauß enthält die vollständige Lösung.

Nachtrag: Die Anlage Feiertage.zip wurde ersetzt durch die korrigierte Version in meinem nächsten Beitrag (27.09.2016).

14.03.2016 - 09:36 Uhr

Mal wieder. Dabei stelle ich fest, dass ich vieles vergessen habe und hier erfolgreich suche - teilweise auch in meinen Beiträgen fündig werde.

13.03.2016 - 10:21 Uhr

Nur der Vollständigkeit halber:

eigenartig, dass so einfache dinge nicht "ordentlich" funktionieren,...

Ich bin gerade auch über das Problem gestolpert und habe hier die Lösung (KeyPress-Code von rechner) gefunden. Ich war ebenfalls überrascht, aber .NET arbeitet "as designed", siehe TextBoxBase.ShortcutsEnabled:

The TextBox control does not support the CTRL+A shortcut key when the Multiline property value is true.

Es ist schön, dass über myCSharp eine einfache Lösung zu finden ist. Jürgen

04.08.2010 - 09:04 Uhr

Was ist ein XSD Befehl? xsd ist XML-Schema, also die Festlegung wie ein XML-Dokument aussehen soll. Was du mit "aus DLL generieren" meinst versteh ich grad nicht.

Es gibt beides: Zum einen ist xsd eine Extension für ein xml-Dokument, das die Struktur eines DataSet beschreibt. Zum anderen gibt es xsd.exe, das daraus eine Designer.cs-Datei erstellt. Das ist aber "nur" ein typisiertes DataSet, kein TableAdapter.

Den TableAdapter selbst lehne ich ab: Bei diesem Datenmonster sind viel zu viele Abläufe versteckt, sodass man nicht weiß, was eigentlich passiert. Deshalb kann ich nichts dazu sagen, wie man auch xsc und xss bekommt. Ich befürchte, dass dies in der fertigen DLL nicht mehr enthalten ist, weil es um die Steuerung des Designers geht und nicht um die Laufzeit.

Gruß Jürgen

28.07.2010 - 20:27 Uhr

Die bisherigen Erklärungen sind völlig korrekt. Aber dein Code hat mit der Fehlermeldung wenig zu tun; deshalb können die Erklärungen nicht vollständig sein. Es fehlt der Hinweis darauf, woher thisRow eigentlich kommt (jedenfalls kann ich nichts erkennen). Jürgen

Siehe auch [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen) in den FAQ, also auch Wie poste ich richtig? 1.1 Erst suchen und in die Doku schauen, dann posten

15.07.2010 - 17:47 Uhr

[FAQ] Wie finde ich den Einstieg in C#?; in den FAQ sowie mit 🛈 📗 gibt es weitere Hinweise.

Jürgen

12.07.2010 - 13:07 Uhr

Und beachte auch Wie poste ich richtig? 2.2 Keine Crossposts wie dort. Jürgen

12.07.2010 - 09:11 Uhr

Kann es sein das die Update Methode von MySqlDataAdapter einen benutzt, und diesen aus irgenteinen Grund nicht mehr schließt.

Es ist denkbar, weil der DbDataAdapter auch den Erfolg des Speichern prüft. Das könntest du über den .NET Reflector kontrollieren.

Desweiteren stimmt das überhaupt so mit dem UpdateCommand?

Nein. Wenn du den UPDATE-Befehl manuell zuweist, muss er genau dem SQL-Befehl entsprechen, also mit SET, den Spalten und den Werten (natürlich als Parameter). Einfacher ist es, einen SELECT zuzuweisen; dann kann der DbDataAdapter sich die Speichern-Befehle in der Regel selbst erstellen (sofern der SELECT die Voraussetzungen erfüllt: kein JOIN, mit PrimaryKey).

Auserdem ist mir grad noch aufgefallen das es nur bei Tabellen geschieht wo es auch Änderungen gab.

Natürlich, so arbeitet die Update-Methode des DbDataAdapter, wie in :rtfm: beschrieben wird.

Alles zusammen ist das ein Grund mehr, sowohl DbConnection als auch DbDataAdapter in einem using-Block zu kapseln.

Gruß Jürgen

05.07.2010 - 11:57 Uhr

was die Ungenauigkeiten angeht, hab ich das nun so verstanden das es bei solchen Berechnungen besser wäre direkt auf decimal zurückzugreifen?

Nein, eher nicht. Beim BMI kommt es (anders als in der Buchhaltung) nicht auf Genauigkeit an; da passen double-Werte. Du musst nur bei den Vergleichen aufpassen, also dich nicht auf exakte Gleichheit verlassen.

Jürgen

05.07.2010 - 11:47 Uhr

Wenn du nicht sagst, was und wie du es versucht hast, kann niemand konkret helfen. Siehe Wie poste ich richtig? Punkt 5

Aber generell gilt: Wie poste ich richtig? 1.1 Erst suchen und in die Doku schauen, dann posten. Denn es gibt [FAQ] Kommunikation von 2 Forms (wie auch Jack sagt).

Wundere dich deshalb nicht, wenn diese Diskussion geschlossen wird. Jürgen

04.07.2010 - 13:48 Uhr

Hallo,

wie das Formatieren des SELECT helfen soll, ist mir schleierhaft. Aber es gibt andere Möglichkeiten: Unter connectionstrings wird **OleDb **statt Odbc empfohlen. Die dort ebenfalls genannte Schema.ini bietet auch Möglichkeiten, wie Felder formatiert werden können.

Außerdem findet man z.B. unter codeproject fertige CsvReader.

Jürgen

29.06.2010 - 12:53 Uhr

Mit welchem Character Set arbeitet die Tabelle? Steht dafür die von dir genannte ID 273? Kannst du feststellen, für welchen Zeichensatz das steht?

beim Insert geht er auf eine Exeption

Hier gilt immer: welche denn?

Jürgen

25.06.2010 - 09:16 Uhr

Siehe [Tutorial] Das neue Konfigurationsmodell im .NET Framework 2.0

Und als Ergänzung: zuerst FAQ und Artikel lesen, dann suchen, dann posten!

Jürgen

24.06.2010 - 09:16 Uhr

ich glaube nicht dass ein Grid das macht, wenn man einen Reader als DataSource einhängt.

Auch dafür hilft ein Blick in :rtfm: DataGridView.DataSource ist zwar als object deklariert, aber aus den Beschreibungen geht hervor, dass der Typ zu einem der folgenden Interfaces passen muss:*The **IList **interface, including one-dimensional arrays. *The **IListSource **interface, such as the DataTable and DataSet classes. *The **IBindingList **interface, such as the BindingList<(Of <(T>)>) class. *The **IBindingListView **interface, such as the BindingSource class.

Damit und mit dem Hinweis von chilic ist klar, dass der DbDataReader das nicht leisten kann: Der ist etwas, was "abläuft", als Liste wird etwas Fertiges, Statisches benötigt.

@Doltsche
Lösung 1: Es wird eine geeignete Liste erzeugt und beim Auslesen des DbDataReaders manuell mit Inhalt gefüllt.
Lösung 2: Mit einer Methode wird das Ergebnis des DbDataReaders direkt in eine DataTable gepackt. Es gibt eine solche Methode, ich vergesse aber immer wieder, wie sie heißt. Also die Suche bemühen...
Lösung 3: Erstelle eine **DataTable **und benutze zum Abholen der Daten DbDataAdapter.Fill(thisTable).

Gruß Jürgen

20.06.2010 - 10:28 Uhr

Hallo,

die Stiftung Warentest hat im Heft 3/2009 einen Test für Farbdrucker veröffentlicht und dabei auch einige Zahlen genannt.

Gruß Jürgen

11.06.2010 - 15:16 Uhr

Wieso WM-Fieber? Die Fußball-WM findet doch erst 2011 in Deutschland statt. Dann bekommen wir attraktiven Fußball zu sehen. Jürgen

08.06.2010 - 11:30 Uhr

Nur hierbei ist das Problem das in der Collection keine Spalte ID vorhanden ist, denn die stammt ursprünglich aus einem DataGridView.

Wenn das wirklich so ist, dann hast du womöglich einen Grundsatz von .NET nicht verstanden: (Trenne Daten und Anzeige!

Wenn du Daten per Code bearbeiten willst, dann solltest du immer eine Datenmenge bearbeiten. Beim DataGridView steckt oft (nicht immer, nicht unbedingt) eine DataTable dahinter. Bearbeite diese, dann verschwinden eine Menge Probleme im Nirwana. Lediglich das Umwandeln von DataGridViewRow (nämlich aus den SelectedRows) nach DataRow sieht wegen mehrfacher Konvertierungen etwas umständlicher aus.

Wenn du in einer Datenzeile eine ID brauchst, dann benutze sie doch. Ob sie im DGV angezeigt wird oder nicht, ist (siehe oben) nebensächlich.

Jürgen

02.06.2010 - 09:23 Uhr

Auch wenn das Thema eigentlich erledigt ist: Eine Einführung in den Zusammenhang von DataSet und TableAdapter findest du im OpenBook VC# Kap. 30.

Gruß Jürgen

01.06.2010 - 11:15 Uhr

"Löschen" verschiebt eigentlich nur in den Papierkorb. Öffne diesen, dann kannst du sie vielleicht wiederherstellen. Jürgen

28.05.2010 - 13:56 Uhr

Hallo Robert und willkommen,

... oder noch besser eine Lösung ganz ohne Treiber.

Da dBase eine relativ einfache Datenstruktur benutzt, könnte man das Einlesen sogar selbst programmieren. Voraussetzung ist natürlich, dass es sich nicht pro Vorgang um Millionen Daten handelt und sie nur gelesen werden müssen.

In deinem Fall dürfte es sich um eine einzige Tabelle handeln (oder um einige wenige), sodass die Struktur selbst nicht analysiert werden muss, sondern feststeht. Aus der dbf-Version ergibt sich die Größe des Dateikopfs, der überlesen werden kann; aus der Tabellenstruktur ergibt sich die Größe eines Datensatzes, der blockweise eingelesen, aufgeteilt und in einzelnen Datenfeldern (DataTable oder List<T>) registriert werden kann.

Ich kann mir sehr gut vorstellen, dass eine solche Lösung unter CodeProject schon zu finden ist.

Gruß Jürgen

27.05.2010 - 11:39 Uhr

Erzähl mir was neues :evil:

Wenn du vorher behauptet hast, dass du "keine connectionStrings o.ä." benutzt, dann hat Jack dir offensichtlich etwas Neues erzählt.

Das man mit Delete() und Remove() arbeiten kann ist bekannt,

Auch dazu gibt es etwas Neues: Remove in der DataTable hilft überhaupt nichts; solche Datensätze sind sofort in der betreffenden DataTable verschwunden und können vom TableAdapter nicht in der Datenbank entfernt werden. Das klappt nur mit Delete, aber nicht mit Remove.

dachte es gibt nur eine geschicktere Lösung um alles auf einmal zu löschen.

Dann verwende das, was du kennst:

In SQL gibt es den Befehl TRUNCATE TABLE aber wie kann man diesen Befehl in meinem Fall übergeben?

Die Antwort lautet natürlich:

die Möglichkeit über SqlCommand.

Dafür ist SqlCommand vorgesehen: Jeder SQL-Befehl kann damit ausgeführt werden.

Bitte etwas weniger Überheblichkeit und etwas mehr Nachdenken über Antworten! Jürgen

26.05.2010 - 16:27 Uhr

Hallo Andre,

du willst eine bestimmte Situation analysieren. Unter Windows geht das mit Ereignissen; das DGV hat ein Ereignis, das eintritt, wenn die (bisher aktive) Zeile verlassen wird. Dieses Ereignis hat (wie viele andere DGV-Ereignisse) in speziellen EventArgs den Verweis auf die (bisher aktuelle) Zeile und Spalte. Du musst also CurrentCell passend festlegen.

Achtung: Wenn du nicht aufpasst, wird dadurch erneut dieses Ereignis ausgelöst. Vielleicht musst du noch einen Zwischenwert speichern und die neue Zelle erst in einem späteren Ereignis festlegen.

Gruß Jürgen

19.05.2010 - 10:05 Uhr

Hallo,

wenn du dich mit OOP beschäftigen willst (und das ist immer wichtig und richtig, erst recht mit .NET), dann musst du auch "richtig denken": Eine Klasse soll ein Objekt der Wirklichkeit abbilden. Also solltest du zuerst darüber nachdenken, welchen Teil der Wirklichkeit du behandeln willst: eine Datei oder eine Textzeile oder nicht eher einen bestimmten Sachverhalt oder...

Dann geht es weiter: Welche Eigenschaften haben diese Objekte? Welche Aktionen können diese Objekte vornehmen, welche Aktionen macht ein Benutzer damit?

Auf diese Weise kommst du sozusagen zwangsläufig zu einer Klassenstruktur.

Ich kann keinen Sinn darin erkennen, eine Textdatei als eigene Klasse zu definieren. Es wird schon (je nach Programmsituation) von .NET als Stream, als Folge von Zeilen oder als String-Array zur Verfügung gestellt. Damit kann alles erledigt werden, was denkbar ist. Eine eigene Klasse ist doch nur dann sinnvoll, wenn der Inhalt der Textdatei einen besonderen Teil der Wirklichkeit beschreibt.

Gruß Jürgen

18.05.2010 - 08:38 Uhr

Naja aber Hans Wurst in der Datenbank, ist doch aber auch Hans Wurst in der Ausgabe? 😃

Aber für diverse Unicode-Zeichen, die hier gar nicht dargestellt werden können, gilt das nicht. Schon "ÄÖÜß" werden je nach CharSet unterschiedlich gespeichert (mit 1 oder 2 Bytes). Aber MaxLength ist natürlich trotzdem der richtige Weg. Jürgen

17.05.2010 - 11:55 Uhr

Eigenschaften Color.R, Color.G, Color.B...

Mann, war ich blind. Ich hatte es vage in meiner Erinnerung, habe aber nur die Methoden und nicht die Eigenschaften durchgelesen. Jürgen

17.05.2010 - 09:13 Uhr

So pauschal lässt sich das nicht beantworten. Es hängt von Art, Umfang und Zusammenhang der Daten ab. 1,5 GB nur mit Zahlen? Gibt es keine Zusammenhänge der Werte? Wie soll das in DB-Tabellen abgebildet werden? Dann kann die DB zwar schnellere Zugriffe liefern, aber es kann kaum Speicherplatz eingespart werden.

Außerdem kommt so eine Frage immer wieder vor. Benutze die Forumssuche mit vielen verschiedenen Suchbegriffen (Datenbank, Textdatei, Einstellungen, speichern usw.).

Gruß Jürgen

PS. Die deutsche Rechtschreibung kennt Groß- und Kleinschreibung. Dies ist keine Quälerei für Schüler, sondern dient dem Leser zum besseren Verständnis.

17.05.2010 - 09:08 Uhr

Zur Frage der RGB-Anteile: Es gibt die Methode Color.ToArgb. Laut :rtfm: sollten die Bestandteile durch mehrfache Division und Modulo-Operation mit 256 zu erhalten sein.

Jürgen

PS. Es heißt Standard, nicht Standart!

14.05.2010 - 17:26 Uhr

Außerdem musst du dich mit der **Gültigkeit **von Variablen befassen. Wenn du in Main einen Spieler deklarierst und erzeugst, weiß keine andere Stelle des Programms etwas davon. Wo und wie wird eigentlich das Formular erzeugt und aufgerufen?

Nebenbei sollten Bezeichner wie Form1 und textBox1 verboten werden, siehe .NET Richtlinien für Namen oder als Kurzfassung Namenskonventionen

Gruß Jürgen

14.05.2010 - 12:07 Uhr

Zum Löschen aller Datensätze gibt es (im Prinzip, also im SQL-Standard) den TRUNCATE-Befehl. Aber auch dann kann die Existenz von ForeignKeys das Löschen ausbremsen.

Gruß Jürgen

@spacenet (nächster Beitrag)
Das hatte ich befürchtet; vorsichtshalber hatte ich "im Prinzip" geschrieben. 😁

12.05.2010 - 15:04 Uhr

Am besten aus meiner Sicht wäre es dir eine eigene Textbox Control zu erstellen indem du dich von einer Standard TextBox ableitest ... Dann musst du gar nichts mehr machen, sondern kannst die Textboxen so verwenden.

Die **MaskedTextBox **kann das von Haus aus.

Zur Eingangsfrage "gleiche Funktionalität" ist frischs Antwort die wichtigste und richtigste.

Jürgen

12.05.2010 - 08:41 Uhr

Alternativ geht es in eine DataTable mit **Oledb **so, wie unter connectionstrings beschrieben, Stichwort TabDelimited.

Gruß Jürgen

09.05.2010 - 12:58 Uhr

Die Speedski-Saison ist vorbei, und unser PowerUser gfoidl hat seinen Erfolg vom Vorjahr wiederholt. Seine Saison-Erfolge sind hier nachzulesen.

Sobald er sich von den sportlichen Strapazen erholt hat, kann Günther seinen Geist wieder den Problemen der Programmierer widmen.

Alles Gute! Jürgen

05.05.2010 - 12:56 Uhr

Wie wäre es mit MAX(ID) ohne Order By und RowNumber? Da sollte Oracle schlau genug sein und erkennen, dass genau ein Wert zurückgeliefert wird, sodass es in der ON-Klausel verwendet werden kann.

Gruß Jürgen

05.05.2010 - 08:53 Uhr

Hallo,

Erfinder und Chip haben schon die richtigen Antworten gegeben: Das DataGridView ist (wie der Name schon sagt) dazu da, dass Daten in einem Grid zur Anzeige gebracht werden. Wenn du die Daten per Code bearbeiten willst, musst du die Daten benutzen, also die DataTable.

Versuche ich nun über BindingSource oder DataTable neue Zeile hinzufügen, erscheint die Fehlermeldung: Die Spalte xy lässt keine nullen zu.

Eine datengebundene Zeile kann nur dann im DGV erscheinen, wenn sie in der Datenmenge enthalten ist. Also ist der richtige Weg:*DataTable.NewRow *default-Werte eintragen, soweit erforderlich *DataTable.Rows.Add

Wenn die Zeile später wieder gelöscht wird (durch einen Rückgängig-Button oder wie auch immer), landet sie auch nicht in der Datenbank.

Das ist also wirklich der korrekte Weg. Jürgen

04.05.2010 - 18:10 Uhr

Und das sieht dann sehr nach [FAQ] Kommunikation von 2 Forms aus, wobei das genauso gilt für "Klasse und Form". Jürgen

04.05.2010 - 12:48 Uhr

Und Zeilenumbrüche? Wenn die nicht vorhanden sind, kann der Browser die Zeilen nicht anders darstellen.

Sollte der Befehl insgesamt zu lang sein? Welche Oracle-Version benutzt du denn?

Jürgen

04.05.2010 - 12:40 Uhr

ich habe keine DataTable so erstellt.

Doch, nämlich hier:

[cs]adapterBuch.Fill(ds, "Buch");[/cs]

mit der formel habe ich mich falsch ausgedrückt. Mein Fehler!
eigendlich meinte ich es so:
ich erstelle eine formel:
spalte.cell x in tab1 + spalte.cell y in tab 3 = (tab8)
und wende das dann auf mehrere datensaätze an. halt excel;-)

Hmm, das verstehe ich auch nicht besser. Wann, wo und wie entsteht die Formel, wann, wo und wie wird sie registriert, wann und wo soll sie angewendet werden, wo soll das Ergebnis gespeichert werden?

Willst du ein Programm wie Excel nachbauen? Oder hast du eine bestimmte Funktionalität? Es ist etwas anderes, ob du Formeln für dich selbst verwenden willst, ob du ein Programm für dich dazu baust oder ob Endanwender damit variabel arbeiten wollen/sollen.

Jürgen

PS: Franks Hinweise sind natürlich zu beachten.

03.05.2010 - 11:20 Uhr

Hallo und willkommen,

du musst dich dringend verabschieden von der Vorstellung, dass du Daten mit dem DataGridView bearbeitest. Das DataGridView ist (wie der Name schon sagt) dazu da, dass Daten in einem Grid zur Anzeige gebracht werden. Wenn du Daten per Code bearbeiten willst, dann musst du auch die Daten bearbeiten - also die sieben DataTables - und nicht ihre Anzeige. Nebenbei: Es gibt keinen Grund, dafür sieben DataSets zu verwenden; du kannst alle DataTables in einem zusammenfassen.

Etwas "berechnen" geht über DataTable.Compute, die Syntax dazu findest du unter :rtfm: DataColumn.Expression.

kann ich diese formel irgendwie runterziehen

Keine Ahnung, wo du eine Formel herunterziehen willst. Die musst du (oder der Anwender) doch irgendwo definieren? Und was ist mit "dieser Formel" gemeint? Soll eine Formel für eine ganze DataTable benutzt werden?

sodas er automatisch die berechnung macht (wie in excel).

Naja, auch in Excel gibt es getrennt einen Formel-Editor (nämlich die Eingabezeile oder einen Dialog). Die Formel selbst wird in der Tabelle gespeichert, aber ausdrücklich als Formel gekennzeichnet und nicht als Wert.

Dieses Verhalten müsstest du nachbauen; du brauchst also irgendwo eine Stelle (je nachdem eine weitere DataTable oder eine List<string> oder was auch immer), wo die Formel als solche registriert wird, sinnvollerweise in der Expression-Syntax.

Das "automatische Berechnen" musst du in ein geeignetes DataTable-Ereignis legen. Was geeignet ist, hängt von der Art der Formel ab (Bezug auf Zeilen oder Spalten oder Tabelle). Das Ergebnis kann dann natürlich in einer achten DataTable landen (und in einem weiteren DGV angezeigt werden).

Also die Empfehlung: nur mit den Daten arbeiten und genau planen, was wo wie passieren soll.

Gruß Jürgen

PS. Die deutsche Rechtschreibung - mit Groß- und Kleinschreibung und Satzzeichen - ist nicht gedacht als Quälerei für Schüler, sondern dient dem Leser beim Verständnis eines Textes. Du willst Hilfe, also solltest du das Verständnis erleichtern und nicht erschweren.

01.05.2010 - 12:11 Uhr

Nein, keine richtige Lösung. Ich frage nur manche Controls ab und benutze notfalls das 1.1-Verfahren. Jürgen

01.05.2010 - 10:33 Uhr

Unter Output-Klausel steht zwar mehrfach "Das folgende Beispiel...", aber bei mir wird kein Beispiel angezeigt. Probiere einmal folgende Variante:

INSERT INTO Datenbank (Anlage, Anleger) 
   OUTPUT INSERTED.[ID] into @RC
   VALUES (@Anlage, @Anleger)

Gruß Jürgen

PS. Khalids Beitrag, der gekommen ist, während ich dies schrieb, bestätigt meine Vermutung.

01.05.2010 - 09:06 Uhr

Hallo Stefan,

  • geht aber leider nicht.

Das ist doch keine vollständige Problembeschreibung. Wird der Insert nicht ausgeführt? Gibt es eine Fehlermeldung? Wird kein Wert zurückgeliefert? Oder ein falscher Wert?

Außerdem: Wo und wie werden der SP-Aufruf und die Auswahl des Rückgabewertes festgelegt? Um welches DBMS handelt es sich?

Fragen über Fragen... Jürgen

30.04.2010 - 17:23 Uhr

Hallo herbivore,

ja, das könnte sein. Da das Framework bei Win7 automatisch installiert wird, bin ich davon ausgegangen, dass es auch die Sprache des Betriebssystems berücksichtigt. Ich habe jetzt die Verzeichnisse angeschaut. Das DE-Verzeichnis gibt es unter 3.5, enthält aber nur 5 DLLs, während das DE-Verzeichnis von 2.0 viel voller ist (45 Dateien mit 5 MB).

Mal sehen, was der MS-Download anbietet.

Danke schonmal für den Hinweis! Jürgen

// Edit 01.05.2010 nach 12:00 Uhr
Microsoft .NET Framework 3.5 SP1 Language Pack bietet 3 Dateien zum Download an: dotnetfx35langpack_x64de.exe, _x86de.exe und _ia64de.exe. Aber in allen Fällen wird die Installation verweigert:

Microsoft .NET Framework 3.5 SP1 Language pack wird in dieser Version von Windows nicht unterstützt.

Es scheint komplexer zu sein. Ich versuche es deshalb nun doch in einem MSDN-Forum. Jürgen

30.04.2010 - 17:04 Uhr

Hallo Marc,

kann ich .... die Zeilen irgendwie rücksetzen.

Natürlich nicht, jedenfalls nicht mit dem StreamWriter. Was geschrieben ist, ist geschrieben, also bereits auf der Festplatte gelandet. (Das gilt natürlich nur bedingt, es befindet sich um Schreibpuffer; aber du hast keinen Zugriff mehr darauf.)

Kann ich das ganze in eine foreach-Schleife packen

Nein, so geht das nicht, weil foreach alle Elemente einer Collection durchläuft. Aber es spricht doch nichts dagegen, eine for-Schleife zu verwenden. Dann musst du lediglich aufpassen, dass die Indizes nichts ins Leere laufen.

Für die Variable _tmp _vermisse ich übrigens eine Deklaration und Initialisierung. Ist das dein Zeilenzähler?

Das Schreiben machst du dir erheblich leichter, wenn du die Überladung von **WriteLine mit Format-String **verwendest.

Übrigens solltest du in der Kopfzeile Leerzeichen vermeiden; das könnte das Einlesen der csv-Datei in einem anderen Programm erschweren.

Nebenbei:

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.

Gruß Jürgen

/Edit
Mein Beitrag war schon fix und fertig; herbivore war nur ein paar Sekunden schneller, weil ich das Zitat erst suchen musste.

30.04.2010 - 16:03 Uhr

Hallo,

vor kurzem bin ich mit einem neuen Notebook auf Win7 (Home Premium 64 bit) umgestiegen. Die SDK-Doku möchte ich weiterhin vorzugsweise im DocumentExplorer studieren, auch wenn ich in irgendeinem Forum einen Hinweis gelesen habe, dass dieser von MS zum Auslaufmodell erklärt wurde (immer mal was Neues...) Leider will er nur Englisch anzeigen; aber Deutsch kann ich nunmal erheblich besser. 😁

Der DocumentExplorer bietet eine Einstellung unter: Tools >> Options >> International Settings. Bei "Language" stehen zur Auswahl "English" und "Same as Microsoft Windows", bei mir also Deutsch. Wenn dies ausgewählt wird, kommt eine MessageBox mit:

Changes to the language setting will not take effect until the environment is restarted.

Aber trotz mehrfachem Neustart bleibt Englisch die Sprache der Stunde.

Eine Email an DevDocs@Microsoft.com hat eine automatische Eingangsbestätigung bekommen, aber sonst (natürlich) keine Reaktion.

Hat von euch jemand einen Tipp für mich oder auch eine andere Email-Adresse, über die tatsächlich Antworten erfolgen?

Recht herzlichen Dank! Jürgen

30.04.2010 - 15:43 Uhr

Einrücken hab ich leider nicht hinbekommen.

Na, einfach mit ein paar Leerzeichen, z.B. so:

SELECT
   cartable.id,
   cartable.internal_sign,  /* usw. */
FROM cartable
   LEFT JOIN ordertable 
        ON ordertable.id = 
             (SELECT ordertable.id 
                FROM ordertable 
               WHERE ROWNUM=1 
                 and ordertable.cartable_id = cartable.id 
                 AND ordertable.status = 5 
                 AND (ordertable.msg_type > 1 
                      AND ordertable.msg_type <5) 
               ORDER BY id DESC)
   LEFT JOIN eventtable /* usw. */

Dann sieht man schon: Beim letzten AND hier sind die Klammern überflüssig, es ließe sich auch durch BETWEEN AND ersetzen.

_Ich habe aber jetzt keine Lust, deinen Code komplett zu formatieren. _Du kannst deinen letzten Beitrag einfach editieren.

Ich vermute den Fehler irgendwo bei den Left joins, aber sicher bin ich mir nicht.

Das ist in der Tat anzunehmen wegen der Fehlermeldung "rechte Klammer fehlt", weil es nur dort Klammern gibt - es sei denn, dass dein Code irgendwo eingebunden ist, wo weitere Klammern verwendet werden.

Jürgen

30.04.2010 - 15:34 Uhr

Hallo,

lies einmal Formular/Control drucken oder als Bitmap speichern durch. Dort gibt es ein paar Anmerkungen zu "problematischen" Controls.

Gruß Jürgen

30.04.2010 - 11:49 Uhr

Außerdem wäre es hilfreich, beim Code die Zeilen einzurücken und noch ein paar Zeilenumbrüche mehr vorzusehen. Dann ist besser erkennbar, was wie zusammengehört.

Jürgen

/Edit: Der Code ist korrekt als Code markiert, aber trotzdem nicht gut genug lesbar.

30.04.2010 - 07:14 Uhr

Dann habe ich nur noch die Idee, dass CellValueChanged wirklich ungeeignet ist. Setze den Update-Befehl mal in einen Button-Click, der nach dem Wechsel der Zeile ausgelöst wird. Wenn dann immer noch nichts passiert, liegt es irgendwo an den Adapter-Befehlen.

Beispiel: Entsteht die DataTable durch einen JOIN, oder fehlt der PrimaryKey in den Spalten? Dann sind automatisch erstellte UPDATE-Befehle nicht möglich.

Gruß Jürgen

29.04.2010 - 20:51 Uhr

Könnte es sein, dass für die Datenbank bei jedem Programmstart die ursprüngliche Version genommen wird? Schau einmal unter "Eigenschaften" und "lokale Kopie" und "Kopieren wenn neuer" nach.

Jürgen