Laden...

Forenbeiträge von MillionsterNutzer Ingesamt 235 Beiträge

01.11.2010 - 17:42 Uhr

Hi fz!

Hmm, seltsam das der Test den richtigen Wert enthaelt waehrend das Value noch falsch ist...

Zusaetzlich muss ich nun den Text erst wieder in eine Zahl konvertieren - aber wenigstens ist das Problem umgangen.

Danke fuer den Hinweis!!!

VG

Ralf

01.11.2010 - 16:45 Uhr

Hi!

Mein Problem laesst sich recht einfach nachbauen: In einem Testprojekt habe ich ein NumericUpDown-Control und einen Button. Beim Klick auf den Button wird der Wert des NUD in einer MessageBox ausgegeben.

Wenn ich nun in das NUD den Wert 4,5 eingebe und direkt den Button klicke wird in meiner MessageBox der Wert 4,5 ausgegeben waehrend in der NUD selber der Wert 4,5 schon auf 5 aufgerundet wurde (da die Anzahl der Dezimalstellen ja auf 0 steht standardmaessig).

Eigentlich haette ich erwartet, dass der vom Benutzer eingegebene Wert erst validiert wird bevor ich mit dem Value-Poperty darauf zugreife.

Kann ich diese Validierung irgendwie erzwingen?

Viele Gruesse

Ralf

17.09.2010 - 16:24 Uhr

Hi Spike!

Danke fuer den Link!

Du hast natuerlich Recht: mdf war SQL SErver mdb war Access...
Hab das verwechselt...

VG

Ralf

17.09.2010 - 13:45 Uhr

Hi Spike!

Blaeht sich die Access-DB nicht nach einer Zeit auf? Was musst du bei deinen Setups mitliefern, damit der Zugriff problemlos von statten geht?

Um ehrlich zu sein fallen mir auch keine wirklichen Argumente gegen eine mdf-Datei ein, allerdings habe ich das Ganze ja auch noch nie benutzt.

VG

Ralf

16.09.2010 - 15:35 Uhr

Hi Bernd!

Wenns nicht geht dann SSCERuntime_x86-DEU.msi installieren.

Sowas wollte ich eigentlich vermeiden... Nach dem Setup sollte die Datenbank in 99% aller Faelle funktionieren - sonst hab ich nicht viel gewonnen.

Ich werde versuchen ob ich in den naechsten Tagen mal mit SQL Server CE spielen muessen. Mal sehen wie ich dazu komme...

VG
Ralf

16.09.2010 - 14:49 Uhr

Hi nochmal!

Die Installtionsszenarios die BerndFfm da beschrieben hat hoeren sich ja ziemlich abschreckend an. Ich dachte ich muss einfach nur ein par .dlls mehr mitliefern und gut ist... nun sieht es aber so aus, dass das ganze wirklich um einiges komplizierter ist. Hat da jemand von euch ausfuehrliche Erfahrungen? Ist das wirklich so schlimm?

SQLLite waere auch eine verlockende Alternative, allerdings schreckt mich der erhoehte Aufwand fuer die Anpassung ab. Wenn ich es richtig verstanden habe muesste ich bei der Verwendung von SQL CE lediglich die SQLConnection aendern - meine SQLCommands, SQLParameters und die Datentypen wuerden unveraendert bleiben - stimmt das?

VG

Ralf

15.09.2010 - 17:18 Uhr

Hi BerndFfm!

Danke fuer den Tip! Habe zwar schon frueher mal von der SQL Server Compact Edition gehoert, ich habe dabei aber immer an Windows Mobile gedacht und mich nie damit beschaeftigt.
Von dem was ich bisher gelesen habe sollte es fast schon die optimale Loesung fuer meinen Fall sein.

Access mochte ich auch noch nie so wirklich, aber wenn ich nur mit SQL darauf zugreife und sonst nichts damit anfange waere mir das ja voellig egal.

Ich werde mich auf jeden Fall noch weiter mit der Compact Edition befassen und bei Gelegenheit mal eine kleine TestApplikation schreiben!

Nochmals danke fuer den Hinweis!

Falls sonst noch jedmand was zu dem Thema zu sagen hat - nur zu...

Gruesse

Ralf

15.09.2010 - 16:40 Uhr

Hi!

Eine meiner Anwendungen legt alle ihre Daten momentan in einer SQL Server Datenbank ab. Da die Anwendung in letzter Zeit bei unterschiedlichen Kollegen und Kunden installiert wurde habe ich nun inzwischen einiges an Feedback bekommen und musste dabei feststellen das die meisten Anwender anfangs Probleme haben den SQL Server zu installieren und eine Datenbankverbindung herzustellen (es steht zwar alles detailliert in einer Doku - aber das juckt die nen Sch...). Daher ueberlege ich mir momentan wie ich diesem Sachverhalt ein wenig Abhilfe schaffen kann.

Die Anwendung selber hat keine riesen Mengen an Daten, muss keine Echtzeitprobleme loesen und hat auch keine wirklich komplizierten Operationen, daher ueberlege ich mir momentan ob der SQL Server vielleicht eher eine Option fuer Poweruser werden sollte waehrend die Standardinstallation einfach eine Art lokale Datenbank nutzt, so dass der Nutzer direkt starten kann ohne sich vorher mit dem SQL Server rumschlagen zu muessen.

Bei diesem Gedanken ist mir eingefallen dass es auch moeglich sein sollte Access-mdb-Dateien lokal als Datenbank zu verwenden ohne das Access selbst installiert sein muss. Da ich keine sonderlich komplizierten SQL-Kommandos nutze sollte es sogar moeglich sein einfach nur die SQLConnection auszutauschen, waehrend der Rest meiner Datenlogik die selbe bleibt, oder?

