Laden...
L
Benutzerbeschreibung

Forenbeiträge von Lord Hessia Ingesamt 497 Beiträge

06.07.2006 - 23:37 Uhr

Ich brauche eine Datenstruktur, die sich auf zwei verschiedene Arten schnell durchsuchen lässt. Einerseits soll nach einem eindeutigen Schlüssel jeweils ein Element gefunden werden und andererseits sollen nach einem anderen Schlüssel alle Elemente gefunden werden, die diesem Wert entsprechen.

Am einfachsten lässt sich das wahrscheinlich an einem Beispiel erklären:

erste Variante (eindeutiger Schlüssel: Element)
1: U
2: V
3: W
4: X
5: Y
6: Z

zweite Variante (gruppierender Schlüssel: Element(e))
a: U W
b: V X Z
c : Y

Da ich nicht davon ausgehe, dass es bereits eine fertige Datenstruktur gibt, die so etwas macht, ist jetzt die Frage, wie implementiert man so etwas? Ich hatte mit folgendes gedacht. Eine eigene (evtl. von ICollection abgeleitete) Klasse, die zwei Hashtables enthält, wobei die Werte der ersten Hashtable die Elemente U-Z sind und die Werte der zweiten Hashtable jeweils ArrayListen, die die jeweiligen Elemente enthalten.

Da aber genauso häufig wie nach Werten gesucht werden muss, auch Änderungen an den Werten vorgenommen werden müssen, ist diese Lösung nicht ideal. Denn bei Änderungen ist immer nur der Schlüssel aus der ersten Hashtable bekannt. Das Auffinden des Wertes in der zweiten Hashtable kann dadurch sehr aufwändig werden.

Eine Lösung, die sich hier zumindest meinem kranken Hirn aufdrängt, wäre die Ausnutzung der Tatsache, das C# ja auf Reference-Copy setzt. Wenn ich es schaffen könnte, dass in der zweiten Hashtable nicht mehr die Elemente sondern nur Verweise auf die Elemente der ersten Hashtable stehen, dann müsste ich ja auch nur dort aktualisieren. Aber wie schaffe ich das? Momentan sieht meine Funktion zum Einfügen eines Elements so aus (cachedElements ist Hashtable1, groupedElements Hashtable2):

public void add(int keyHashtable1, CacheEntry val) {
    cachedElements.Add(keyHashtable1, val);
    string keyHashtable2 = val.getKeyHashtable2();
    if (groupedElements.Contains(keyHashtable2)) {
        ((ArrayList)groupedElements[keyHashtable2]).Add(val);
    }
    else {
        ArrayList temp = new ArrayList();
        temp.Add(val);
        groupedElements.Add(keyHashtable2, temp);
    }
}
06.07.2006 - 20:24 Uhr

Habe gerade ein ganz seltsames Problem. Ich wollte eine statische Klasse erstellen, die ein paar Hilfsfunktionen und Konstanten kapselt. Doch ich bekomme immer die Fehlermeldung: Der Modifizierer 'static' ist für dieses Element nicht gültig.
Habe die Klasse dann mal auf das Nötigste reduziert - immer noch der gleiche Fehler.

Meine Klasse sieht nun so aus:

public static class Utils
{
}

Spinnt mein VS 2003 oder habe ich etwas Essentielles übersehen?

06.07.2006 - 17:33 Uhr

Bzgl. der Benutzerdokumentation (ich denke mal, dass ist es was Du mit Dokumentation meinst), kann man mindestens zwei grundsätzliche Ansätze unterscheiden.
Entweder Du schreibst eine Dokumentation, die sich an dem Aufbau Deines Programms (z.B. an den einzelnen Masken) orientiert und diesen dann Punkt für Punkt erklärt. So nach dem Motto: Hier haben wir die Eingabemaske und hier können Sie dies und jenes tun und achten Sie darauf, dass Sie folgende Werte nicht eingeben dürfen.
Ein anderer Weg ist es, die Dokumentation problemorientiert zu verfassen. Das kann man dann mit einer FAQ-Sammlung vergleichen. DAs ganze sähe dann so aus: Wenn Die einen neuen Datensatz eingeben wollen, dann gehen Sie auf folgende Maske und tragen Sie diese Werte ein. Anschließend können Sie auf einer anderen Maske überprüfen, ob alles eingetragen wurde usw.

Ich finde es immer super, wenn es beider Varianten gibt. Die erste für absolute Neulinge und die zweite für Profis, die nur die eine oder andere Funktionalität vergessen haben oder noch nicht kannten.

03.07.2006 - 11:21 Uhr

Wie schon gesagt, "nennen wir ihn Mike" braucht eine Lizenz von MySQL. Diese benötigt er aber schon für den WebShop, wenn er diesen kommerziell verwendet. Dein Programm kann er dann mit dieser MySQL-DB ebenfalls verwenden.

03.07.2006 - 11:05 Uhr

