Laden...
D
diamond myCSharp.de - Member
Softwareentwickler Deutschland Dabei seit 29.06.2007 38 Beiträge
Benutzerbeschreibung

Forenbeiträge von diamond Ingesamt 38 Beiträge

18.11.2011 - 13:45 Uhr

Dass Multi-Threading nicht unbedingt einfach ist, ist mir schon klar und ich kenne auch die Probleme, die dabei Auftreten können (sicherlich aber nicht alle). 😃
Mein Problem beruht aber mehr auf ein Missverständnis, ich hatte nämlich laienhaft gedacht, dass bei dem Aufruf "Parallel.ForEach(...)" schon alles intern berücksichtigt wird (was schon ziemlich cool wäre).
Dem ist aber leider nicht so, jetzt ist es verstanden.

Danke!

18.11.2011 - 10:31 Uhr

Hallo Leute,

ich habe erst seit kurzem angefangen die Parallel.ForEach Lösung zu nutzen. Diese fand ich auch soweit ganz gut, bis ich feststellen musste, dass die Ergebnisse die dabei raus kommen bei jedem Durchlauf unterschiedlich sind.

Für bessere Verständnis habe ich hier ein paar einfache Beispiele wobei int-Werte zu einer Summe addiert werden.
Was haltet Ihr davon? Bzw. habe ich vielleicht einfach etwas falsch verstanden?

            List<int> zahlen = Enumerable.Range(1, 10000).ToList();
            int newSum1 = Enumerable.Range(1, 10000).Sum();                     //newSum1 == 50005000 (entspricht einer normalen ForEach Schleife)
            int newSum2 = Enumerable.Range(1, 10000).AsParallel().Sum();        //newSum2 == newSum1 (auch nicht schlecht, parallel kann also nicht ganz verkehrt sein)

            int newSum3 = 0;
            Enumerable.Range(1, 10000).AsParallel().ForAll(z => newSum3 += z);  //newSum3 != newSum1

            int newSum4 = 0;
            System.Threading.Tasks.Parallel.ForEach(zahlen, z => newSum4 += z); //newSum4 != newSum1

            int newSum5 = 0;
            System.Threading.Tasks.Parallel.For(0, zahlen.Count, z => newSum5 += z); //newSum5 != newSum1

Nutzen tu ich die Parallel.ForEach in Wirklichkeit zum Durchlaufen einer Liste mit Objekten und dort habe ich eben auch das Gefühl, dass ein Teil gar nicht durchlaufen wird, weil die Werte am Ende von den Werten einer normalen ForEach Schleife abweichen.

Kommt es evtl. zu irgend welchen Kollisionen, weil es ja parallel in unterschiedlichen Threads läuft, am Ende aber alle Threads in einer und die selbe sum-Variable addieren sollen?
Warum klappt es dann mit "int newSum2 = Enumerable.Range(1, 10000).AsParallel().Sum();"

vielleicht weiß es wer besser?

15.09.2011 - 21:20 Uhr

😃

nur weil es bei der 2ten Variante etwas mehr Zeichen sind, muss diese nicht gleich schlicht sein.
Am Ende wird man eher eine kurze Methode Aufrufen, die entweder die eine oder die andere Lösung beinhaltet.
Und welche der beiden Lösungen am Ende gewinnt entscheidet neben deren Kürze evtl. auch die Performance (wenn da überhaupt was messbar ist).

Danke für deinen Tipp, der Schock ist zunächst vorüber 😃

15.09.2011 - 19:06 Uhr

OK, so einfach kann das gehen!

Danke.

Eine andere Lösung wäre die folgende:

System.ComponentModel.TypeConverter converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(int));
            object obj = converter.ConvertFromInvariantString("-1");
15.09.2011 - 18:49 Uhr

Hallo Leute,

heute habe ich eine schockierende Erfahrung gemacht! Mal sehen, wer von euch C#pern mich beruhigen kann 😃

Folgender Fall. Ein Programm speichert 100te von verschiedenen Einstellungen in eine INI Datei. Unter diesen Einstellungen sind such negative Zahlen-Werte bei.