Bevor ich nun anfange mich grossartig in das Thema einzulesen wollte ich einfach mal in die Runde fragen, ob dieser Ansatz realistisch ist und ob vielleicht jemand von euch schon Erfahrungen (positive oder negative) damit gemacht hat.

Gruesse

Ralf

27.07.2010 - 17:18 Uhr

Hi MrSparkle!

Ich werde erst mal meinen ganzen anderen Kram erledigen und dann werde ich mir die Lists vorkoenpfen und durch Queues ersetzen.

Wie kann ich denn das unterste Element abfragen ohne es zu entfernen? Wie bei der List mit [0]?

Gruesse

Ralf

27.07.2010 - 16:33 Uhr

Hi @ all!

Danke fuer die schnellen Antworten.

Die List war schon vorher verbaut und bisher scheint es zu funktionieren. Ich habe die Queue-Klasse auch schon gesehen, aber noch nie zuvor verwendet und war mir nicht sicher ob es sinnvoll ist den Code umzuschreiben.

Im Prinzip muesste ich nur die List in eine Queue umschreiben und Add() mit Enqueue bzw. RemoveAt(0) mit Dequeue ersetzen, oder?

Gruesse

Ralf

27.07.2010 - 16:14 Uhr

Hi!

Ich haette eine Frage zur System.Collections.Generic.List<T>:

Ich habe ein Progamm bei dem die List als eine Art Queue verwendet wird. Konkret werden Produkte die einen Prozess durchlaufen mit .Add() hinzugefuegt und dann der Reihe nach wieder mit .RemoveAt[0] entfernt.
Kann ich bei der List ueberhaupt davon ausgehen das die korrekte Reihenfolge der Elemente beibehalten wird und nach dem FiFo-Prinzip das erste Element auch als erstes mit RemoveAt(0) wieder entfernt wird?

Bei der Doku wird nur auf die Sortierung eingegangen die List wird aber zu keinem Zeipunkt explizit sortiert, so dass ich eigentlich davon ausgehe dass die Produkte immer schoen der Reihe nach wieder entfernt werden.

Weis jemand von euch genau Bescheid bzw. hatte schon mal einen aehnlichen Fall?

Gruesse

Ralf

19.06.2010 - 20:03 Uhr

Hi fz7090!

Deine Idee ist eigentlich optimal für mich, allerdings weiß ich nicht so recht wie ich das am einfachsten anstelle.

Wenn ich die Selektion auf den Selctiontype abfrage dann können ja auch mehrere Werte aus der RichTextBoxSelectionTypes-Enum gleichzeitig gesetzt sein. Leider blick ich nicht so recht welche Syntax ich da nutzen muss (hatte so einen Fall noch nie - so seltsam das auch klingt). Der == Operator kommt ja nur in frage wenn nur ein Type gesetzt wäre, ich will ja aber abprüfen ob RichTextBoxSelectionTypes.Object und RichTextBoxSelectionTypes.Multiobject nicht enthalten sind...

Welchen Operator muss ich hierzu nutzen?

18.06.2010 - 19:56 Uhr

Hi herbivor!

Ich muss zugeben das die Beweislast erdrueckend ist also werde ich mich beugen und doch Tarions und deinem Rat folgen und versuchen vor dem Speichern des Inhalts diesen auf ungueltige Elemente zu pruefen.
Das heisst nun also, dass ich mich nun erstmal ins RTF einlesen kann 😦

Hat jemand Von euch schon mal eine Aehnliche Aufgabenstellung gehabt?

18.06.2010 - 18:39 Uhr

Hi Tarion!

Habe auch schon mit diesem Gedanken gespielt allerdings haette ich das Problem lieber an der Wurzel angepackt und das ist fuer mich eben die Eingabe.
Genauso waere es ja moeglich Strg+V abzufangen, aber das waeren eben Plan B + C.

Ich wollte hier einfach mal vorher die Gurus fragen, ob es da nicht irgend etwas elegantes gibt was ich uebersehen habe...

18.06.2010 - 16:31 Uhr

Hi!

Ich habe in meiner Anwendung eine Richtextbox zum formatieren von Text fuer labels. Leider haben findige User heruasgefunden, das man in die RTB noch ganz andere Sachen einfuegen kann ausser Text. So kann man die Label-Kombonente ganz toll zum abstuerzen bringen indem man Bilder ueber die Zwischenablage einfuegt.
Kennt jemand von euch eine elegante Moeglichkeit solche Eingaben abzufangen? Bin leider bisher nicht wirklich fuendig geworden...

Hat jemand von euch einen Tip fuer mich?

Viele Gruesse

Ralf

27.05.2010 - 16:30 Uhr

Hmm, nachdem sonst niemand mehr eine Idee hatte habe ich den Plan-B realisiert und mich an die Idee von der-schlingel gehalten.

Zwar aus meiner Sicht nicht wirklich elegant, aber aus Sicht des Nutzers gibt es kaum(!) einen Unterschied.

Vielleicht kommt mir ja noch eines Tages ein Einfall und dann ist das Control auch schnell ausgetauscht.

Danke fuer eure Hilfe - und falls doch noch jemand eine Idee hat: Bitte Melden!

Gruesse

Ralf

26.05.2010 - 20:42 Uhr

Hi BerndFfm,