Ich glaube nicht, dass diese Browser in C# geschrieben sind und HttpWebResponse verwenden, um den Quelltext abzurufen.
Was heißt denn genau, dass das Program stehen bleibt? Gibt's ne Exception? Evtl. kannst Du diese anfangen und dann in der Fehlerbehandlung weiterlesen oder so.

03.07.2006 - 10:53 Uhr

So wie ich Deine Schilderungen verstehe, hat der Benutzer ja schon die DB (und dafür vermutlich auch schon Lizenzgebühren abgedrückt). Dann kann er auch Dein Prog damit nutzen. MySQL wird ja wohl Lizenzen nicht für die Anzahl der mit einer DB genutzten Programme verkaufen.

30.06.2006 - 11:03 Uhr

Ich werde mal mit dem sprechen, der die Website macht. Gut zu wissen, dass es mehrere Möglichkeiten gibt...
Besten Dank Euch allen!

30.06.2006 - 10:40 Uhr

Ich glaube, wir reden etwas aneinander vorbei. Mein Programm hängt vor der Datenbank. D.h. es ist dafür verantwortlich, dass diese mit Werten gefüllt wird. Welche Werte es dort reinschreibt hängt zum einen davon ab, welche Werte es aus einer externen Quelle bekommt und zum zweiten an Berechnungen, die im Programm durchgeführt werden und auf Werte zugreifen, die bereits in der Datenbank vorhanden sind. Wenn ich die Daten, die das Programm in die Datenbank speichert, zusätzlich auch weiterhin im Programm halten würde (Cache), dann würde das doch auf jeden Fall einen Geschwindigkeitsvorteil gegenüber dem ständigen Auslesen und Reinschreiben in die Datenbank bringen.
Die Frage ist dann halt nur, warum einen "richtigen" Cache verwenden anstatt einer Datenstruktur der Programmiersprache? Wie Du schon gesagt hast, ist das ja eigentlich nur nötig, wenn man mit mehreren Anwendungen auf die selben Daten zugreifen will. Wenn ich das nur mit einer Anwendung mache, dann wird wahrscheinlich die von regen erwähnte Hashtable die beste Lösung sein.
Ist das so weit richtig?

29.06.2006 - 17:45 Uhr

@Kai.: Die Daten sind nicht allzu umfangreich: Name, Preis und Anzahl
Dafür kann es aber relativ häufig (im sekundentakt z.B.) und dann wieder minutenlang gar keine Aktualisierungen geben.

@marsgk: Danke! WebRequest werde ich mir mal anschauen.

@telnet: Das Problem ist, dass die Website aktuell sein soll. D.h. der Intervall indem sie die DB prüft müsste sehr kurz sein, was vermutlich sehr rechenintensiv wäre. Andererseite überlege ich gerade, die Daten nicht ständig aus der Anwendung in die DB zu schreiben (sondern z.B. nur alle 5 Minuten), weshalb da dann auch gar nicht immer die aktuellen Daten drin stünden.
Deshalb würde ich die Webanwendung gerne benachrichtigen, wenn neue Daten da sind und ihr diese Daten am besten gleich schicken.

29.06.2006 - 16:39 Uhr

Ich habe eine Konsolenapplikation, die unregelmäßig Werte erhält und wenn diese bestimmten Kriterien entsprechen, diese an eine Website senden soll.
Die Konsolenapplikation hat mit der Webseite bzw. ihrem Inhalt und der Darstellung nix zu tun, außer dass sie ihr mitteilet, wenn eben ein neuer Datensatz eingetroffen ist, der bestimmten Kriterien entspricht. Die Website "entscheidet" dann, wie und ob sie die Daten darstellt.
Wie kann man denn so etwas realisieren? Fallen Euch da irgendwelche Schlagworte zu ein, die mir weiterhelfen könnten?

29.06.2006 - 16:32 Uhr

Wenn der Dateiname nach einem bestimmten Algorithmus vergeben wird, dann kannst Du ja diesen auch in Deinem Progrmm zur Berechnung des Dateinames verwenden. Wenn er zufällig erzeugt wird, dann musst Du halt auf die aktuelleste Datei zugreifen...

29.06.2006 - 14:07 Uhr

Original von Fabian
Hallo Lord Hessia,

Original von Lord Hessia
Ich wusste gar nicht, dass MS SQL 2005 Express kein "gewöhnliches" SQL unterstützt.

was genau verstehst Du unter "gewöhnlichem SQL"?

Standardisiertes SQL, z.B. SQL92 mit ein paar zu verschmerzenden Ausnahmen, die sich die meisten DB-Hersteller ja nicht verkneifen können und mitunter auch ganz nützlich sind.

29.06.2006 - 13:00 Uhr

Ich habe mir darüber echt noch nie Gedanken gemacht. Aber ich sehe letztendlich drei Möglichkeiten:

  • Die Daten im config-file verschlüsselt speichern (um diese auslesen und ändern zu können, muss der Benutzer sich entsprechend identifizieren)
  • Eine File-DB verwenden deren Benutzername und Passwort dem User nicht bekannt oder für ihn änderbar sein müssen
  • Einen festen Wert von Benutzername und Passwort voraussetzen, der sich nicht ändern lässt und bei der Installation (manuell) erzeugt werden muss, falls nicht vorhanden