Beim Speichern in diese INI Datei wird eine solche negative Zahl (z.B. -1) einmal ToString() gewandelt.
Beim Lesen aus der INI Datei kommt ein String "-1" welcher per Convert.ToInt32("-1") wieder zurück zu einem gültigen Int-Wert gewandelt wird.
Soweit alles keine Problem.

Jetzt kommt ein User, der in seinen Windows Region und Sprach-Einstellungen einfach mal das "Negatives Vorzeichen" von Minus "-" auf "*" geändert hat.
Ab diesem Moment ist die INI Datei für das Programm nicht mehr brauchbar,
denn ein Convert.ToInt32("-1") scheitert mit einer FormatException.
Ab diesem Moment versteht nur noch Convert.ToInt32(" *1").

Anders rum, aus Int nach String, kommt nun auch nicht mehr "-1" sondern " *1".

Also ich hab ja nichts dagegen, wenn eine User sich das Negative Vorzeichen auf etwas anderes als ein "-"-Zeichen einstellt, soll er doch machen was er für richtig hält. Das mag von mir aus auch in irgend welchen Ausgaben (Labels, Ausdrucke etc.) gut aussehen, aber als ich feststellen musste, dass C# mit Convert.ToInt32("-1") nicht mehr auf eine Zahl -1 kommt, da war ich baff.

Das war für mich fast selbstverständlich, dass C# damit umgehen kann. Fix haben wir es unterm alten Visual Basic ausprobiert, der kann damit umgehen.


C# soll einfach unabhängig von den Systemeinstellungen einen String "-1" als eine Zahl -1 erkennen und umgekehrt von -1 in einen String "-1" wandeln.

Also was sagt ihr zu diesem Problem und viel wichtiger, wie kann man es lösen?

03.01.2011 - 19:09 Uhr

Kurzer Stand der Dinge:
heute kam ich tatsächlich auch einmal zum Testen, leider aber auch nur ein Tool.
Das Tool von DevExpress, es nennt sich XtraReports.
Ich war schon verwundert, dass nach der Installation der Demo sofort alles lief (ohne irgend welche Stolpersteine, wie es oft bei solchen Demos gibt). Die Aufmachung der Demo sieht auch sehr bemüht aus, im Vergleich zu den anderen beiden Kandidaten die ich bereits kenne und erwähnt habe.

Neben den vielen Report Demos die diese anbieten, gab es eine die für mich für diesen Fall besonders interessant war, diese nennt sich "Large Quantity of data". Diese Demo Generiert aus 100.000 Zeilen in weniger als 1Minute 2600 Seiten. Aus den nun 3 bekannten Tools ist dieses Tool von der Performance her das beste.

100.000 Zeilen waren mit aber noch zu wenig, also prompt auf 400.000 Zeilen erhöht und lass ihn generieren. Dafür brauchte das Tool etwas über 4 Minuten und generierte dabei rund 10.300 Seiten. Auch besser als die anderen, hat man hier sofort die Druckvorschau mit den generierten Seiten, während der Rest noch läuft. Das Scrollen und Zoomen ist ebenfalls sofort und vor allem ruckelfrei möglich (während er noch beim Generieren ist). Der Speicherverbrauch bei 10.300 Seiten lag bei 'nur' 700 MB, was nicht heißt, dass das Tool soviel verbraucht. Im Hintergrund ist auch noch die DataTable mit den 400.000 Zeilen.

Der nächste Kandidat wäre List & Label, diesen probiere ich demnächst auch mal aus.

22.12.2010 - 12:10 Uhr

@gfoidl,

was in meinem Fall überhaupt nicht geht, ist etwa etwas auf die Festplatte zu cachen, in Form von Dateien. Wenn du es in diese Richtung gemeint hast, wegen XML Daten. Natürlich könnte man die XML Daten auch im Arbeitsspeicher vorliegen haben, aber dann belegen Sie ja auch einiges oder verstehe ich etwas falsch.

Außerdem muss es in meinem Fall möglich sein, die Daten vorher in einer Druckvorschau anzuzeigen, das ist auch eher der Grund weshalb es ressourcenmäßig Probleme gibt.