bei deinem Vorschlag bleibt die Checkbox ja aktiv so dass das ganze gar nicht deaktiviert aussieht. Im Prinzip waere es das selbe Verhalten als ob ich AutoCheck auf False setzen wuerde.

Reicht mir nicht 😉

26.05.2010 - 20:40 Uhr

Hi der-schlingel!

Du meinst also ein UserControl das links eine Checkbox ohne text und rechts ein einfaches label enthaelt?
Raus kommen wuerde dabei tatsaechlich etwas das aussieht wie eine CheckBox die man readonly setzen kann. Aber die ReadOnlyCheckbox soll an vielen Stellen meines Codes verwendet werden, so dass es sich um ein "anstaendiges" UserControl handeln sollte. Dazu muesste ich aber erst die ganzen Eigenschaften und das Verhalten reinprogrammieren - Das ist zwar nicht viel doch auch nicht wenig.

Um ehrlich zu sein hatte ich auch schon an sowas Gedacht wuerde das aber lieber als Plan-B zureuck halten.

Am liebsten waere es mir wenn ich die ForeColor-Eigenschaft auch in Disabled-Modus setzen koennte - aber ich bin mir nicht sicher ob und wie so etwas von statten gehen koennte.

Gruesse

Ralf

26.05.2010 - 19:33 Uhr

Hi an alle!

Ich haette gerne eine Checkbox (WinForms) die readonly gesetzt werden kann. Soll heissen das zwar die Haekchenbox des Controls tatsaechlich ausgegraut wird und nicht vom User nicht mehr bearbeitet werden kann, der Text soll aber nach wie vor schwarz bleiben. Die Enabled-Property kommt also nicht richtig in Frage und die AutoCheck-Property verwirrt meines Erachtens den User zu sehr, da die Checkbox optisch immernoch aktiv aussieht.

Beim Googeln bin ich auf einige Zeitgenossen gestossen die sich schon an sowas versucht haben, letztlich hatte aber wohl keiner so richtig Erfolg. Ich denke es waere am sinnvollsten eine eigene CheckBox-Klasse zu entwerfen, von CheckBox abzuleiten und dann den OnPaint()-Event zu ueberschreiben - allerdings moechte ich keine eigenen Boxen und Haeckchen zeichen - nur der Text soll eben schwarz bleiben.

Hat jemand von euch einen Anhaltspunkt fuer mich wie ich das loesen koennte?

Gruesse

Ralf

14.05.2010 - 19:16 Uhr

Hi talla! Hi der-schlingel!

Danke fuer die schnellen Antworten! Der Haftungsausschluss ist fuer mich kein Problem, da es sich nur um ein Winforms-UserControl handelt welches etwas erweitert wurde. Das ist echt nix komplexes, aber ich will das Rad halt auch nicht neu erfinden muessen.
Was den Artikel zum Control angeht, dessen war ich mir bewusst. Mir geht es nur darum das ich den Author des Codes nicht gleich irgendwo dem Kunden gegenueber erwaehnen muss.
Ich werde die Komponente also einbauen - wie schon gesagt: Es ging mir nur nochmal darum, dass andere Leute den Text genauso verstehen wie ich.

Danke nochmals und viele Gruesse!

Ralf

14.05.2010 - 18:35 Uhr

Hi an alle!

Ich habe auf Code Project eine gute Komponente gefunden die ich auf Arbeit gerne verwenden wuerde. Die Komponente steht unter der "Code Project Open License (CPOL) 1.02". Leider habe ich es mit Rechtstexten nicht so (und schon gar nicht in englisch), aber vielleicht kann mir einer von euch helfen:

Kann mit jemand in Klartext sagen welche Einschraenkungen die CPOL fuer mich bedeudet, wenn ich diese Komponente tatsaechlich einbauen will?
Soweit ich den Lizenztext verstanden habe sollte ich keine Verpflichtungen oder Einschraenkungen haben - aber weil ich nix riskieren moechte frage ich lieber nochmal nach. Ich koennte wetten hier hat sich schon der ein oder andere mit dieser Lizenz auseinander gesetzt.

Viele Gruesse

Ralf

10.02.2010 - 15:17 Uhr

Nun, ich kann dir keine Loesung fuer dein Problem vorschlagen, da ich selber nicht die Zeit hatte es fuer mich zu loesen, aber prinzipiell musst du das Programm nicht anpassen.

Zwar musst du die neue (uebersetzte) .resx-Datei in VS einbinden und dort in eine Sattelite-dll umwandeln lassen. Deswegen musst du dem Kunden aber nicht gleich das ganze Programm wieder schicken - Es reicht wenn du ihm die generierte DLL schickst und er sie dann dementsprechend unterbringt...

Verstanden?

10.02.2010 - 14:37 Uhr

Hi milkman!

Die Ueberlegung hatte ich vor kurzem auch: Einfach die deutsche .resx- Datei nehmen uebersetzen und dann mit resgen.exe eine Ressourcen-Datei draus machen und dann mit AL.exe eine neue Sattelite Assembly erstellen. Das ganze dann im es Ordner beim Kunden einbauen und fertig.

Naja, theoretisch funktioniert das auch (hast ja die Antwort von TH69 gesehen), allerdings hab ichs nicht ganz hinbekommen. Letztlich habe ich die ueberstezte Datei einfach ins Projekt eingebunden, VS08 eine .dll daraus erstellen lassen und die dann dem Kunden geschickt.

Naja. Du kannst dir ja das angehaengte Projekt schnappen und damit rumspielen - letztlich wirst du es selber ausprobieren muessen.

Gruesse

Ralf

09.02.2010 - 19:36 Uhr

Hi JAck30lena!