Ok, etwas zu langsam 🙂

29.06.2006 - 12:45 Uhr

Ich wusste gar nicht, dass MS SQL 2005 Express kein "gewöhnliches" SQL unterstützt.
Falls Dir das gegen den Strich geht, gibt es auch noch weitere Datenbanken, die Du selbst mit kommerziellen Anwendungen kostenlos verwenden darfst. Z.B. Firebird oder PostgreSQL.

29.06.2006 - 12:36 Uhr

Ich kenne SQL 05 Express nicht, aber ich denke mal nicht, dass Du eine DB grundsätzlich "sperren" kannst, aber gleichzeitig noch einen Benutzer hast, den Dein Programm verwendet.

Aber Du kannst dem Benutzer ja z.B. nur Rechte zum Auslesen geben, damit niemand was böses anstellt. Dann kann Dein Programm aber natürlich auch nicht mehr machen.

P.S.: Woher kommen die Leute mit den bösen Absichten denn eigentlich an die DB-Benutzer-Daten?

29.06.2006 - 10:17 Uhr

Original von regen
Naja, was ist denn ein Cache großartig anderes als eine Hashtable oder ähnliches?

Ich hoffe u.a. auf diese Frage eine Antwort zu bekommen. 🙂 Wo liegt denn der Vorteil eines Caches? Klar, ich kann mitunter so Dinge angeben wie: Lebensdauer der Objekte oder Auslagerungsstrategie wenn der Cache zu groß wird, was ich bei Verwendung einer programminternen Datenstruktur selber implementieren müsste, wenn ich es denn bräuchte. Aber ist das alles?

Original von Rainbird
Wie kommen denn die Aktiendaten in die Datenbank? Konsumiert Deine Anwendung Dienste eines externen Dienstleisters oder ist ein hausinternes eBanking Programm angebunden?

Ersteres

Original von Rainbird
Ein Cache ist nur dann nützlich, wenn sich die Daten nicht zu oft ändern (also nicht jede Minute). Bei häufigen Änderungen muss der Cache oft aktualisiert werden. Das ist dann meistens langsamer, als die Daten direkt aus der Datenbank zu holen.

Das verstehe ich nicht. Wie kann es denn schneller sein, Daten aus der DB zu holen, die ihre Daten ja wiederum auf der Festplatte speichert und somit Festplattenzugriffe machen muss anstatt aus einem Cache, der ja in der Regel eine gewisse Anzahl an Objekten im Arbeitsspeicher hält?

_Original von Rainbird_Läuft die Geschäftslogik Deiner Anwendung auf den Clients (Clients reden direkt mit der Datenbank) oder auf einem Server (IIS, Remoting, etc.)?

Läuft alles auf einem Server.

29.06.2006 - 00:07 Uhr

Ich denke schon eine Weile über eine Veränderung in der Datenhaltung meiner Anwendung nach, aber irgendwie drehen sich die Gedanken nur im Kreis.
Folgendes ist mein Problem: Es geht um eine Anwendung, die in Echtzeit Aktienkurse verarbeiten muss, d.h. bei neuen Kursen auf gewisse Bedingungen prüfen und ggf. Aktionen ausführen muss. Außerdem werden die aktuellen Werte der Aktien (z.B. Anzahl der Handelsaktionen oder niedrigester Tageskurs) in einer Datenbank gespeichert.
Momentan läuft das Ganze im Testbetrieb mit sehr wenigen Aktien fehlerfrei. Es sollen aber später einmal mehrere 100 Aktien verwaltet werden. Das wird das Programm, so wie es momentan entworfen ist, aber völlig überfordern, da zur Zeit für jeden neuen Kurs die entsprechenden Daten aus der Datenbank geholt, die entsprechenden Bedingungen geprüft, evtl. Aktionen ausgeführt und dann alles wieder in die DB geschrieben wird.
Es wäre also deutlich besser, wenn das Programm sämtliche Daten im Speicher halten und auf diesen operieren würde und die Daten nur in bestimmten Intervallen (z.B. alle 5 Minuten) in der DB aktualisiert würden. Doch wie wäre dies am besten zu realisieren? Als einfache Collection? Oder vielleicht einen Cache verwenden? Was wären dort die Vorteile? Gibt es überhaupt gute Open-Source-Caches für .NET (nicht ASP.NET)?
Die DB bietet den Vorteil, für Abfragen SQL verwenden zu können, was deutlich einfacher ist, als die Bedingungen in C# zu schreiben. Gibt es da eine Alternative für Daten, die im Speicher gehalten werden - quasi eine in-memory-db?

Gruß Flo

22.06.2006 - 10:11 Uhr

Wieso willst Du denn in B.clone() A.clone() verwenden und dann in B casten?
Liefere doch in B.clone() einfach eine Kopie von B zurück, so wie A.clone() eine Kopie von A zurückgibt - dadurch ist B ja dann auch vom Typ A, wenn B eine Unterklasse von A ist. Ich hoffe, das war verständlich 🙂