COne bspw. baut zunächst ein Document-Objekt auf, der nur die reinen Definitionen und Daten enthält, das wäre noch nicht so schlimm, aber dann muss es auf's Blatt bzw. in die Druckvorschau. In dem Moment fängt die Malerei an und es verbraucht noch einmal mind. genau soviel Arbeitsspeicher. Es kann also passieren, dass man im Hintergrund ein Document-Objekt mit 10.000 Seiten hat (was sehr viel wäre), dann freut man sich aber leider zu früh, den das Objekt belegt schon mehr als 1GB im Arbeitsspeicher. Davon bekommt man dann vielleicht nur 1000 Seiten generiert und hat nix gewonnen.
Es wäre vielleicht schlauer die Seiten erst auf Anforderung zu generieren, also wenn man bspw. in der Druckvorschau blättert, geht aber leider wieder nicht, wenn man es ohne Druckvorschau direkt an den Drucker senden möchte. Ist auch etwas, wo wir leider auch keinen Einfluss drauf haben, da wir nicht bei COne arbeiten 😃
Dies nur so als Beispiel zur näheren Verständnis.

Die meisten von Euch kennen doch sicherlich MS Excel

Generiere dort einfach Dummy Daten in 1Mio. Zeilen in klicke auf Seitenansicht-
Die Ansicht ist in 3sekunden auf dem Bildschirm und hat weit über 10.000 Seiten.
Wenn man jetzt auf Drucken klickt, dauert es noch einmal 10sek.

So etwas suche ich (völlig egal wie sie das im Hintergrund lösen).
Wahrscheinlich könnte man auch was eigenes Programmieren, etwa mit PrintDocument und PrintPreview, aber da Sitz man dann sicherlich auch eine Weile dran und wird am Ende noch 100te Fälle nicht bedacht haben.

03.12.2010 - 17:30 Uhr

@herbivore,

hätte ja sein können, dass jemand mal vor dem gleichen Problem stand und heute einfach mal besser informiert ist als ich.
Ich suche ja schließlich nicht irgend welche Reporting Tools, sondern solche die möglichst viele Seiten mit möglichst wenig Speicherverbrauch schaffen, was eher eine Seltenheit ist. Die meisten drucken irgend welche Rechnungen oder Formulare und niemals über 3500 Seiten (mein Rekord mit Active Reports 6).

02.12.2010 - 18:05 Uhr

@zommi,

ich denke nicht, dass ich mich selbst an das Ausrechnen ran wagen möchte 😃

Der Beitrag unter deinem Link ist aber sehr interessant, danke für den Hinweis. 😃

02.12.2010 - 16:48 Uhr

Ich würde gern wissen, was ein Objekt oder ein Array mit Objekten tatsächlich an Speicher belegt. Welche gute Möglichkeiten kennt Ihr?

02.12.2010 - 16:23 Uhr

Hallo zusammen,

ich wollte mal eben in den Raum fragen, welche Reporting Tools ihr kennt, ich meine solche wie z.B. Crystal, ActiveReport oder COne Reports.

Konkret bin ich auf der Suche nach solchen, die wirklich was aushalten können, ich spreche von 1000den von Seiten und möglichst wenig Speicherverbrauch.

Die letzteren beiden kenne ich bereits, Crystal nur vom Hören, bezweifle aber das es die Anforderungen schafft.

Active Reports 6 bspw. verbraucht in meinem Testfall bei 3500 Seiten ca. 1GB Arbeitsspeicher. Natürlich sind 3500 Seiten Menge und keiner wird sich das wohl antun, diese auszudrucken.

11.05.2010 - 17:07 Uhr

Hallo Th69,

ok, so ist es natürlich viel besser. 😃

Thx

11.05.2010 - 15:38 Uhr

nein leider bringt die fallback zeile noch nichts.

Meine erste Idee war das Operatoren Array zu erweitern, mit

static new Operator[] Operators =
        {
            ...
            new Operator("*-", MulNegativ, OpType.Binary, 2),
            new Operator("/-", DivNegativ, OpType.Binary, 2),
            new Operator("*+", Mul, OpType.Binary, 2),
            new Operator("/+", Div, OpType.Binary, 2)
        };