Danke fuer den Hinweis - mir hat nur das Stichwort gefehlt, den Rest hat Google erledigt. In diesem Artikel bei CodeProject ist es ausfuehrlich beschrieben.

Danke fuer die Hilfe!!!

Gruesse

Ralf

09.02.2010 - 17:34 Uhr

Hi!

Ich habe die Texte meiner Anwengung in Ressourcen-Dateien (bzw. Satellite Assemblies) gepackt, so dass diese abhaengig von der aktuellen CultueInfo abgerufen werden.

Nun stellte sich jedoch raus, dass fuer das Loggen von Fehlern es sinnvoll waere sowohl die englische als auch die lokalisierte Meldung zu loggen. Gibt es eine Moeglichkeit einen Text aus einer Ressource zu holen ohne gleich die CultureInfo des aktuellen Threads ueberschreiben zu muessen?

Viele Gruesse

Ralf

03.02.2010 - 15:03 Uhr

Hi TH69!

Ich muss zugeben dass ich es ganz ohne die Hilfe von VS immer noch nicht hinbekomme, aber im Prinzip ist das in Ordnung.

Solange ich einen Uebersetzer dazu bringen kann eine "resx."-Datei in eine neue zu uebersetzten, kann ich mit Hilfe von VS die neue Sattelite Assembly erstellen und diese dann verteilen.

Mit dem Zeta Ressource Editor oder dem ResXEditor gibt es ja sogar zwei Tools die den Uebersetzer unterstuetzen.

Leider habe ich nicht die Zeit zu untersuchen was ich mit resgen.exe und al.exe anders mache als VS08, aber wie schon gesagt solange ich eine Loesung habe ist das in Ordnung.

Vielen Dank fuer deine Unterstuetung!!!

Ralf

03.02.2010 - 13:42 Uhr

Hi TH69!

Wollte gestern auch schon den Zeta Editor nutzen hatte aber bzw. habe aber Probleme beim downloaden/installieren.

Ich werde mich heute morgen als erste mal darum kuemmern, aber wahrscheinlich lag es daran, dass ich kein resgen genutzt habe!

Werde das Ergebnis spaeter noch posten. Bis dahin Danke!

Ralf

02.02.2010 - 16:26 Uhr

Hi Th69!

Ich checke vorher welche Sprachordner in meinem Stammverzeichnis vorhanden sind und biete diese in einer ComboBox zur Auswahl an. Das heisst wenn ich nachtraeglich ein "es"-Ordner mit der spanischen Ressourcen.dll in das Stammverzeichnis meiner Anwendung kopiere wird das dementsprechend erkannt und behandelt.

Die Moeglichkeit Dateien anzuhaengen hab ich vorher schlichtweg uebersehen 😕

Du kannst ja mal einen Blick reinwerfen wenn du willst.

02.02.2010 - 15:30 Uhr

Hi!

Ich muss eines meiner bestehenden Projekte (VS2008) nachtraeglich MultiLangugage tauglich machen und wollte dazu Ressourcendateien verwenden.

Ich habe ein kleines Testprojekt angelegt, in dem alle Texte einer Datei namens Lang.resx untergebracht sind, innerhalb des Codes werden die Strings dann z.B. wie folgt geladen:


this.Text = Lang.frm2Title;

Zusaetlich habe ich nun die Ressourcen Lang.de.resx und Lang.fr.resx hinzugefuegt. Wenn ich nun meine Sprache mit


Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr");

umstelle und die Texte erneut anfrage bekomme ich auch tatsaechlich die franzoesichen Texte. Soweit alles gut, aber

Wie kann ich einer fertigen Anwendung nachtraeglich ein Sprache hinzufuegen? Ich habe selbst einfach mal eine der bestehenden resx-Files kopiert, umbenannt und mit einem einfachen Texteditor die Werte umgeschrieben ("es" fuer Spanisch). Anschliessend habe ich mit AL.exe eine dll daraus generiert und mit dem entsprechenden "es"-Verzeichnis in das Stammverzeichnis eingefuegt, genau so wie das Ganze auf einigen Seiten geschildert wird, allerdings ohne Erfolg - es wird die Standardsprache anstatt der nachtraeglich zugefuegten Sprache verwendet.

Ich koennte wetten ich hab da was falsch verstanden...

Wie erstelle ich am besten eine neue Resx-Datei fuer eine zusaetzliche Sprache und was muss ich mit ihr anstellen damit sie anschliessend auch angenommen wird?

Viele Gruesse

Ralf

PS: Kann ich das Testprojekt irgendwie anfuegen - ich denk das wuerde die Sache vereinfachen...

28.12.2009 - 15:59 Uhr

Hi juetho!

Ich war mir bereits vorher ziemlich sicher dass ich in meinem Fall kein @-Zeichen im Code brauche, aber ich war selber kurz verunsichert - man lernt ja nie aus...

Ich denke die Probleme die nun verbleiben sind Syntax bezogen: Wenn ich das SQL-Skript ausfuehre bekomme ich Fehlermeldungen die besagen "Falsche Syntax in der Naehe von GO" und "Falsche Syntax in der Naehe von SET"

Ich hab dann mal GO in der Doku angesehen und festgestellt, dass es dort einen Hinweis gibt, dass es keine "Transact-SQL-Anweisung" ist. Also hab ich GO mal komplett rausgeschmissen (ueber 400 mal im Skript :-0) Bin ja kein SQL-Experte aber ich spiel gerne mal rum...

Jetzt gehts: Alle Tabellen, Views und StoredProcedures angelegt - sieht gut aus!

