Laden...

Profil von smilingbandit

myCSharp.de - Member Mitglied seit
S
smilingbandit
myCSharp.de - Member
37
Themen
151
Beiträge
Dabei seit
09.10.2007
Letzte Aktivität
vor 14 Jahren
Alter
46 Jahre
Beruf
Softwareentwickler / Dipl. Inf
Herkunft
Nürnberg
Erstellt vor 14 Jahren

Hallo zusammen,

nach langer Zeit der Abstinenz plagt mich mal wieder ein .NET Problem 😃 Die Frage ist größtenteils für mich noch akademischer Natur, da ich gerade die verschiedenen Möglichkeiten auslote.

Folgendes Szenario:

Ich benutze ein COM-Interface, für das ein .NET Wrapper (eine Ansammlung von Interfaces sowie als "internal" deklariert die das Interface implementierenden Klassen) definiert sind. Die Klassen wiederum implementieren die Funktionalität der COM-Schnittstelle.

Die COM-Schnittstelle kann nicht angepasst werden, die .NET Schnittstelle - falls möglich - ebenfalls nicht.

Mein Problem:

Prinzipiell handelt es sich um ein Serialisierungsproblem. Ich möchte einige der Collections ("eigene" Collections die im Wrapper definiert sind) persistent speichern, damit User ihre Arbeit unterbrechen können, ohne Daten zu verlieren.

Leider ist es nicht möglich, Interfaces zu serialisieren (benötigt ja einen konkreten Typ). An die Klassen selbst komme ich "von außen" wegen "internal" auch nicht heran (ist ja auch gut so..meistens).

Meine Ansätze waren bisher folgende:

  1. Ich erweitere die internen Klassen des Wrappers sowie die Interfaces insofern, das jede Klasse eine List mit PropertyInfo-Objekten liefern kann.

  2. Ich versuche über Reflection, direkt an die Werte zu kommen und weg zu speichern, ohne die Klassen bzw. die Interfaces zu erweitern.

Meine Einschätzungen:

zu 1.: Finde ich persönlich am elegantesten. Funktioniert soweit.
zu 2.: Weniger elegant, funktioniert aber ebenfalls.

Meine Probleme 😃

zu 1.:
Ich muss die Schnittstellen und deren Implementierung erweitern was nicht unbedingt gewünscht ist.
Außerdem habe ich das Problem der "Selbstreflektion". Das heißt, dass sich mein Property in sich selbst nochmal befindet, da es ja ebenfalls ein Property ist. Das müsste ich noch - möglichst ohne feste Namen etc. - vermeiden.

zu 2.: Das gecode an der Stelle mit Schleifen, Typecasts usw. finde ich nicht sonderlich schick und viel zu kompliziert. Vielleicht stehe ich auch nur auf dem Schlauch und denke zu kompliziert.

Allgemein: Da der Serialisierer wegfällt und ich somit auch an der Stelle ISerializable nicht implementieren kann habe ich das Problem, wie ich dann enstprechende Objekte selbst deserialisiere und ihnen per Reflection und Schleifen die gespeicherten Properties wieder zuweisen kann.

Interessant bei Punkt 1 wäre: Wie müsste ein Setter für das Property (Liste) über alle Properties aussehen? 😃

Ich hoffe, ich konnte das Problem soweit verständlich wieder geben.

Konkreter Code ist auch nicht direkt notwendig (aber schön, wenn jemand schon sowas kennen sollte). Mir würden auch Ansätze oder Hinweise helfen. Den rest krieg ich dann schon 😃

Viele Grüße

SB

Erstellt vor 14 Jahren

Hallo zusammen,

aus mir unbekannten Gründen funktioniert nun das Encoding reibungslos. Außerdem bin ich auf ReadAllLines umgestiegen. Ebenfalls ohne Probleme.

@Herbivore:

Da hast du recht. Zum Glück bin ich auch kein Embedded-Entwickler der darauf achten muss 😃 Allerdings muss ich danach sowieso jede Zeile einzeln mit einer RegEx prüfen, darum - dachte ich mir - kann ich sie auch einzeln lesen und dabei prüfen 😃

Für alle dies interessiert, es sieht jetzt folgendermaßen aus:


private void ReadData()
        {
            string[] readText = File.ReadAllLines(iniFilePath, Encoding.Default);
           
            // Testing purposes only!

            iniFileData = new Dictionary<string,Dictionary<string,string>>();
            string currSection = String.Empty;
           
            foreach(string line in readText)
            {
                Match matchSection = secRegex.Match(line);
                if (matchSection.Success)
                {
                    currSection = matchSection.Groups["Section"].Value as String;
                    if (!iniFileData.ContainsKey(currSection))
                    {
                        iniFileData.Add(currSection, new Dictionary<string, string>());
                    }
                }

                else
                {
                    Match matchLine = keyValRegex.Match(line);
                    if (matchLine.Success)
                    {
                        String currKey = matchLine.Groups["Key"].Value as String;
                        String value = matchLine.Groups["Value"].Value as String;

                        Dictionary<string, string> temp;
                        iniFileData.TryGetValue(currSection, out temp);

                        if (!temp.ContainsKey(currKey))
                        {
                            temp.Add(currKey, value);
                        }
                    }
                }

            }
        }

Erstellt vor 14 Jahren

Die Zeilen kannst du leichter mit der
>
einlesen. Da kannst du dann auch mit dem Encoding rumspielen.

Danke, werd ich gleich mal mit einer alten Datei gegenprüfen.
Ist die Herngehensweise sinnvoll? Also eine komplette Datei einzulesen. Die INIs können ja ganz schön groß werden...

Erstellt vor 14 Jahren

Hallo zusammen,

inzwischen bin ich schon etwas weiter. Ich habe die Datei mal mit Hilfe des Notepad++ in verschiedene Formate konvertiert und das Encoding des Streamreaders auf Default gestellt.

Interessanter Weise klappts jetzt und auch der Reader stürzt nicht mehr ab. Allersings ist mir das noch zu unsicher für die Zukunft 😃 Also wer noch Ideen oder Erfahrungen hat...

Vielleicht hilft der Code ja noch anderen. Werde den Ausschnitt jedenfalls up to Date halten sobald ich mir sicher bin.

Erstellt vor 14 Jahren


/* 
\* Methode zum Lesen der INI-Datei
\* Gleichzeitig wird ein Dictionary erzeugt, das als Basis für den TreeView dient
\*/

private void ReadData()
        {

            FileStream fileStream = new FileStream(iniFilePath, FileMode.OpenOrCreate, FileAccess.Read);
            TextReader reader = new StreamReader(fileStream);

            // Testing purposes only!

            iniFileData = new Dictionary<string,Dictionary<string,string>>();
            string currSection = String.Empty;
                        
            String line;

            while ((line = reader.ReadLine()) != null)
            {
                Match matchSection = secRegex.Match(line);
                if (matchSection.Success)
                {
                    currSection = matchSection.Groups["Section"].Value as String;
                    if (!iniFileData.ContainsKey(currSection))
                    {
                        iniFileData.Add(currSection, new Dictionary<string, string>());
                    }
                }

                else
                {
                    Match matchLine = keyValRegex.Match(line);
                    if (matchLine.Success)
                    {
                        String currKey = matchLine.Groups["Key"].Value as String;
                        String value = matchLine.Groups["Value"].Value as String;

                        Dictionary<string, string> temp;
                        iniFileData.TryGetValue(currSection, out temp);

                        if (!temp.ContainsKey(currKey))
                        {
                             temp.Add(currKey, value);
                        }
                    }
                }
            }
            fileStream.Close();
        }

Hier mal der Code zum Auslesen des ganzen. Anscheinend wird keine Exeption geworfen(?). Zumindest zeigt sich mit Try-Catch das gleiche Stoppverhalten ohne Meldung.
Über die Eleganz der Lösung kann man jetzt mal streiten 😃
Die RegEx zum Prüfen sind auch recht groß, kann ich auf Wunsch aber ebenfalls Posten.
Die auskommentierten Stellen mit Encodingformaten habe ich mal der Üersichtlichkeit wegen weg gelassen.

Erstellt vor 14 Jahren

Hallo zusammen,

ich habe ein Projekt in dem ich INI-Dateien behandeln muss - also ganz normale Textdateien.

Die gelesenen Daten werden von mir in einen TreeView zur Anzeige gebracht. Der Wert eines gewählten Schlüssels sollen in einer Textbox darsgestellt werden (für spätere Änderungen).

Funktioniert auch so weit alles wunderbar - außer:

Das Zeichen "°" kommt in einigen Zeichenketten vor, und kann wohl nicht richtig gelesen werden. Stattdessen tauchen Fragezeichen ( also "?" ) oder diese Vierecken bzw. Balken auf. Ich habe bereits mit diversen Konvertierungen herumgetestet und hatte noch mehr Datenverlust - sprich fehlende Zeichen usw.