MulNegativ und DivNegativ haben es dann errechnet, in dem Moment hatte ich nur noch nicht gemerkt, dass es noch andere Konstellationen geben könnte 😦

Wenn die Operatoren mit Whitespaces gekapselt sind, klappt es ja, daher meine nächste Idee, den Formula String vor dem Parsen Char für Char durchzugehen und bei jedem operator ein Whitespace vor zu setzen.

Wodurch aus 3*-3 ein 3 * -3 entstehen würde.

Was meinst du dazu?


public T Parse(Str function, T x)
{
    function = NormalizeFormula(function);

    
    sFunction = function;
    xValue = x;

    Functionator = function.GetEnumerator();

    char c = '\0';
    T y = Expression(ref c);
    if(c != '\0')
        throw new FctException("Unexpected character at end of expression", c);

    return y;
}


public Str NormalizeFormula(Str function)
{
    Str newFunction = String.Empty;
    IEnumerator<char> e = function.GetEnumerator();
    while (e.MoveNext())
    {
        char chr = e.Current;
        bool isOp = false;

        IEnumerator<Operator> opEnum = Operators.GetEnumerator();
        while (opEnum.MoveNext())
        {
            Operator op = opEnum.Current;
            if (op.sOp == chr.ToString())
            {
                isOp = true;
                break;
            }
        }
        if (isOp)
            newFunction += " " + chr;
        else
            newFunction += chr.ToString();

    }
    function = newFunction;
    return function;
}

11.05.2010 - 09:16 Uhr

da scheint noch ein BUG zu sein.

nutze den FormulaParser und wenn ich versuche die folgenden Ausdrücke zu parsen, kommt er auf eine Exception

3*-3
3/-3

zwischen den beiden operatoren ist in meinem fall kein leerzeichen. sobald ein leerzeichen zwischen ist, funktioniert es wiederrum.

ich glaube zu dieser exception wird es immer kommen, wenn zwei operatoren hintereinander eingegeben werden, also auch beim ausdruck 3--3.

lässt sich das problem irgend wie lösen?

04.05.2010 - 12:53 Uhr

@Th69

nun benutze ich deine Klasse auch! 😃
Ich muss schon sagen, einfach genial, vor allem die performance!

ReSpEkT!!

15.12.2009 - 14:31 Uhr

also virtual mode wäre hierbei tatsächlich eher kompliziert.
man muss an viele dinge denke, die so beim scrollen passiert bzw. ein scrollen verursachen.

ich denke ich werde die reader variante nehmen, da ich tatsächlich die daten nicht verändern sondern nur anzeigen mächte. ich hatte es kurz probiert, er braucht etwa eine sekunde weniger zum lesen aller sätze, dafür bekomme ich die sätze tatsächlich sofort. außerdem spare ich mir dabei die unnötige große datatable im arbeitsspeicher (ca. 150MB hat diese belegt).

nochmals vielen dank an alle für die guten anregungen. 😉

15.12.2009 - 14:05 Uhr

hallo BerndFfm,

ich will die daten in einer liste anzeigen.

den reader kannte ich bisher nur wenig und kam meistens mit dem adapter zurecht,
da nie so viele daten gelesen wurden, wie diesmal.

gibt es bei dem reader irgend welche nachteile?
ich las eben, wenn ich es richtig verstanden habe, dass diese das connection objekt solange blockiert.

15.12.2009 - 13:01 Uhr

Hallo,

vielleicht kennt ja jemand einen Guten Tipp für mich.

Mein Programm kann mit Access wie SQL Server umgehen (was hierbei wohl eher unwichtig ist).

Das Problem ist nun, wenn ich versuche per Select Statement mehr als 100.000 Sätze in eine DateTable zu lesen (mit vielen Spalten), bleibt das Programm solange stehen, wie es dauert diese Sätze von der Datenbank zu erhalten und in die DT zu pumpen.

Ich mache es per DataAdapter, dessen Methode Fill(DataTable).