@0815Coder:
Ja, du hast Recht! Leider hatte ich nicht erwaehnt, dass das SQL Skript eine leere Datenbank fuer meine Anwendung erstellt - somit ist dein Vorschlag fuer mich ausnahmsweise nicht passend.

Oder hat jemand eine andere Idee wie ich die Datenbankstruktur fuer meine Anwendung mitliefer koennte, ohne dass der User im ManagementStudio selber rumfroschen muss?

Gruesse

Ralf

27.12.2009 - 04:12 Uhr

Hallo FZelle!

Tatsaechlich habe ich mir gar nicht darueber Gedanken gemacht, dass da Escapezeichen drin sein koennten - aber jetzt da du es sagst... 😃

Ich hatte gar nicht Zeit mich sofort darum zu kuemmern, allerdings wundere ich mich nun wie ich wie ich mich um die Backslahes in der Textdatei kuemmern soll - ein @-Zeichen vor dem Properties.Ressources.Textfile; scheint es nicht zu bringen.

Gruesse

Ralf

26.12.2009 - 21:19 Uhr

hmm, jetzt bekomme ich zwar ne riesen SQL-Fehlermeldung, aber das ist wahrscheinlich ne andere Geschichte...

Ansonsten: Genial! Haette nicht geglaubt, dass es auch so einfach gehen kann!

Danke gfoidl!

26.12.2009 - 20:42 Uhr

Hi!

Ich sollte ein "mehrere" Zeilen grosses SQL-Skript in meinem Code unterbringen. Wie stelle ich das am besten an, ohne gleich jede Zeile des Skripts einzeln mit Anfuehrungszeichen umstellen zu muessen?

Gruesse

Ralf

09.12.2009 - 15:53 Uhr

Hallo Herbivore,

natuerlich verstehe ich deinen Standpunkt, immerhin ist es ja beim Debuggen auch nicht anders, da hier fuer jede InnerException ein neues Propertyfenster geoeffnet werden kann.
Trotzdem fand ich meinen Loesungsansatz eigentlich ganz angenehm und wie du bereits gesagt hast wird es in der Regel gar nicht sooo viele InnerExceptions geben, so das es trotzdem uebersichtlich bleibt. Ich muss da selber erstmal Erfahrungen sammeln, d.h. es kann gut sein dass ich es noch so aendere wie du vorschlaegst.

Mir ging es vor allem erst mal darum zu sehen wie andere das Thema angehen und was fuer Moeglichkeiten es gibt und da habt ihr mir wirklich geholfen...

Danke nochmal!

Ralf

09.12.2009 - 14:35 Uhr

Hi an alle!

Danke fuer die Anregungen! Ich werde mir nochmals fuer jede einzelne Info Gedanken machen (der Username z.B. ist ja wirklich sinnlos).

Ausserdem werde ich versuchen das Logging so zu gestalten, dass je nach Bedarf unterschiedliche Aspekte mitgeloggt werden oder eben nicht, aber da muss ich erst mal noch sehen wie ich das anstelle.

Da das Projekt um das es sich gerade bei mir dreht mein erstes ist, bei dem ich von Anfang an alles selber planen kann, wollte ich einfach vorab schon mal etwas solides haben - aber wahrscheinlich wird sich hier auch einiges mit der Zeit noch aendern.

@Herbivore: Ja, es sind InnerExceptions die da nacheinander aufgelistet werden, aber ich finde das eigentlich recht angenehm so, daher werde ich das wahrscheinlich mal vorerst so lassen.

@JAck30lena: Obgleich log4net sicherlich die Sache vereinfachen wuerde moechte ich bewusst darauf verzichten - waere ich mein eigener Chef wuerde ich es aber genau so machen wie du!

Danke und viele Gruesse

Ralf

09.12.2009 - 02:31 Uhr

Hi JAck30lena! Hi MarsStein!

Tatsächlich sollte ich mir Gedanken machen was rein soll und was nicht.

Ich denke die geladenen Module brauchen am meisten Platz, machen aber in den seltensten Fällen Sinn. Den Rest finde ich sollte aber drin bleiben, da hier der Platz im Verhältnis zum Nutzen noch gerechtfertigt ist.

Nur unbehandelte Exceptions zu loggen halte ich fuer etwas hart, nur weil die Ausnahme abgefangen wird, heißt dass man da nicht mehr nach zu haken braucht.

Ich habe auch nicht vor die Exceptions in das Anwendungslog zu schreiben, sondern in ein gesondertes Errorlog.

log4net ist für kommerzielle Projekte (wenn ich das richtig verstanden habe) nicht uneingeschraenkt geeignet - ich will nicht alle möglichen Lizenzen in meiner Anwendung erwähnen müssen...

08.12.2009 - 21:22 Uhr

Hi!

Bin gerade dabei mir ein kleine Logging-Komponente zu schreiben, die neben einfachen Nachrichten auch Exceptions in eine separate Datei loggen kann. Dabei haben sich mir zwei Fragen gestellt:

  1. Welche Informationen zu einer Exception sollten geloggt werden?
  2. Wie sollten eine Exception geloggt werden? (Ich musste feststellen das komplexe Ausnahmen eine einfach Textdatei recht schnell unuebersichtlich aussehen lassen...)

Gibts da Richlinien oder BestPractises? Wie macht ihr das? Geht jemand von euch auch einen Schritt weiter und bietet eine "Fehlerbericht senden"-Funktion dem User an?

Viele Gruesse

Ralf

PS: So sieht eine Exception im Textfile momentan bei mir aus (leider stimmt die Formatierung nach Copy&Paste nicht mehr so ganz):