Ich habe auch bereits dem Streamreader Encodings mitgegeben. Das führt interessanterweise aber immer zum Absturz der ganzen Anwendung. Leider ohne irgendeine Meldung.

Hat jemand eine entsprechende Idee, was ich ausprobieren könnte oder im Idealfall, wo die Lösung verborgen liegt?

Vielen Dank schon mal!

edit: Bevor ichs vergesse: Es scheint kein Anzeigeproblem zu sein. Beim debuggen waren die Zeichenketten bereits fehlerhaft.

Erstellt vor 16 Jahren

Hallo zusammen,

mit den ganze Left Outer Joins hats dann funktioniert. Der Query ist ziemlich unübersichtlich geworden, sammelt aber -glaube ich- die Daten, die ich brauche.

Nun hat sich aber ein anderes Problem ergeben. Ich brauche eine Auswertung über den Fortschritt, bzw. die Arbeitsstunden in einem Task (später mal nach Resource und Assignments aufgeteilt).

Mein Problem: Es ist lediglich hinterlegt, wie weit ein Task insgesamt zum reporteten Zeitraum ist.
Nun bin ich auf die Idee gekommen, dass man ja die Differenz errechnen könnte zu den zeitmässig vorherigen Datensätze, die sich sich ebenfalls auf diesen Task beziehen. Per Code würde ichs rekursiv lösen, dass er zum Vormonat immer noch die Differenz berechnet. Aber wie mache ich das mit SQL? Jemand eine Idee?

Vielen Dank schonmal

edit: Auf den Hinweis mit der Pivot hin hab ich mir das angesehen und werds mal so versuchen. Wusste bisher gar nicht, dass SQL das kann -.-"

edit2: Spalte für Spalte eine Differenz zu bilden ist wohl doch schwieriger als ich dachte. Falls jemand nen Tip dazu hat immer her damit ^^

Erstellt vor 16 Jahren

verwendetes Datenbanksystem: TSQL 2005 und TSQL 2008

Hallo zusammen!

Ich hab das folgende Problem...

Ich möchte eine Ressourcenauslastung auswerten, und die Daten liegen recht verteilt vor.

Es gibt eine Tabelle, in der ich eine ID auslese für die Verfügbarkeit und eine für die Kapazität der Ressource.
Das ist zunächst mal kein Problem.

Mit Hilfe dieser IDs suche ich in einer anderen Tabelle nach einer sogenannten IDDS. Diese identifiziert später die Ressource. In dieser Tabelle steht dann auch der Zahlenwert für die Verfügbarkeit oder die Kapazität. Also (zum Beispiel):

IDDS IDFIELD Number

5 Kapazität 100
5 Verfügbarkeit 50
10 Kapazität 80
20 Verfügbarkeit 12

Man sieht das Problem: Eine Ressource hat in zwei Datensätzen die Werte hinterlegt, nicht in einem. Es kann auch sein, dass nur Kapazität ODER Verfügbarkeit vorhanden ist.

Was ich am Ende haben möchte ist folgende Tabelle:

IDDS Kapazität Verfügbarkeit
5 100 50
10 80 NULL
20 NULL 12

(vereinfacht).

Wenn der eine oder andere Zahlenwert nicht hinterlegt ist, soll dort eben "0" oder NULL stehen.

Ich habs bisher mal mit einem Full outer Join probiert oder einem einfachen INNER JOIN. Beide liefern mir aber nicht das gewünschte Ergebnis.

Hat jemand eine Idee, wie ich das lösen kann? Ich hab das Gefühl, das ist gar nicht so schwer. Aber irgendwie steh ich aufm Schlauch.

Vielen Dank schonmal

Erstellt vor 16 Jahren

Hallo norman_timo,

das mit dem Berechnen habe ich ausprobiert. Entweder bin ich unfähig, oder der Diagrammdesigner kanns nicht/besitzt nicht die benötigten Einstellungen dafür.

Erstellt vor 16 Jahren

hallo norman_timo,

das würde gehen, wenn die Daten vorliegen würden. Leider gibt es z.B. keinen Meilenstein, der "Kontrolllinie" heißt und die entsprechenden Daten mitliefert. Darum wollte ich diesen Datensatz quasi "dynamisch" erstellen und am Ende anfügen. Kurz gesagt, ich hab nichts das ich "SELECT"en könnte.

Viele Grüße