Was ich gern hätte ist, dass ich irgend wie bereits an die ersten übermittelten Zeilen ran kommen, um diese schon einmal zu verarbeiten.
So ähnlich wie es bspw. beim SQL Server Management Studio abläuft, wenn ich die gleich Anfrage absetze, malt mit das SQLMS sofort die Sätze hin, so dass ich für meine Abfrage insgesamt nur 5sek gebracht habe, anders in meinem Programm 10sek bis die DT aufgebaut ist und die Auflistung solange leer steht.

Hat jemand einen Rat?

Vielen Dank im Voraus.

20.02.2009 - 20:11 Uhr

Hallo jaensen,

danke für den Tipp, das Beispiel ist perfekt.

Danke danke.

20.02.2009 - 16:00 Uhr

Hallo liebe CSharper,

weiß jemand von euch, wie man aus einer ico-Datei, die Icons in verschiedenen Größen und Farben führt, die einzelnen Icons extrahiert?

Meine ico-Datei hat Icons in Größen 16x16, 24x24, 32x32 etc., wenn ich das Icon-Objekt per ToBitmap zum bitmap wandle, wird automatisch das 32x32 Icon genommen. Ich brauche aber 16x16.

Ich danke für jeden Tipp.

20.01.2009 - 20:43 Uhr

@FZelle
sicherlich weiß ich das.

Das der Kunde kein Ahnung von der Technik hat ist wohl auch klar. Und wenn ein Kunde schon mal kein Geld für Server und Software hat, dann sicherlich schon gar nicht bereit einen IT Berater zu beschäftigen, der ihm den SQL Server Express installiert.

Und solche Kunden gibt leider viele. Deshalb wäre eine Access Lösung für solche gerade so zumutbar, da ist ja nur eine Datei die irgend wo rumliegen muss.

Dein Vorschlag mit dem CommandBuilder.ConflictOption kannte ich tatsächlich noch nicht, dem werde ich mal nachforschen.

Danke für den Tipp!

20.01.2009 - 20:22 Uhr

@burning show

entweder oder, beide Probleme sind nicht ohne!

Mit dem SQL Server wäre einiges einfacher, jedoch habe ich feste Vorgaben.
Das Programm muss in erster Linie mit Access arbeiten, da viele Kunde nicht bereit sind, Geld für Server oder teure Software auszugeben.
Die die bereit sind, für die soll es auch mit dem SQL Server funktionieren.

An dieser Vorgabe lässt sich nichts drehen. Ich persönlich würde lieber den SQL Server nehmen.

Beim SQL Server hat man die Möglichkeit, bei jeder Änderung an den Daten, die man selbst ließt, ein Event zu erhalten. Somit könnte ich die geänderte Row ermitteln und entsprechend vorgehen (ob nun die Row sichtbar sperren oder im Hintergrund aktualisieren, damit der akt. User sie gleich überschreiben kann). Vorteil: ich muss nicht ständig gegen die Datenbank pollen, damit weniger Traffic.

Beim Access müsste man tatsächlich etwa mit einem TimeStamp pro Row arbeiten. Das Problem ist, das man den TimeStamp zu jeder Row ständig in der Datenbank abfragen müsste. Gut, wenn der User zum Bearbeiten des Satzes zuerst, wie du beschreibst, den Satz für sich reservieren soll, werden es nicht so viele Abfragen, wie wenn man das ständig beim durchgehen alle Rows tun würde.
Aber auch diese Lösung würde der eine oder andere Kunde mir vermutlich um die Ohren schmeißen, weil seine Mitarbeiter ständig über gesperrte Sätze nörgeln.

Ja,... eine schwere Lage.

Meine Hoffnung bei diesem Beitrag ist einfach, dass jemand kommt und sagt: "das muss alle ganz anders laufen, nämlich so....".

20.01.2009 - 18:12 Uhr

Hallo,

Auch ich würde dem zustimmen, dass > 1 User nicht an einem und dem selben Satz zu arbeiten haben, aber die Realität ist da leider anders.
Es kommt leider tatsächlich vor.
Bei einer Schreibmaschine handelt es sich ja auch um genau 1 Eingabegerät, mit genau 1 PC wäre das auch kein Problem.
In dem Fall sitzen aber die User weg von einander entfernt und sogar theoretisch ist es denkbar, dass beide an dem gleichen Satz schreiben wollen.