Date: 08/12/2009 15:01:23
Application: Logging TestApplication
Version: 1.0.0.0
Computer name: RalfPC
User name: RalfUser
OS: Microsoft Windows NT 5.1.2600 Service Pack 3
Culture: en-US
Display Resolution: {Width=1680, Height=1050}
System up time: 1.03:17:18.1640000
App up time: 00:00:40.0468750
Total memory: 3535Mb
Available memory: 2554Mb

Exception classes:
System.DivideByZeroException (=>Original Exception)
System.InvalidCastException
System.InvalidCastException
System.ComponentModel.InvalidEnumArgumentException

Exception messages:
Attempted to divide by zero. (=>Original Message)
First Fake Message
Second Fake Message
Third Fake Message

Stack Traces:
at Logging_TestApplication.Form1.func3() in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 53 (=>Original Call)
at Logging_TestApplication.Form1.func3() in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 57
at Logging_TestApplication.Form1.func2() in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 41
at Logging_TestApplication.Form1.func2() in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 45
at Logging_TestApplication.Form1.func() in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 31
at Logging_TestApplication.Form1.func() in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 35
at Logging_TestApplication.Form1.button1_Click(Object sender, EventArgs e) in C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\Form1.cs:line 23

Loaded Modules:
C:\Documents and Settings\RalfUser\My Documents\Visual Studio 2008\Projects\Logging TestApplication\Logging TestApplication\bin\Debug\Logging TestApplication.vshost.exe 9.0.21022.8
C:\WINDOWS\system32\ntdll.dll 5.1.2600.5755 (xpsp_sp3_gdr.090206-1234)
C:\WINDOWS\system32\mscoree.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\system32\KERNEL32.dll 5.1.2600.5781 (xpsp_sp3_gdr.090321-1317)
C:\WINDOWS\system32\ADVAPI32.dll 5.1.2600.5755 (xpsp_sp3_gdr.090206-1234)
C:\WINDOWS\system32\RPCRT4.dll 5.1.2600.5795 (xpsp_sp3_gdr.090415-1241)
C:\WINDOWS\system32\Secur32.dll 5.1.2600.5834 (xpsp_sp3_gdr.090624-1305)
C:\WINDOWS\system32\SHLWAPI.dll 6.00.2900.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\GDI32.dll 5.1.2600.5698 (xpsp_sp3_gdr.081022-1932)
C:\WINDOWS\system32\USER32.dll 5.1.2600.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\msvcrt.dll 7.0.2600.5512 (xpsp.080413-2111)
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 2.0.50727.3603 (GDR.050727-3600)
C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.3053_x-ww_b80fa8ca\MSVCR80.dll 8.00.50727.3053
C:\WINDOWS\system32\shell32.dll 6.00.2900.5622 (xpsp_sp3_gdr.080617-1319)
C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll 6.0 (xpsp.080413-2105)
C:\WINDOWS\system32\comctl32.dll 5.82 (xpsp.080413-2105)
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\7124a40b9998f7b63c86bd1a2125ce26\mscorlib.ni.dll 2.0.50727.3603 (GDR.050727-3600)
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorsec.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\system32\WINTRUST.dll 5.131.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\CRYPT32.dll 5.131.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\MSASN1.dll 5.1.2600.5875 (xpsp_sp3_gdr.090904-1413)
C:\WINDOWS\system32\IMAGEHLP.dll 5.1.2600.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\rsaenh.dll 5.1.2600.5507 (xpsp.080318-1711)
C:\WINDOWS\system32\xpsp2res.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\uxtheme.dll 6.00.2900.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\userenv.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\VERSION.dll 5.1.2600.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\netapi32.dll 5.1.2600.5694 (xpsp_sp3_gdr.081015-1312)
C:\WINDOWS\system32\cryptnet.dll 5.131.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\PSAPI.DLL 5.1.2600.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\SensApi.dll 5.1.2600.5512 (xpsp.080413-2108)
C:\WINDOWS\system32\WINHTTP.dll 5.1.2600.5727 (xpsp_sp3_gdr.081215-1359)
C:\WINDOWS\system32\WLDAP32.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\ole32.dll 5.1.2600.5512 (xpsp.080413-2108)
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\9.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll 9.0.21022.8
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll 2.0.50727.3082 (QFE.050727-3000)
C:\WINDOWS\system32\CLBCATQ.DLL 2001.12.4414.700
C:\WINDOWS\system32\COMRes.dll 2001.12.4414.700
C:\WINDOWS\system32\OLEAUT32.dll 5.1.2600.5512
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\3de5bd01124463d7862bd173af90bc83\System.ni.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Drawing\abb2ac7e08bee026f857d8fa36f9fe6f\System.Drawing.ni.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Windows.Forms\d2ea8d76f015817db1607075812b555f\System.Windows.Forms.ni.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\9.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll 9.0.21022.8
C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\9.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll 9.0.21022.8
c:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\x86\Microsoft.VisualStudio.Debugger.Runtime.Impl.dll 9.0.21022.8 built by: RTM
C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4148_x-ww_d495ac4e\MSVCR90.dll 9.00.30729.4148
C:\WINDOWS\system32\msi.dll 4.5.6001.22159
C:\WINDOWS\system32\SXS.DLL 5.1.2600.5512 (xpsp.080413-2111)
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Core\c0a42d2ad8a4078040b334f6770ea11f\System.Core.ni.dll 3.5.30729.1 built by: SP
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Xml.Linq\eb23b78564687badff1bd1f1d0a0ec97\System.Xml.Linq.ni.dll 3.5.30729.1 built by: SP
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Data.DataSet#\4ff4134b0d490c090e03d74e104517c4\System.Data.DataSetExtensions.ni.dll 3.5.30729.1 built by: SP
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Data\694c07365e0fd6bba0bc304d4d2404a7\System.Data.ni.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\assembly\GAC_32\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\system32\WS2_32.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\system32\WS2HELP.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Deployment\c94a427baa7683f4221b91f90c18461b\System.Deployment.ni.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Xml\5913d3f81e77194ec833991b1047a532\System.Xml.ni.dll 2.0.50727.3082 (QFE.050727-3000)
C:\WINDOWS\system32\MSCTF.dll 5.1.2600.5512 (xpsp.080413-2105)
C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.6001.22319_x-ww_f0b4c2df\gdiplus.dll 5.2.6001.22319 (vistasp1_ldr.081126-1506)
C:\WINDOWS\system32\mslbui.dll 5.1.2600.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\shfolder.dll 6.00.2900.5512 (xpsp.080413-2105)
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\perfcounter.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\system32\pdh.dll 5.1.2600.5773 (xpsp_sp3_gdr.090306-1225)
C:\WINDOWS\system32\comdlg32.dll 6.00.2900.5512 (xpsp.080413-2105)
C:\WINDOWS\system32\ODBC32.dll 3.525.1132.0 (xpsp.080413-0852)
C:\WINDOWS\system32\odbcbcp.dll 2000.085.1132.00 (xpsp.080413-0852)
C:\WINDOWS\system32\odbcint.dll 3.525.1132.0 (xpsp.080413-0852)
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_perf.dll 2.0.50727.3053 (netfxsp.050727-3000)
C:\WINDOWS\system32\ATL.DLL 3.05.2284
C:\WINDOWS\system32\NTMARTA.DLL 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\SAMLIB.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\Program Files\Microsoft SQL Server\90\Shared\instapi.dll 2005.090.1399.00
C:\Program Files\Common Files\Microsoft Shared\office11\mso.dll 11.0.8221
C:\WINDOWS\system32\iphlpapi.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\system32\rasman.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\system32\msv1_0.dll 5.1.2600.5876 (xpsp_sp3_gdr.090909-1234)
C:\WINDOWS\system32\cryptdll.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\tapi32.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\system32\rtutils.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\system32\WINMM.dll 5.1.2600.5512 (xpsp.080413-0845)
C:\WINDOWS\system32\MPRAPI.dll 5.1.2600.5512 (xpsp.080413-0852)
C:\WINDOWS\system32\ACTIVEDS.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\adsldpc.dll 5.1.2600.5512 (xpsp.080413-2113)
C:\WINDOWS\system32\SETUPAPI.dll 5.1.2600.5512 (xpsp.080413-2111)
C:\WINDOWS\system32\perfos.dll 5.1.2600.5512 (xpsp.080413-2111)
c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\diasymreader.dll 8.0.50727.3053 (netfxsp.050727-3000)