20.06.2006 - 00:09 Uhr

Kann es sein, dass an der Stelle die " um JavaScript fehlen und das ein Problem darstellt?
Ich kenne mich mit HttpWebResponse nicht aus, also nix für ungut, falls die Frage blöd war...

12.06.2006 - 12:32 Uhr

Ich weiß natürlich nicht wie tief Du in die Materie einsteigen musst, aber mir hat die Online-Doku auf der Postgresql-Seite alle Fragen beantwortet.
Die haben auch eine Bücherübersicht http://www.postgresql.org/docs/books/

06.06.2006 - 12:38 Uhr

@Rainbird: Ich bin zwar nicht ängstlich, aber drei Tage vor der Projektpräsentation noch an dem Rechner bzw. IIS rumzufummeln... Nein, danke. Wir wollen zwar eigentlich keine Life-Demo machen, aber ich schätze mal, dass unser Prof da anderer Meinung ist 🙂
Ich habe diverse Tipps im Internet (auch bei MS) gefunden, woher dieser Fehler kommen könnte. Diese widersprachen sich aber zum Teil und haben allesamt nicht geholfen:

  • Manche sagten, es könne nur bei VS 2002 auftreten. Lösung des Problems: Upgrade auf VS 2003. Toller Tipp, wenn man VS 2003 einsetzt!
  • Andere meinten, man solle für den IIS .tmp-files zulassen
  • Wieder andere haben die Installation der ASP.NET-Servererweiterungen empfohlen und einiges mehr

Macht aber auch nix, da ich es jetzt hinbekommen habe und zwar auf die Variante, die auch cadi voregeschlagen hat. Office HTML bzw. XML ist das Schlüsselwort. Für alle, die einmal etwas ähnliches realisieren wollen und sich nicht scheuen, ein ganzes Word-Dokument als html-Quelltext zu erzeugen (das ist wirklich übel!!!), den sei folgender Link oder allgemein eine Suche bei Codeproject nach "dynamic office documents" empfohlen: http://www.codeproject.com/vb/net/Wordyna.asp

@cadi: Über Lizenzen hatte ich mir noch gar keine Gedanken gemacht. Da es sich um ein Studienprojekt handelt, ist dies auch nicht so wichtig. Mir war allerdings nicht klar, dass auf dem Server Office installiert sein muss. Ich dachte, das mitlinken der office.dll würde ausreichen, um die Dokumente zu erzeugen...

Jedenfalls vielen Dank für Eure Hilfe.

06.06.2006 - 12:37 Uhr

Sorry, Doppelpost

04.06.2006 - 00:40 Uhr