@Krieger:
Wenn ich eine DataRow sperren könnte, wäre das eine Hilfe. Nur wüsste ich nicht wie!
Ich denke die DataTable ist ein lokales Abbild im speicher, wie soll man den eine einzige Row davon sperren, so dass die Sperre synchron bei allen anderen wirksam wird?

@Kaji

Deswegen müssen sich die Leute untereinander einigen oder einer kriegt Priorität. Oder du zeigst dem der langsamer ist als der anderen den geänderten Satz und er kann entscheiden ob er den neuen oder seinen Satz nehmen will.

Kannst du dir vorstellen, dass Kunden die mit deinem Programm arbeiten wollen und dafür Geld bezahlt haben, dir für eine solche Lösung das Programm um die Ohren hauen würden? Ich meine, ich stimme dir zu, aber in der Realität ist es anders, die Leute reden weniger mit einander, es sei den es läuft was schief. 😦


Ich würde es sogar in Kauf nehmen, wenn immer der letzte User beim Speichern gewinnen würde. Aber das Problem ist, dass schon nach dem ersten User niemand mehr Speichern kann, ohne dass er die DataTable vorher refreshen müsste -> wegen Parallelitätsverletzung.

Alles nicht rosig.

20.01.2009 - 16:47 Uhr

@Kaji,

in meinem Fall wollen alle 10 User auf dem selben Satz schreiben.

solange sie auf unterschiedlichen Sätzen schreiben, wäre es zunächst in Ordnung, bis dann wieder ein User 5 neben seinem Satz, den Satz vom User 10 ändern will.

20.01.2009 - 16:26 Uhr

@Kaji,

die 10 User müssen nicht unbedingt dasselbe eingeben. Sobald einer der User gespeichert hat, können die anderen nicht am selben Satz speichern, da die Daten in der jeweiligen Datarow (lokal) sich auf einmal mit den auf dem Server unterscheiden.

Würde man versuchen, im Hintergrund die Daten in der lokal DataTable oder DataRow immer vom Server zu refreshen, gäbe es vielleicht keine Warnungen aber im nachhinein immer noch viel Probleme. Den dann würden alle User speichern können und es würde immer der Satz vom letzten User gewinnen.

Das was JAck30lena beschreibt, mit gelben und roten Feldern, daran hatte ich auch mal gedacht. Aber zunächst müsste man es irgend wie realisieren, dass alle Client von jeder Änderung an den Daten irgend wie mitbekommen (auf dem SQL Server bekommt man z.B. eine Event, bei Änderung an Daten, bei MS Access eher nicht).

Und was dann? Dann würde der erste User Daten verändern und die restlichen 9 sehen, dass es eine Änderung gibt, das eigentliche Problem würde aber weiterhin bestehen bleiben. Die restlichen 9 User könnten nicht speichern, da sich die Daten in der lokalen DataTable wieder mit dennen in der Datenbank unterscheiden würden.

Oder denke ich einfach zu kritisch?

20.01.2009 - 15:59 Uhr

Hallo Peter,

interessant!

Wie FZelle schrieb:

Das Prinzip von ADO.NET verstehen, akzeptieren, und dementsprechend zu handeln.

was meint er wohl.

Ich denke in einem Forum wie diesem finde ich mehr und vor allem schneller Infos, als in Büchern.
Ich denke nur, in einem profi Forum sind Antworten ala

Das Prinzip von ADO.NET verstehen, akzeptieren, und dementsprechend zu handeln.

Fehler am Platze, mehr nicht.

Aber OK.

Gut Peter, mein Problem:

Das Programm soll in einer SQL Server Datenbank Daten speichern. Das Programm wird von mehreren Usern gleichzeitig genutzt, sagen wir mal 10.
Jeder User kann die Daten sehen und Bearbeiten (es sind komplizierte Kundenstammdaten, die nicht mal eben in 5sek. eingepflegt sind, 10 Sätze).