.
.
.
.

13.08.2009 - 17:13 Uhr

Toll! Jetzt steh ich doof da!

😃

Sorry, aber da hab ich gar nicht dran gedacht !ROFL!

Tja, jetzt ist es so drin. Vielleicht werd ichs bei Gelegenheit abändern, ich hab aber auch so noch genug zu tun...

Danke für den Hinweis. Manchmal denke ich eben einfach zu kompliziert!

Grüße

Ralf

13.08.2009 - 12:29 Uhr

Hi herbivore!

Der Wert ist eigentlich ein Preis, der an ein Preisauszeichnungsgerät geht, aber warum das kein Komma will ist mir auch ein Rätsel. So ist es nunmal 😉

Grüße

Ralf

12.08.2009 - 15:35 Uhr

Hi gfoidl! Hi Tom!

'System.Globalization.NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator' war genau das was ich gesucht habe!!!

Grüße

Ralf

12.08.2009 - 14:32 Uhr

Hi!

Ich sollte in meiner Anwendung aus einem decimal value einen string machen und dabei das Kommazeichen verschwinden lasssen. Da ich gerade mit meinem deutschen Lappi in den USA sitze, habe ich aber das Problem, dass ich das Dezimalzeichen nicht fix als Punkt oder Komma angeben kann.

Leider konnte ich über Google und Suche das Problem nicht lösen, obwohl es so schwer wohl kaum sein kann.

Hat jemand von euch einen kurzen Hinweis wo ich suchen muß, damit ich das Dezimaltrennzeichen der jeweiligen Kultur ermitteln kann?

Grüße

Ralf

07.08.2009 - 18:24 Uhr

System.Data.SqlClient.SqlConnection.ClearAllPools()

hat das Problem bei mir behoben. Danke Florian!!!!

👍

07.08.2009 - 00:20 Uhr

Hi!

Ich versuche gerade aus meiner Anwendung heraus eine Database auf einem MSSql Server 2005 zu löschen, also quasi

DROP DATABASE MyDatabase;

Allerdings bekomme ich hier immer die Meldung, dass die DB nicht gelöscht werden kann da sie noch genutzt wird. Nun habe ich ein wenig gegoogelt und habe gelesen, dass die bestehenden Verbindungen zur DB mit

ALTER DATABASE MyDatabase SET SINGLE_USER;

beendet werden können. Daher schicke ich nun:

"ALTER DATABASE MyDatabase SET SINGLE_USER; DROP DATABASE MyDatabase;"

an die Masterdatenbank, allerdings komme ich damit auch nicht weiter, da die Aktion immer wegen einem TimeOut abgebrochen wird.