Ich möchte gerne in einem Webpart Personen auswählen und diesen dann einen (Serien-)Brief schreiben können. Mein erster Ansatz, das WordInterop-COM-Objekt direkt in dem Webpart zu verwenden ist offenbar aus Sicherheitsgründen nicht realisierbar. Danach habe ich es - aufgrund eines Tipps von rainbird - mit einem Webservice versucht. Mein VS will da aber einfach nicht mitspielen (s. Word-Zugriff in Sharepoint ). Da das Projekt bis zum nächsten Wochenende fertig sein muss, habe ich es jetzt etwas eilig und daher einen ziemlichen Hack verwendet (s. http://www.codeproject.com/vb/net/Wordyna.asp?df=100&forumid=59794&exp=0&select=1335626 ), indem das Word-Dokument einfach als html-file erzeugt, der Dokumenttyp auf Word-Dokument gesetzt und das ganze per Response.Write() ausgegeben wird.
Wenn es auch noch so übel ist, so funktioniert es doch verblüffend gut mit einer Einschränkungen: Sollen mehrere Personen angeschrieben, also ein Serienbrief erzeugt werden, dann muss ja eine Datenquelle angegeben werden. Hierfür erzeuge ich ein Excel-Dokument. Leider kann man auf die beschriebene Weise nicht zwei Dokumente gleichzeitig erzeugen. Also erzeuge ich entweder das Excel-Dok oder das Word-Dok mit der Angabe des Excel-Doks als Datenquelle. Das ist aber alles andere als brilliant, da man so keine vernünftige Benutzerführung machen kann. Also meine Frage: Kann ich die Adressdaten auch irgendwie direkt in das Word-Dokument packen oder brauche ich immer eine externe Datenquelle für Serienbriefe?

01.06.2006 - 20:11 Uhr

Mir ist noch etwas aufgefallen: Das Projekt wird, wenn man die Fehlermeldung beim Erstellen ignoriert und "Das Projekt mit den FrontPage-Servererweiterungen öffnen" auswählt (anders geht's ja nicht weiter), unter Eigene Dateien/Visual Studio Projects angelegt. Dabei wurde dieser Pfad nirgends angegeben...

01.06.2006 - 01:41 Uhr

Beim Erstellen von "normalen" ASP.NET-Webanwendungen gibt's den gleichen Fehler, den ich weiter oben für die Erstellung von ASP.NET-Webdiensten gepostet habe. Aber wie gesagt, ASP.NET ist aktiviert. Hat noch jemand ne Idee woran das liegen könnte bzw. was man dagegen tun kann?

30.05.2006 - 10:08 Uhr

Keine Firewall, keine zusätzlichen Sicherheitsprogramme.
Die Installation ist eine komplette Neuinstallation gewesen.
Netzwerk ist angeschlossen (ohne kann ich nicht entwickeln 🙂. Weil die erste Anleitung, die ich zum Thema STS gelesen hatte, meinte, er sei auf jeden Fall nötig, hab ich auch den Loopbackadapter installiert. Aber der ist zur Zeit deaktiviert.
Einfache statische Seiten habe ich noch nicht ausprobiert, aber komplexe Sharepointseiten funktionieren.

30.05.2006 - 01:15 Uhr

Das scheint es nicht gewesen zu sein. ASP.NET v1.1.4322 war bei den Webdiensterweiterungen genauso ausgewählt wie Windows SharePoint Services.
Alles andere (ASP, SSI, WebDAV) ist deaktiviert. Ich habe dann mal alles aktiviert (und auch den IIS nochmal neu gestartet), aber auch das hat nix gebracht. Es kommt weiterhin dieselbe Fehlermeldung.

29.05.2006 - 14:13 Uhr

Ich kann am Montag einen Kollegen zu Deinem Problem fragen.

Ja, das wäre echt super.

27.05.2006 - 17:24 Uhr

Danke, dass Du noch nicht entnervt abgewunken hast...

Zu den einzelnen Punkten:

  1. Ich verwende Windows 2003 Server Enterprise Edition SP 1. Angeblich läuft der IIS und somit Webparts doch auch nur auf diesem Betriebssystem. Sag bloß, dass es doch mit meinem Win XP funktioniert hätte und ich meinen raren Festplattenplatz nicht mit einem weiteren BS hätte "verschwenden" müssen?

  2. Ich wusste gar nicht, dass es in Visual Studio (habe VS 2003) einen integrierten Webserver gibt, denka aber, dass ich den eingenständig laufenden IIS verwende.

  3. Ich bin als Administrator auf dem Rechnre angemeldet und habe volle Zugriffsrechte auf das wwwroot-Verzeichnis.

  4. Du hast Recht, die FrontPage-Servererweiterungen sind nicht installiert. Komisch dass sich die Option aber trotzdem auswählen ließ und es danach auch weiterging.

  5. Da kann ich Dir nicht ganz folgen. Wenn ich das ASP.NET-Webdienst-Projekt in VS anlege, dann kann ich als Speicherort sowieso nur eine Adresse angeben, die mit http:// beginnt. D:\Inetpub\wwwroot oder ähnliches wird nicht akzeptiert. Ich nehme mal an, das meinst Du mit Dateimodus?

27.05.2006 - 01:23 Uhr

Ich habe versucht, nach der Anleitung in der VS-Hilfe ("Getting Started with XML Web Services in Visual BasicNET and C#") vorzugehen. Leider steht da nur: Legen Sie ein WebService-Projekt an, geben Sie einen Namen an, klicken Sie auf Ok usw. Alles auch genauso wie man es erwarten würde und ich es ohnehin gemacht hatte. Trotzdem geht die Fehlererzeugerei munter weiter. Es geht los beim Anlegen des Projekts mit (und dabei entspricht "d:\inetpub\wwwroot" sehr wohl dem localhost und der IIS ist auch gestartet):

Der standardmäßige Webzugriffsmodus für dieses Projekt ist "Dateifreigabe". Der Projektordner auf "http://localhost/WebService1" kann jedoch nicht mit dem Pfad "d:\inetpub\wwwroot\WebService1" geöffnet werden. Folgender Fehler wurde zurückgegeben:
Das Webprojekt "WebService1" konnte nicht erstellt werden. Der Dateipfad "d:\inetpub\wwwroot\WebService1" stimmt nicht mit dem URL "http://localhost/WebService1" überein. Beide müssen auf denselben Serverstandort verweisen. HTTP-Fehler 404:
Wie möchten Sie fortfahren?
o Das Projekt mit einem anderen Dateifreigabepfad öffnen
o Das Projekt mit den FrontPage-Servererweiterungen öffnen
o Offline arbeiten [ist ausgegraut]

Die einzige Möglichkeit, wie ich hier weitergekommen bin, war den zweiten Punkt mit den FrontPage-Servererweiterungen auszuwählen. Dann gehts aber gleich munter weiter mit Fehlern:

Die Berechtigungen für den Ordner "bin" konnten nicht so festgelegt werden, dass sie Browserberechtigungen einschränken. Serverfehler: Methode "mark url-directory executable" wird nicht unterstützt.
Der Fahler liegt möglicherweise an unzureichenden Zugriffsberechtigungen zum Durchführen der Operation. Sie können die Berechtigungen für diesen Ordner manuell konfigurieren, indem Sie dne Internet Services-Manager verwenden.

Dann wollte ich das ganze wenigstens noch erstellen, dabei kommt dann aber die endgültige Endstation (hatte ich ja oben schonmal gepostet):

Die Erstellungsausgaben konnten nicht in das Web kopiert werden. "D:\Dokumente und Einstellungen\Administrator\VSWebCache\FLOWIN2003\WebService1\bin\WebService1.dll" konnte dem Projekt nicht hinzugefügt werden. Serverfehler: Die folgende(n) Datei(en) wurden vom Administrator gesperrt: bin/WebService1.dll

26.05.2006 - 18:00 Uhr

@herbivore: Laut dieser Seite wird eine Klasse aber doch groß geschrieben. Dann bin ja beruhigt 🙂 Und an die Methodenschreibweise werde ich mich halt einfach nicht gewöhnen, da ich zu oft zwischen C# und Java wechsle.

@ec: Richtig, der Thread ging ja eigentlich mal um Deine Probleme... 🙂
Ich verstehe nicht, warum Du unbedingt beides in Deiner Klasse haben willst. Also sowohl alle Cluster als auch alle Blocks mit Clustern. Die Blocks mit Clustern reichen doch völlig aus. Wenn Du alle Cluster nacheinander ausgeben oder sonstwie verwenden willst, dann machst Du halt zwei Schleifen. Eine äußere die die Blocks durchläuft und eine innere für die Cluster.
Das ganze in eine Methode mit sprechendem Namen gepackt, der meinetwegen mit einem Großbuchstaben beginnt und gut is.

26.05.2006 - 16:15 Uhr

Original von herbivore

  1. Solltest Du Klassennamen immer groß schreiben
    es gab mal eine Konvention für C das zu tun. In C# ist das nicht so. Dort ist die Konvention PascalCase.

Heißt PascalCase nicht lediglich, dass man Binnengroßschreibung verwenden soll / kann / muss / darf? Mal abgesehen davon: Klassennamen werden in C, C++ und Java (mehr kenn ich nicht ausreichend) groß geschrieben und ich denke, es ist für jeden, der nicht mit C# anfängt zu programmieren, sonderm vorher einen andere Sprache benutzt hat, eine echte Folter, diese seltsamen groß geschriebenen Funktionsnamen zu sehen. Wenn dann auch noch klein geschriebene Klassennamen hinzukommen, dann macht es mir schon Sorgen, dass die Fenster bei uns im vierten Stock nicht verschlossen sind...

26.05.2006 - 15:56 Uhr

AutoIncrement ist ein Schrott von MySQL und MS (Identity). Bei FireBird gibts da Generatoren, die sich so ähnlich wie Sequences in Oracle, verhalten.

Wieso Schrott? Ich finde sehr einfach, einer ID-Spalte einfach die Eigenschaft auto increment zu geben und gut ist es. Ok, ich habe nicht die Möglichkeit, die Schrittweite einzustellen und was weiß ich was diese Generatoren können, aber wozu auch?

Original von Lord Hessia
Ok, es gibt auch grafische Tools, die auch auf der Webseite von Firebird aufgeführt sind, aber es sind derart viele, dass man als Anfänger völlig verloren ist.
IBExpert Personal 👍. Das Ding ist spitze.

Ok, wurde ja weiter oben schon einmal erwähnt und ist wohl einen Test wert.

Original von Lord Hessia
Nachdem ich dann ein nettes runtergeladen hatte und ich nach ewigem probieren festgestelllt habe, dass das offenbar gar keine Tabellen anlegen kann, da habe ich die Geduld verloren und mir mal PostgreSQL angesehen.
Kann ich nicht bestätigen. Hast du danach auch ein Commit gemacht? Wlches Tool hast ud verwendet?

Wie gesagt, es hatte einfach keine Möglichkeit geboten, eine Tabelle anzulegen. Kein "new table" oder so. wenn ich mich nicht irre, dann hieß das Tool FeniSQL.

Original von Lord Hessia
Kurzum: Ich werde wohl in Zukunft PostgreSQL verwenden, nicht zuletzt weil es die durchschaubarere Lizenz bietet.
Hat der FB doch auch 🤔 Du kannst ihn einsetzen wie du willst, ohne was zu blechen 👍

Genau das habe ich versucht herauszufinden. Da ich die einzelnen Lizenztexte immer etwas kompliziert finde, habe ich mich über google etwas über die IPL schlau gemacht und z.B. auf gnu.org wird eher von ihr abgeraten: http://www.gnu.org/philosophy/license-list.html
Postgre stattdessen verwendet die BSD und diese besagt ja im Prinzip nur, dass man die Lizenzhinweise der verwendeten Software nicht entfernen darf.

26.05.2006 - 15:27 Uhr

@Robert: Danke, jetzt habe ich es verstanden. Hatte nen Denkfehler - dachte Robert spricht allgemeine über das Konzept der Exceptions und nicht über den Teil des Methodenheaders, wo die geworfenen Exceptions aufgelistet werden...

26.05.2006 - 12:28 Uhr

Ein paar grundsätzliche Dinge:

  1. Wenn Du eine ArrayList verwendest, dann kannst Du diese auch mit einem Enumerator durchlaufen (ist mitunter einfacher als ein Zugriff über den Index).
    IEnumerator enumerator = arrayList.getEnumerator();
    while (enumerator.MoveNext()) {
    Object element = enumerator.Current;
    }

oder

foreach (Object element in arrayList) {

}

  1. Kannst Du die Elemente, die Du mit dem Enumerator oder über den Zugriff per Index erhälst, auch casten:
    Cluster element = (Cluster)enumerator.Current;

  2. Solltest Du Klassennamen immer groß schreiben

  3. Warum brauchst Du denn in Deiner clustermap sowohl _clusters als auch _blocks-_clusters? Würde nicht _blocks-_clusters reichen? Damit kannst ja auch auf alle Cluster zugreifen...

  4. Kannst Du auch immer ne eigene Collection, Liste wie auch immer basteln (ist dann sinnvoll, wenn Du eigene Methoden anbieten willst), indem Du von einer dieser Klassen ableitest.

  5. Übergebe ich an einen Nachredner, der vielleicht auch auf Dein eigentliches Problem eingeht und mich ggf. in dem einen oder anderen Punkt korrigiert...

26.05.2006 - 12:04 Uhr

@marsgk: Wieso gibt es in C# keine throws?

26.05.2006 - 01:09 Uhr

Ich habe mir nach Deiner Empfehlung mal Firebird angesehen, aber ich fand es alles andere als leicht zu bedienen. Ich habe ne Stunde gebraucht, herauszufinden, wie ich mich anmelde (ok, mag auch daran gelegen haben, dass ich nicht richtig gelesen habe, da es ja eigentlich in der umfangreichen Doku beschrieben war, wie es geht. Aber eine Schnellanleitung, die beschreibt, wie man sich anmeldet und die erste Tabelle anlegt wäre schon nicht verkehrt).
Die SQL-Konformität ist ja super, aber dass es kein auto increment gibt, das ist schon blöd.
Die Konsole ist ja eher ein Krampf z.B. um ne Tabelle anzulegen (vor allem wenn sie 25 Spalten hat 🙂). Ok, es gibt auch grafische Tools, die auch auf der Webseite von Firebird aufgeführt sind, aber es sind derart viele, dass man als Anfänger völlig verloren ist. Nachdem ich dann ein nettes runtergeladen hatte und ich nach ewigem probieren festgestelllt habe, dass das offenbar gar keine Tabellen anlegen kann, da habe ich die Geduld verloren und mir mal PostgreSQL angesehen.

Und da muss ich sagen, das ist wirklich einfach zu bedienen. Ok, die Silent-Installation, die ich gerne nutzen würde, da man diese einfach bei der Installation des Programms automatisch mit aufrufen könnte, die wurde jedes Mal mit einer kryptischen Fehlermeldung abgebrochen. Aber die normale Installation hat problemlos geklappt. Dass man die DB nicht als Applikation starten darf, wenn man Admin ist, das halte ich für etwas über das Ziel (möglichst hohe Sicherheit) hinausgeschossen und Bevormundung des Nutzers, aber sonst gibt's wenig zu meckern. Nur eins sollte man nie machen: Großbuchstaben in Namen von Tabellenspalten verwenden!!!

Kurzum: Ich werde wohl in Zukunft PostgreSQL verwenden, nicht zuletzt weil es die durchschaubarere Lizenz bietet.

25.05.2006 - 00:07 Uhr

Ach, da gibt es auch ne Struktur bei Webparts? Das haben die Bücher, die ich bislang gesehen habe, wohl irgendwie vergessen. Die waren schon stolz, wenn sie nicht alles in eine Methode im WP gepackt haben... 🙂

Ich habe jetzt mal versucht, den Webservice zu erstellen, aber schon mit dem Standardbeispiel gab es Probleme: Der Ausgabepfad (Kontextmenü des Projekts: Konfigurationseigenschaften/Erstellen/Ausgaben/Ausgabepfad) lässt sich nicht ändern. Für alle meine Webparts musste ich den immer auf das bin-Verzeichnis des IIS ändern und das wird bei dem Webservice wohl nicht anders sein oder? Ich habe es dann mal ohne Änderung versucht, aber dann gibts ne Fehlermeldung:
Die Erstellungsausgaben konnten nicht in das Web kopiert werden. "D:\Dokumente und Einstellungen\Administrator\VSWebCache\FLOWIN2003\WordSerienbrief\bin\WordSerienbrief.dll" konnte dem Projekt nicht hinzugefügt werden. Serverfehler: Die folgende(n) Datei(en) wurden vom Administrator gesperrt: bin/WordSerienbrief.dll

24.05.2006 - 17:52 Uhr

Wenn ich Dich richtig verstanden habe, dann solltest Du Dir eine DBWrapper-Klasse schreiben (macht man in der Regel auch, um die SQL-Sachen aus dem Code heraus zu lassen). Diese instanziiert dann an geeigneter Stelle die SQL-Connection (z.B. im Konstruktor) und bietet dann Methoden an, denen Du die gewünschten SELECTs übergeben kannst. In der Methode kannst Du dann das Ergebnis des SELECTS z.B. in den gewünschten Array schreiben und zurückgeben.

Gruß Flo

23.05.2006 - 12:20 Uhr

Ich hoffe, ich kann hier im Forum auch eine Frage zu Sharepoint stellen...

Wir versuchen über eine Sharepoint-Seite einen Word-Serienbrief an ausgewählte Personen zu schreiben. Die direkte Verknüpfung mit Word, die ja normalerweise möglich ist, geht bei uns leider nicht, da wir die Personen nicht in einer Sharepoint-eigenen Tabelle eingetragen haben, sondern in einer anderen Datenbanktabelle.

Folglich müssen wir ungefähr folgendermaßen auf Word zugreifen:

private interop.word.ApplicationClass WordApp = new interop.word.ApplicationClass();

Allerdings gibt es dann folgenden Fehler: "Webpartfehler: Eine der Eigenschaften des Webparts hat ein ungültiges Format. Windows SharePoint Services kann das Webpart nicht deserialisieren. Überprüfen Sie das Format der Eigenschaften und versuchen Sie es erneut."

Hat jemand eine Ahnung, woran das liegen kann bzw. vielleicht schonmal selber versucht, aus einem Webpart auf die Word ApplicationClass zuzugreifen?

Gruß Flo

22.05.2006 - 14:49 Uhr

Ich weiß nicht, ob das auch in SQL geht, aber manche Sprachen erlauben so etwas:
A[0-9]* (A und beliebig viele Ziffern)
A[0-9]+ (A und beliebig viele Ziffern, mindestens jedoch eine)

22.05.2006 - 14:45 Uhr

Ich habe gearde gelesen, dass MySQL für kommerzielle Nutzung nicht kostenfrei ist. Es gibt ja noch jede Menge anderer Open Source DBMS. Ich bin bereits nach kurzer Suche zu der Liste PostgreSLQ, Firebird, Derby (nur für Java?) und Ingres gekommen, so dass es doch kein Problem sein sollte, auchein kostenfreies DBMS mit Qualität zu finden. Habt ihr schon Erfahrungen mit den genannten oder noch anderen Open Source Datenbankmanagementsystemen? Mich würden dabei folgende Punkte besonders interessieren:

  • Performance (besonders bei Updates)
  • Einfache Installation (der Komfort bei der Administration ist dagegen relativ egal)
  • Ansprechbar über ODBC (dürfte ja ohnehin für jedes gelten)
  • SQL-Standard-Konform (bzw. welche Abweichungen gibt es - ich will eh keine abgefahrenen Sachen machen)

Es wäre super, wenn sich hier ein paar Meinungen einfinden würde.

Gruß Flo

22.05.2006 - 14:30 Uhr

Gab es nicht so etwas wie LIKE 'A%'?

22.05.2006 - 13:16 Uhr

hast Du mein Programm mal getestet? Dann würdest Du nämlich sehen, dass das geht. Das ist ja das wirklich tolle daran.

Zu meiner Schande muss ich gestehen, dass ich das noch nicht gemacht habe, da ich zur Zeit nicht an dem entsprechenden Rechner sitze. Wird aber heute abend nachgeholt. Vielen Dank!

22.05.2006 - 11:41 Uhr

@Lynix: Das werde ich mir mal anschauen, aber es geht im konkreten Fall nicht um die Frage, wie die Daten zwischen den Programmen ausgetauscht werden sollen. Darauf habe ich keinen Einfluss, da das sendende Programm nicht von mir ist und ich deshalb auf das Registrieren eines COM-Objekts festgelegt bin. Es geht nur um die Frage, wie ich die Konsolenanwendung dazu bringe, nicht einfach zu beenden, wenn der Programmcode abgearbeitet ist. Bei einer Windows-Form-Applikation (oder wie heißen die Dinger mit GUI bei C#?) hätte ich dieses Verhalten ja quasi umsonst dabei, aber die GUI brauch ich nicht, dafür aber jede erdenkliche freie Ressource.

@norman_timo: Die einfachsten Wege sind halt doch oftmals die besten 🙂
Kann man eigentlich trotzdem noch Fehlerausgaben auf die Konsole machen, wenn man schon Console.ReadLine(); gesagt hat?

22.05.2006 - 00:45 Uhr

Hallo.

Ich würde gerne eine Konsolenanwendung derart gestalten, dass sie im Hintergrund weiterläuft und Events verarbeitet, die ihr von einem anderen Programm geschickt werden. Momentan wird die Konsolenanwendung direkt beendet wird, wenn der Programmcode abgearbeitet wurde (Registrieren der EventHandler etc.).
Wie schaffe ich es, dass die Anwedung aber weiterläuft auch wenn sie erst einmal nix mehr zu tun hat? Muss man dafür einen Thread starten oder geht das auch durch irgendeine Einstellung?

Gruß Flo