User 1 bis 10 laden sich zur gleichen Zeit die 10 Sätze in eine DataTable. User 1 verändert den ersten Satz und speichert diesen. Die User 2 bis 10 wollen ebenfalls an den ersten Satz ran. Beim Speichern erhalten die 9 User eine Meldung, aufgrund einer Parallelitätsverletzung, Speichern nicht möglich. Sie ärgern sich, das sie nun die Daten komplett neu eintippen müssen. Jetzt sind die 9 User übrig, wieder zur gleichen Zeit und wieder gewinnt nur eine, die restlichen 8 ärgern sich, usw.

Das ist im Moment ein Problem, welches mir so sorgen bereitet. Eine Lösung gibt es sicherlich immer, nur möchte ich nicht voreilig irgend etwas Programmieren und später erfahren, dass es bereits länger andere bessere Techniken gibt.

Bei Access gibt es noch andere Probleme, wie z.B. die fehlende Aktualisierung der AutoWert Spalte in einer neuen eingefügten und abgespeicherten DateRow. Dafür habe ich zwar schon eine Lösung von einer Microsoft Seite, die im Moment noch gut ausschaut. Aber auch da frage ich mich einfach, warum hat man das nicht gleich vorgesehen. Das RecordSet Objekt von ADODB (VB6) konnte dieses z.B. besser.

Wenn man sich nun einige Tage mit solchen Probleme beschäftigt, fragt man sich vielleicht, ob es da nicht noch irgend welche anderen Schwächen gibt, die einem erst später auffallen, wo eine Änderung am Programm nicht mehr so einfach wäre.

Also erstelle ich das Thema hier im Forum, um zu erfahren, ob es da nicht irgend welche bessere Techniken gibt, zum Thema Multi User/Client App und SQL Server (oder MS Access).

Ich suche nicht nach einem Rat zu einem bestimmten Fehler/Problem, sondern frage Euch, die vielleicht mehr Ahnung haben, ob es irgend welche Techniken gibt.

20.01.2009 - 15:07 Uhr

Hallo Peter,

verstehst du den das Prinzip von ADO.NET?
Erkläre es mir bitte.

Danke dir.

20.01.2009 - 14:42 Uhr

@FZelle,

was wäre den das Prinzip? Denkst du da an was bestimmten?

Ich persönliche sehe an ADO.NET im Moment kaum was besseres, als beim ADODB bei VB6. Beide empfinde ich persönlich ungefähr gleich schlecht. Aber ich habe scheinbar auch nicht deine Erfahrungen!

Nichts für ungut, aber wenn deine nächste Antwort wieder so kurz und undeutlich ausfallen sollte, kannst du sie dir auch sparen. So hilft sie leider keinem weiter.

20.01.2009 - 12:38 Uhr

@FZelle

ob und was ich will, weiß ich noch nicht, ich muss es ja erst erforschen.

was wäre dein Vorschlag?

20.01.2009 - 11:50 Uhr

@Khalid,

schon gekauft! 😃
Danke dir, war ein guter Hinweis, den ich demnächst wohl etwas mehr auseinander nehmen werde.

20.01.2009 - 11:32 Uhr

Hallo Khalid,

das hört sich gut an. Kennst du vielleicht ein gutes Tutorial zu diesem Thema?

20.01.2009 - 11:06 Uhr

Hallo FZelle,

ich selbst arbeite im Moment viel mit DataTable und TableAdaptern, wenn ich Daten aus der Datenbank holen und manipulieren will.

Die Daten in der DataTable sind offline im Speichert, wenn nun mehrere User auf einer Tabelle arbeiten, müsste man ständig die Änderungen synchronisieren, was ich etwas nervig finde. Tut man das nicht, kommt es ruck zuck zu einer Parallelitätsverletzung.

Jetzt könnte man sich natürlich irgend welche klevere Logik ausdenken, wie man bestimmte Zeilen der Tabelle sperrt oder ähnliches, so dass User A auf diesen Zeilen arbeiten kann und User B einen entsprechenden hinweis erhält. aber bis man hier eine Fehlerfreie Lösung hat, kann es lange dauern.