Kennt sich da jemand aus? Was muss ich mach damit das funkioniert?

Viele Grüße

Ralf

12.07.2009 - 10:38 Uhr

Hi Bernd!

Danke für deinen Hinweis! Dann werde ich mal versuchen die Verbindung für den Designer mal versuchen wieder zu entfernen.

Habe ich das richtig verstanden, dass du deine typed Datasets selber codest?

viele Grüße

Ralf

11.07.2009 - 21:50 Uhr

Hi michlG!

Klar, dass sich hinter der Verbindung nur ein ConnectionString versteckt, aber mir geht es auch ein Stück darum, ob dieser ConnectionString später irgendwo im Code in meiner Applikation rum fährt, oder wirklich nur im VisualStudio gespeichert bleibt - ist ja auch ein Sicherheitsaspekt.

Grüße

11.07.2009 - 21:23 Uhr

Hi!

Habe bisher unter C# bzw. VisualStudio 05 noch nie eine Datenbank ansprechen müssen. Nun soll ich eine MSSql-Datenbank ansprechen und bin beim Einlesen und Ausprobieren über den Dataset Designer von VS05 gestolpert. Dabei habe ich über den Verbindungsassistent eine Verbindung angelegt, welche mir erlaubt, die Tabellen direkt aus dem SQL-Server zu importieren.
Jetzt frage ich mich, ob ich die hier definierte Datenbankverbindung auch zur Laufzeit verwenden kann, oder ob diese sich nur innerhalb vom Visual Studio zur Designzeit nutzen läßt. Ich konnte zwar auf Anhieb keine Möglichkeit finden im Code darauf zu zugriefen, aber das soll ja nichts heißen. Kennt sich da jemand aus?

Grüße

MillionsterNutzer

06.06.2008 - 15:53 Uhr

Hi!

Also ich glaub ich habs:

public void DoSomething(List<GeometrischeForm> dieListe)
{

//...

Type t = dieListe[0].GetType();

Type t1 = dieListe.GetType(); //Liefert mir List<Dreieck>
Type t2 = t1.GetGenericArguments()[0]; //Liefert mir Dreieck => Das will ich!
Type t3 = t1.GetGenericTypeDefinition(); //Liefert mir List<Dreieck>

//...

}

Allerdings muss ich zugeben, dass das ganze immer noch nicht elegant ist. Naja, manchmal muss man auch verlieren können 🙂

Trotzdem: DANKE AN ALLE!!!

Grüße

06.06.2008 - 15:26 Uhr

Mal etwas ausführlicher:


//Diese Methode gibt es noch in zig Varianten mit unterschiedlichen geometrischen Formen
private void AufrufenderCode() 
{

//...

List<Dreieck> dreieckListe = new List<Dreieck>();
dreieckListe.Add(new Dreieck());
dreieckListe.Add(new Dreieck());
dreieckListe.Add(new Dreieck());

DoSomething(dreieckListe);

//...

}

public void DoSomething(List<GeometrischeForm> dieListe)
{

//...

Type t = dieListe[0].GetType(); //TODO: Das muss doch auch anders gehen!?!?!?!?

//...

}

Hmm, wäre das jetzt etwas verständlicher?

06.06.2008 - 14:57 Uhr

Hi!

Also vielleicht war mein erster Post doch etwas zu abstrakt. In meinem Fall geht es um eine Basisklasse von denen mehrere unterschiedlicher geerbte Klassen vorhanden sind.

Man könnte also sagen ich habe eine Basisklasse GeometrischeForm von der z.B. Quadrad und Dreieck abgeleitet sind.

Meine Methode hat nun den Parameter List<GeometrischeForm>, wobei ich jedoch sicher weiß das in der Liste nur Objekte einer Art vorkommen können, also nur Dreiecke oder nur Quadrate. Aber wie bekomme ich nun sauber raus, was denn nun genau drin steckt?

@markus.bodlos:
Den Gedanken von dir hatte ich auch schon, aber leider sind das wirklich jede Menge abgeleiteter Klassen, wenn ich jede einzeln abfragen würde... das wäre echt ungeschickt.

@0815Coder:
Mein Gefühl sagt mir du hast recht, aber ich will es eben nicht so recht glauben 😕. Meine Liste ist doch extra typisiert, dann müsste man doch auch den Typ herausbekommen, oder?

(Puh, ihr schreibt zu schnell...)

@JAck30lena:
(Sorry wegen den Methoden 🙂 - Leider geht es nicht anders, ich MUSS auf gegebenen Code aufbauen. Glaub mir: Ich würde es anders machen, wenn ich es könnte.

@0815Coder:
Wenn die Liste doch ursprünglich als

List<Dreieck> eineListe;

definiert wurde, dann müsste man eben diesen Dreiecks-Typ doch herausbekommen, evtl. sogar wenn sie noch leer wäre, oder?

Grüße

06.06.2008 - 14:27 Uhr

Hi!

Habe eine Funktion bei der ich als Parameter ganz abstrakt eine generische Liste vom Typ List<object> bekomme. Nun muss ich innerhalb meiner Funktion wissen von was für einem Typ die Liste denn nun genau ist.

Der einzige weg der mir hierzu einfällt ist wohl

Type t = objectListe[0].GetType();

Allerdings scheint mir das alles andere als eine elegante Lösung zu sein. Gibts da ne Möglichkeit direkt den Typ der generischen Liste zu ermitteln, ohne dabei wie oben die die darin enthaltenen Elemente prüfen zu müssen?

Grüße