Deshalb hatte ich dieses Thema gestartet, in der Hoffnung, dass ich einfach zu kurz denke und es vermutlich schon länger ein kleveres Pattern hierfür gibt.

20.01.2009 - 08:23 Uhr

@JAck30lena

danke für deinen Link, die Seite ist mir bereit bekannt. Ich hätte gehofft, dass jemand einen besseren Vorschlag hat, noch bevor ich anfangen würde, dort alle Beträge durchzuwühlen.

19.01.2009 - 22:02 Uhr

verwendetes Datenbanksystem: SQL Server 2005/2008

Hallo verehrte CSharp Gemeinde,

ich bin auf der Suche nach guten Tutorials (am besten Video), Multi-Client Application mit SQL Server. Vielleicht kann jemand von Euch was empfehlen?

Es sollten nach Möglichkeit Arbeiten von größeren Tieren sein (bspw. Microsoft), keine Hobby Programmierer. Evtl. gibt es sogar gewisse Technologien oder pattern, die in solchen Bereich üblich sind (wie z.B. MVP oder CAB).

Für Eure Tipps, vielen Dank im voraus!

Grüße...

04.07.2007 - 09:52 Uhr

ok.

thank u all 🙂

04.07.2007 - 09:23 Uhr

Hallo,

weiß jemand was ich bei dem folgenden Beispiel tun muss, um das Ergebnis in float (also 0,33333) zu erhalten?


int a = 1;
int b = 3;

float test = a/b;

29.06.2007 - 09:14 Uhr

Hi onlinegurke,

OK,

[TypeConverter(typeof(ExpandableObjectConverter))]

ist schon einmal ein großer Fortschritt, ich habe zur Auswahl alle Properties meines VBLock-Controls.
Brauche jedoch nur die, welche in IVBlock festgelegt sind.

Das folgende Zeug habe ich nicht ganz begriffen,


[Editor(typeof(<<EditorTyp>>),typeof(Drawing.Design.UITypeEditor))]

muss ich dazu einen eigenen Editor entwerfen? Es soll ja das Property Grid genutzt werden, das was eigentlich schon mit ersten Zeile von Dir erreicht wurde.
*hmm*

29.06.2007 - 08:42 Uhr

Guten Morgen zusammen,

ich komme gerade an einer bestimmten Stelle nicht weiter und hoffe, dass jemand von Euch vielleicht einen gut Tipp hat.

Zum Problem:
Ich entwickle gerade ein User Control in C# und möchte, dass die Properties des Controls bei Benutzung auf einer Form oder ähnlichem auch in dem Grid (Eigenschaften) angezeigt werden. Das ist auch nicht das Problem, soweit habe ich schon.

Nun habe ich aber eine Property (readonly), die mir ein Objekt vom Typ IVBlock zurück gibt und diese Property lässt sich im Property Grid natürlich nicht bearbeiten, wie den auch, den das Grid kennt doch nicht die Struktur von IVBlock.
Mir würde es allerdings schon genügen, wenn in dem entsprechendem Grid Feld des genannten Property ein weiteres 'Unter'Grid für die Properies des VBlock sich anzeigen ließe. So ähnlich wie bei Enum eine Liste mit den Auswahlmöglichkeiten des Enums angezeigt wird, oder wie bei String Properties ein erweitertes Textfeld zur Eingabe des Textes oder noch besser, wei bei Backcolor, BackgroundImage, FilePath, die entsprechenden Dialogfenster.

Nun hier etwas vom Code:


public partial class VContainer : UserControl
    {

        [Category("Blocks")]
        [DisplayName("Block properties"), Description("Global properties of all visualizer blocks."),System.ComponentModel.Editor(typeof(PropertyGrid),typeof(IVBlock))]
        public IVBlock BlockProp
        {
            get { return this.vBlock1; }
            set { }
        }

die Zeile: System.ComponentModel.Editor(typeof(PropertyGrid),typeof(IVBlock)) bringt aber leider nichts.

IVBlock ist ein Interface, VBlock1 ist ein weiteres Control, welches das genannte Interface implementiert.