Laden...

Forenbeiträge von Elric Ingesamt 124 Beiträge

02.10.2014 - 14:00 Uhr

Danke herbivore und Sorry für die späte Antwort.

Ich habe mal beobachtet, was sich eventuell an der Arbeitsweise änderen lässt und möchte hier jetzt auch nicht zu sehr ins Detail gehen, aber es ist tatsächlich so, dass (oft mehrfach täglich) jemand auf der Matte steht und irgendwelche Vorschläge hat: "Kann ich da noch die Funktion haben?", "Wie lang dauert die Abfrage, wenn ich das noch will?", "Wie siehts aus, wenn man hier Schriftart oder Farbe oder sonstwas ändert?"
Dann ist es oft einfach das beste, man probiert es sofort schnell aus, schaut es sich an und schmeißt es evtl. gleich wieder weg. Ich denke die Herangehensweise hat manchmal durchaus seine Berechtigung, aber das ist hier nicht die eigentliche Diskussion.

Vorerst als Fazit:
Wenn die Änderungen nur an sehr wenigen Dateien sind und man die Solution frisch aufgemacht hat, kommt man ganz gut mit der Undo-Funktion aus.
Addins wie AutoHistory machen in Prinzip das gleiche, nur dass ich schöner die Änderungen sehe, Snapshots machen kann etc., aber die Änderungen muss ich trotzdem Dateiweise per Hand rückgängig machen. Bessere Addins habe ich nicht gefunden.
Die Idee, gleich mit einer Kopie zu arbeiten, gefällt mir auch gut. Ein entsprechendes Progrämmchen oder Addin, das mir hier die Handgriffe abnimmt, ist sicher schnell geschrieben, das werde ich mal versuchen.

Danke nochmal an alle.
Elric

29.08.2014 - 13:29 Uhr

An sowas simples wie Undo hatte ich noch gar nicht gedacht, aber das ist gut. (Irgendwie habe ich auch dunkel in Erinnerung, dass es eine Undo-Liste für jede Datei gibt und die auch nur bis zur letzten Speicherung geht. Aber dem ist zumindest im VS2012 nicht mehr so.)

Ok, solange man also die Dateien geöffnet lässt kann man scheinbar alle Änderungen seit dem Öffnen der Solution rückgängig machen. Das würde schonmal den Großteil meiner Fälle abdecken, denn oft macht man zum Ausprobieren die Solution neu auf (wir haben viele, aber kleine Solutions). Für die anderen Fälle werde ich dann eine der hier genannten Alternativen nehmen.

Die Diskussion hier hat mir aber auch gezeigt, dass ich zuerst mal unsere Arbeitsweise überdenken muss, denn scheinbar bin ich der einzige, den das neue Verhalten stört.

Vielen Dank an alle Antworter.

Elric

PS: @Abt: Dass Einchecken was mit lokalem Speichern zu tun hat, hat auch niemand behauptet. Aber Du hast recht damit, dass vielleicht das ganze Vorgehen nicht ideal ist und man eher an der Arbeitsweise was ändern muss.

28.08.2014 - 14:58 Uhr

Hallo Abt

Ich bin jetzt nicht sicher auf welche Antwort sich dein Beitrag jetzt bezieht.

Was hat das Speichern mit dem Einchecken zutun?

Einchecken ist quasi Speichern im Repository.

Is doch wurst, wie oft lokal etwas gespeichert wird. Es wird ja erst eingecheckt, wenn man das will.

Ja, genau. Deshalb ja der Vorschlag mit dem Repository. Da man es mit der automatischen Speicherung lokal nicht mehr komplett im Griff hat, wann gespeichert wird, nutzt man das Einchecken im Repository.
Für mich klingt das schlüssig.

28.08.2014 - 13:14 Uhr

Danke Euch.
An einen Branch hatte ich noch nicht gedacht, ja das ginge.
Auch das AutoHistory gefällt mir gut.

Ich hatte halt gehofft, anstatt die Wirkung zu bekämpfen, könnte man die Ursache beseitigen, also dass beim Build überhaupt gespeichert wird.

Eine Idee wäre gewesen die Code-Dateien mit Schreibschutz zu belegen. Dann bräuchte man nur ein Makro, das zum (gewollten) Speichern den Schreibschutz kurzfristig entfernt.
Leider musste ich dann feststellen, dass mit VS2012 scheinbar auch das komplette Makro-Feature weggefallen ist. 😦

28.08.2014 - 11:42 Uhr

Danke. Die Antwort hab ich erwartet 😉
Ich hab halt nie selbst eins aufgesetzt, d.h. mit Einlesen und Erstellen sind dann gleich mal ein paar Stunden weg, also mehr als einfach nur eine Option zu setzen. Aber klar, das wäre eine Lösung und die werde ich machen, wenn ich nichts einfacheres finde.

Was die großen Solutions betrifft, die bereits im Repository sind, müsste man dann die Arbeitsweise ändern und auch jeden kleinen Zwischenstand einchecken, denn ich glaub man kann eine Solution nicht in 2 Repositories haben? (bei uns wird SVN eingesetzt und Ankh kommt damit sicher nicht zurecht)

28.08.2014 - 11:23 Uhr

Danke Dir. Ja, machen wir zum Teil. Bei uns landen aber nur die "richtigen" Team-Projekte in der Sourcecodeverwaltung. Alle anderen kleinen Helfer- und Ausprobier-Solutions, die man so ansammelt, aber nicht.

Und sogar bei den Projekten in der Sourcecodeverwaltung checke ich normal eine Klasse oder Form erst ein, wenn sie einigermassen fertig ist und nicht die ganzen Mini-Zwischenstände, die ich lokal speichere. Natürlich konnte man seine Arbeitsweise dahingehend ändern, aber eine kleine lokale Maßnahme, wie es diese Option war, wäre mir halt lieber.

(wenn es sowas nicht gibt ist es auch nicht schlimm, es ist kein schwerwiegendes Problem, dann muss man sich halt umstellen, aber zumindest kurz nachfragen wollte ich)

28.08.2014 - 10:43 Uhr

Hallo Forum

Früher konnte man im Visual Studio unter Tools->Options->Projects and Solutions->Build And Run->Before Building einstellen, ob die Dateien beim Builden gespeichert werden oder nicht. Diese Option ist mit VS2012 weggefallen und es wird nun immer beim Buildversuch gespeichert.
Ich finde das ziemlich störend, weil ich doch öfter mal schnell was ausprobieren und wieder verwerfen will. Gibt es vielleicht irgendeinen Workaround, der das Speichern beim Build verhindert?

Danke
Elric

20.11.2013 - 10:46 Uhr

Hallo myCSharp-Team

Erstmal herzlichen Dank! Ich war dieses Jahr auf der BASTA!Spring und konnte als mycsharp.de Benutzer den Rabatt nutzen. Danke!

Voraussichtlich werde ich nächstes Jahr im Februar wieder zur BASTA fahren können. Wird denn von eurer Seite wieder ein Rabatt ausgehandelt werden?

Danke und Grüße
Elric

04.07.2013 - 12:58 Uhr

ein Dienst kann meines Wissen auch nicht auf Programme zugreifen, die eine GUI haben.

Scheint so, als wäre es genauso wie sagst (hätte ich mir auch denken können, denn nach 7 Jahren hier im Forum habe ich noch nicht erlebt, dass Du Dich irrst^^).
Eine definitive Aussage habe ich zwar nirgends gefunden, es deutet aber alles daraufhin. Klingt im Nachhinein jetzt auch logisch für mich, denn wenn ein Service keine GUI haben darf, sollte es ihm auch nicht über Hintertürchen wie COM möglich sein, eine GUI zu steuern.

Dann wirds halt eine unsichtbare Konsolen oder WindowsForms-Anwendung. Und sollte es doch unbedingt ein Windows-Service sein sollen, baue ich halt einen Dummy-Service, der diese Anwendung startet bzw. abschießt.

Danke jedenfalls,
Grüße
Elric

27.06.2013 - 12:17 Uhr

Hallo herbivore

Du spielst auf die Möglichkeit an, dem Problem auszuweichen, in dem man erst gar keinen Windows-Dienst benutzt. Daran hab ich auch schon gedacht, gefällt mir aber wegen bestimmter Voraussetzungen auf dem Zielsystem nicht so, ich behalts aber als Notlösung in der Hinterhand.

Zu Deiner Frage: Ja, die Applikation selbst ist riesig, hat unter anderem eine GUI und eben auch COM-Interop-Schnittstelle. Der Dienst selbst hat keine GUI und auch nichts mit der GUI dieser Appliaktion zu tun, sondern möchte nur Daten abgreifen.
Man könnte es vielleicht mit einem laufenden Excel vergleichen. Dann möchte der Dienst nur über COM Zellenwerte auslesen, sonst nichts.

Grüße
Elric

26.06.2013 - 10:54 Uhr

Hallo Forum

Ich möchte aus einem Windows Service auf eine laufende COM-Applikation zugreifen und bekomme in der Zeile

System.Runtime.InteropServices.Marshal.GetActiveObject("EineCOM.Application");

immer diesen Fehler:

Fehlermeldung:
"Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))"

Betriebssystem ist WindowsXP.

Die COM-Applikation ist auch in der ROT registriert und derselbe COM-Zugriff in einer Konsolen oder Windowsforms-Anwendung läuft einwandfrei.

Ich vermute irgendein Rechte-Problem, aber der Service läuft unter demselben User-Account wie die COM-Applikation, auch UserID und SessionID ist diesselbe.

Auch der Test mit einer anderen COM-Applikation liefert denselben Fehler.

Ich habe auch zum Testen ein Minimalprojekt erstellt, das nur aus der "GetActiveObject"-Zeile besteht ... mit demselben Ergebnis.

Hat jemand vielleicht eine Idee dazu, bin für jede Hilfe dankbar?

Grüße
Elric

23.10.2012 - 07:28 Uhr

Hallo Chriz

Erstmal vielen Dank für deine sehr schnelle Antwort und sorry für meine langsame (war krank).

So wie ich deine Erklärung verstehe, müsste das aber heißen: wenn ich nun EmitDefaultValue = true setze und vorher den DefaultValue umbiege, müsste er nun den neuen Wert reinschreiben. (?)
Macht er aber nicht, in meinem Bsp mit dem int nimmt er weiterhin die 0 statt der 5. (scheinbar hab ichs noch nicht ganz verstanden)

Für deinen Workaround, fürchte ich, reicht mein Vorwissen nicht (ist mein erster Web-Service), da muss ich mich erst noch einlesen. Ich hätte zwar noch andere Stellen gefunden, wo ich den Wert noch abfangen/entfernen könnte, aber schön ist das nicht.

Grüße
Elric

18.10.2012 - 10:15 Uhr

Hallo Forum

Ich habe folgendes kleines Problemchen bei meinem WCF-Service: Ich hätte gern, dass bestimmte Eigenschaften bei bestimmten Werten nicht übertragen werden. Das klappt auch für die Standard-Defaultwerte mit dem Attribute "EmitDefaultValue = false" ganz gut, leider aber nicht für selbst definierte Werte (ich dachte, ich könnte den Default-Wert einfach über das DefaultValue-Attribut ändern).
Bsp.:

	[DataContract]
	public class MyClass
	{
		[DefaultValue(5)]
		[DataMember(EmitDefaultValue = false)]
		public int TestProperty { get; set; }
	}

Die TestProperty wird weiterhin bei "0" nicht übertragen, sollte aber bei "5" nicht übertragen werden.
Was mach ich falsch?

Danke und Grüße
Elric

27.06.2012 - 11:20 Uhr

Hallo

Ich habe mich an einer programmiertechnischen Lösung versucht und obwohl das Problem jetzt schon gelöst ist, würde ich sie gern noch hier dranhängen (vor allem das sie überaschend kurz geworden ist). Das Prinzip ist zum Teil ähnlich wie in zommis mathematischen Ansatz, nur dass ich bei der Berechnung dann beim diskreten Fall bleibe und mir somit das Integral spare. Das Ergebnis (die 94,..%) ist übrigens das gleiche, das zommi errechnet, somit denke ich, dass der Code auch stimmt:

		static void Main()
		{
			const int gesamt = 62000000;   
			double[] wahrscheinlichkeiten = new double[gesamt];

			for (int i = 0; i < gesamt; i++)
			{
				wahrscheinlichkeiten[i] = BerechneWahrscheinlickeit(i, gesamt, 10, 14);
			}

			Console.WriteLine(wahrscheinlichkeiten.Skip(gesamt/2).Sum() / wahrscheinlichkeiten.Sum());
		}

		static double BerechneWahrscheinlickeit(int gesamtPro, int gesamtAlle,  int stichprobePro, int stichprobeAlle  )
		{
			double wahrscheinlichkeitGesamtmenge = (double) gesamtPro / (double) gesamtAlle;
			int permutationen = Faculty(stichprobeAlle)/Faculty(stichprobePro)/Faculty(stichprobeAlle - stichprobePro);

			return Math.Pow(wahrscheinlichkeitGesamtmenge, stichprobePro)*Math.Pow(1.0 - wahrscheinlichkeitGesamtmenge, stichprobeAlle - stichprobePro) * permutationen ;
		}

		static int Faculty(int n)
		{
			return n == 0 ? 1 : n * Faculty(n - 1);
		}

Der Vorteil ist, dass sie bei kleineren N auch exakt rechnet (abgesehen vom "Zurücklegen"), der Nachteil ist natürlich, dass das N nach oben hin durch die Rechenpower begrenzt ist.

Grüße
Elric

25.11.2011 - 14:13 Uhr

Ja, sieht wirklich gut aus und scheint auch für mein Problem zu passen. Ich werd mich mal genauer da durcharbeiten. Danke für die Links. 👍

24.11.2011 - 09:41 Uhr

Nein, mit "Auswertung" meinte ich tatsächlich nur die Verarbeitung der Werte, die ich durch das Event von der anderen Applikation zurückbekomme.
Welche IAsyncResult-Eigenschaften muss ich denn noch zusätzlich setzen? Es funktioniert ja so wie es dasteht.
(AsyncState wird gesetzt, IsCompleted hab ich auf true probiert, merke aber keinen Unterschied.)
Und nachdem in der End-Methode die data-Eigenschaft gelesen wurde, wird das Objekt eh weggeschmissen.

Das mit den Task hatte ich, wegen des asynchronen Aufrufs der Fremdapplikation nicht hinbekommen, aber ich hab gesehen dass die Task bzw. TaskFactory-Klasse umfangreiche Möglichkeiten bietet. Ich werde mich da mal einlesen.

Grüße
Elric

23.11.2011 - 10:25 Uhr

Nochmals Danke für die schnelle Antwort (hast Du keinen Feierabend?^^).

Ich denke, ich hab das soweit verstanden. Mein Problem war jetzt, dass ich nicht die Task-, Func-, Action-, etc. Klasse benutzen kann, weil ich noch eine andere Applikation asynchron aufrufen muss. Letztendlich hab ichs aber irgendwie mit meiner Klasse hinbekommen, dass die Callback aufgerufen wird (und irgendwie siehts jetzt ganz einfach aus), auch wenns mir so noch nicht schön vorkommt:


	public class Service1: IService1	{
		public IAsyncResult BeginSampleMethod(string msg, AsyncCallback callback, object asyncState)
		{
			IAsyncResult result = new myAsyncResult<string>(msg, callback,asyncState);

			return result;
		}
		//...
	}
	
	class myAsyncResult<T>: IAsyncResult
	{
		T data;
		Action<IAsyncResult> callBack;

		public myAsyncResult(T data, AsyncCallback cb, object state)
		{ 
			this.data = data;
			callBack = new Action<IAsyncResult>(cb);
			AsyncState = state;

			// Hier ruf ich die fremde App auf und warte auf deren Event, hab das mal durch einen TimerCallback simuliert. 
			Timer timer = new Timer(new TimerCallback(ForeignApplicationEvent), null, 2000, Timeout.Infinite);
				
		}

		public void ForeignApplicationEvent(object state)
		{
			//TODO Auswertung der Rückgabedaten
			callBack(this);
		}

		public T Data	{ get { return data; } }

		public object AsyncState { get; set; }

		public WaitHandle AsyncWaitHandle { get { throw new Exception("The method or operation is not implemented."); } }

		public bool CompletedSynchronously{ get; set; }

		public bool IsCompleted { get; set; }
	}
	
	

Weitere Anmerkungen sind noch willkommen.

Vielen Dank nochmal, ich war schon am Verzweifeln.

Grüße
Elric

22.11.2011 - 20:32 Uhr

Hallo gfoidl

Vielen Dank für schnelle und ausführliche Antwort. Aus Deinem Beispiel hab ich einiges gelernt, aber mein Problem konnte ich dadurch noch nicht lösen, deshalb möchte ich nochmal nachhaken.

  1. Unabhängig von meiner Anforderung würde ich gern erstmal noch verstehen, warum das gepostete Beispiel aus der MSDN nicht funktioniert. Ich war der Ansicht, dass die WCF das "IAsyncResult-Object", das von der Begin-Methode zurückgegeben wird auf "IsCompleted" überprüft. Sobald dies true ist, wird die End-Methode aufgerufen werden. Da in der obigen Klasse das "IsCompleted" immer true ist, sollte er doch sofort die Endmethode aufrufen, oder?

Oder muss ich den Callback nochmal explizit setzen, wie Du es mit "task.ContinueWith(t => callback(t))" gemacht hast? Wenn ja, wo beim Beispiel mit der CompletedAsyncResult-Klasse mach ich das? (Sorry, irgendwie ist der Groschen noch nicht gefallen)

  1. So ähnlich wie in Deinem Beispiel mit Task, hatte ich es zum Testen auch schon hinbekommen, nur hatte ich in der Begin-Methode mit "Func" eine Funktion definiert und dann BeginInvoke aufgerufen.

Mein Problem ist aber, dass mein Service die eigentliche "Arbeit" nicht selbst implementiert hat, sondern seinerseits eine fremde Applikation asynchron aufrufen muss.
Ich muss also in der Begin-Methode die fremde Applikation anstossen und diese schickt mir dann ein Event mit den Rückgabedaten. Dies würde sich halt mit einer eigenen IAsyncResult-Klasse (wie in dem MSDN-Beispiel) schön abhandeln lassen, da ich dort nach Eintreffen des Events die Daten speichern und IsCompleted auf true setzen könnte.
Deshalb möchte ich unbedingt das Beispiel aus der MSDN verstehen.
(ich hoffe, ich habs verständlich beschrieben)

Oder gibts noch einen ganz anderen Weg?

Grüße
Elric

22.11.2011 - 11:33 Uhr

Hallo Forum

Ich habe versucht eine asynchrone WCF-Webservice-Methode zu machen und bekomme es einfach nicht hin. Letztendlich habe ich dann nur das Beispiel aus der MSDN kopiert, aber nicht einmal das läuft (How to: Implement an Asynchronous Service Operation):


  public class SampleService : ISampleService
  {
    public IAsyncResult BeginSampleMethod(string msg, AsyncCallback callback, object asyncState)
    {
      Console.WriteLine("BeginSampleMethod called with: " + msg);
      return new CompletedAsyncResult<string>(msg);
    }

    public string EndSampleMethod(IAsyncResult r)
    {
      CompletedAsyncResult<string> result = r as CompletedAsyncResult<string>;
      Console.WriteLine("EndSampleMethod called with: " + result.Data);
      return result.Data;
    }
  }

  // Simple async result implementation.
  class CompletedAsyncResult<T> : IAsyncResult
  {
    T data;

    public CompletedAsyncResult(T data)
    { this.data = data; }

    public T Data
    { get { return data; } }

    public object AsyncState
    { get { return (object)data; } }

    public WaitHandle AsyncWaitHandle
    { get { throw new Exception("The method or operation is not implemented."); } }

    public bool CompletedSynchronously
    { get { return true; } }

    public bool IsCompleted
    { get { return true; } }
  }


Wenn man am Webservice nun "SampleMethod" aufruft, wird korrekterweise "BeginSampleMethod" aufgerufen, danach bleibt der Service aber stehen. Nach meinem Verständnis sollte er sofort in die "EndSampleMethod" gehen, da "IsCompleted" ja immer true liefert.
Ich habe auch schon die CompletedAsyncResult-Klasse mit Loggings ausgestattet und es wird (außer dem Constructor) keine Methode bzw. Property aufgerufen.
Was mache ich falsch?

Danke im Voraus
Elric

11.11.2010 - 08:48 Uhr

Danke Dir, gfoidl. Ja, ich denke Du hast es richtig getroffen. An der Stelle hats gefehlt und jetzt dämmerts langsam. 😉

Und nun ist auch klar, dass das nicht gehen kann, was ich meinte. Das gewünschte Ergebnis bekomme ich trotzdem relativ einfach wie Du schreibst (bzw. hat es 'serial' weiter oben schon genauso geschrieben, nur hab ichs da noch nicht kapiert)

Ich hab jetzt der Comments-Klasse einen weiteren Konstruktor gegeben:

public Comments(Dictionary<string, string> dic): base(dic) {}

Zusammen mit der ToDictionary-Methode an der Query bin ich dann auch schon fertig.

Ja, wieder was gelernt. Nochmal Danke an alle.

10.11.2010 - 13:50 Uhr

Erstmal danke für die Antworten.

was genau möchtest du denn erreichen, ist mir nicht ganz klar.
Du hast eine Menge (IEnumerable<T>), in deinem Fall IEnumerable<KeyValuePair<TKey,TValue>>.
Wenn du darauf eine Abfrage loslässt, erhälst du natürlich die Elemente aus der Menge,
also wieder eine Untermenge vom Typ IEnumerable<KeyValuePair<TKey,TValue>>.
Wieso willst du das Ergebnis wieder zu deiner Comments Klasse casten?
Das versteh ich nicht so ganz.

Meine Ausgangsmenge ist vom Typ Comments, also ein Dictionary mit Zusatzmethoden, vorstellbar wäre ein "SpeichereDich()", nur um ein Beispiel zu machen. Jetzt will ich die Menge (mit Linq) einschränken und diese Teilmenge "abspeichern". Dazu muss der Rückgabewert natürlich wieder vom Typ Comments sein.

dann benutze doch einen Konstruktur, dem du die Elemente übergibst, und er daraus deine Klasse erstellt.

Hab ich auch schon gemacht, aber dann muss ich, wie gesagt, elementeweise umkopieren. Mach ich dann auch, aber ich hätte eben erwartet, dass es einfacher geht.

@zero_x
Ich hätte jetzt nicht gesagt, dass es da an Grundlagen fehlt. Ich hab meine Collections richtig erstellt und auch mit Linq/Lambda-Ausdrücken das Ergebnis richtig rausbekommen. Nur mit dem Typ der Rückgabe bin ich nicht zufrieden. Oder anders gesagt, ich kann irgendwie kann nicht glauben, dass mein Anliegen, den gleichen Typ wieder rauszubekommen so, ungewöhnlich ist.

Ist doch nichts anderes wie ein "Select * .. where" auf eine Datenbanktabelle. Da erwarte ich auch die gleichen Spalten wie in der Tabelle, damit ich gut weiterarbeiten kann.

10.11.2010 - 13:01 Uhr

Zeig doch mal die Comments-Klasse.
Isses gewollt dass die Klasse von Dictionary<string, string> ableitet und nicht einfach das IDictionary Interface implementiert?

Ja, dass sie von Dictionary ableitet ist so gewollt, denn sie "ist ein" Dictionary mit ein paar Zusatzmethoden. Ich hab sie allerdings noch nicht implementiert, d.h. momentan sieht sie so aus:

	public class Comments:Dictionary<string,string>
	{
		public Comments()
		{	}
	}

Daran kanns also nicht liegen.

@serial: ToDictionary hab ich schon probiert, dann brauch ich aber einen Cast von Dictionary auf Comments, der auch nicht klappt.

10.11.2010 - 11:09 Uhr

also bei mir klappt das nicht. Da meckert der Compiler mit

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,string>>' to 'System.Collections.Generic.Dictionary<string,string>'.

(bzw. ".. to 'Comments'")

Und wenn ich noch vorher caste, dann kommt eben zur Laufzeit ein "unable to cast"-Fehler.

10.11.2010 - 10:52 Uhr

Hallo Forum

Ich habe eine Frage zum Rückgabewert einer Linq-Abfrage (vlt. ist es auch ein Verständnisproblem, da ich mit Linq grad meine ersten Versuche mache):

Wenn man LINQ auf eine Menge (Collection) losläßt, ist der der Rückgabewert doch IEnumerable<T> bzw. IEnumerable<KeyValuePair<Tkey,Tvalue>>, wenn ich ein Dictionary habe.

LINQ ergibt ja eine Teilmenge der Ausgangsmenge, mit der man weiterarbeiten möchte und dazu wäre es natürlich super, wenn sie wieder vom gleichen Typ wäre (oder ist das so außergewöhnlich?). Also mein Problem:

Meine Menge ist vom Typ

Class Comments: Dictionary<String,String>

Nach der Linq-Abfrage ist die Menge aber vom Typ IEnumerable<KeyValuePair<String,String>>. Und ich sehe keine Möglichkeit (außer mit For elementeweise kopieren), wie ich wieder auf meine Comments-Klasse komme.

Danke im Voraus
elric

03.11.2010 - 09:33 Uhr

Erstmal noch danke an alle, die geantwortet haben.

Ich wollte noch eine kurze Rückmeldung zu dem Problem geben: Ich hab mich mit unseren Netzwerkspezialisten zusammengesetzt und es ist ein bekanntes WindowsXP-Problem mit einer bestimmten Art von Netzlaufwerken, von denen eines bei uns verwendet wird. Wenn man also dieses eine Mapping trennt, bleibt nichts mehr hängen. Alle anderen Mappings melden nach 2-3 Sekunden brav, dass sie nicht verbunden sind. Da das "böse" Mapping zufällig das erste war, ist er immer sofort hängen geblieben.

Das erklärt auch, warum der OpenFileDialog funktioniert hat. Wenn man nicht zufällig das eine Mapping anklickt, klappt ja alles.

Grüße
Robert

29.10.2010 - 12:30 Uhr

Ja klar, es ist sicher kein .NET-Problem, da eben Explorer (und damit auch der Arbeitsplatz) dasselbe Verhalten zeigen. Trotzdem rufen die User erstmal bei mir an und meine Erklärung, dass es ein "Windowsproblem" ist dem User meist egal.

Das Problem lässt sich mit mehreren Rechnern in der gleichen Domain reproduzieren?

Ja, ich kann es reproduzieren. Ist bei jedem Rechner, wo ich es probiert habe, so.

Bleibt ein OpenFileDialog auch hängen?

Beim OpenFileDialog ist es so, dass er erstmal funktioniert, wenn er mit einem lokalen Laufwerk startet. Wenn ich in der Linkleiste dann z.B. den Arbeitsplatz anklicke, bleibt er auch hängen.
Witzigerweise gibt es hier eine Ausnahme: Wenn ich oben im Dialog die Laufwerkcombobox aufmache, sehe ich alle Netzlaufwerke und wenn ich dort eins anklicke, bekomme ich nach einigen Sekunden die Fehlermeldung, dass das Laufwerk nicht verbunden ist.

29.10.2010 - 11:25 Uhr

tritt diese Verhalten nur in einer/einem bestimmten Domäne/Netzwerk auf?

Das weiß ich nicht, da wir hier in der Firma nur eine Domäne (ein Netzwerk) haben, an der sich alle anmelden. Da mein Programm nur intern benutzt wird, ist diese Domäne auch die einzige, die für mich zählt.

Wäre interessant, was an Deiner Domäne anders ist, wenn es da funktioniert, aber das Domänenzeug ist ein Thema, wo ich mich überhaupt nicht auskenne.

29.10.2010 - 10:06 Uhr

Ich hab mich ein bisschen mit dem "RootFolder" gespielt: Das Problem ist, dass ich ein Mapping auf die Netzlaufwerke habe, diese also Laufwerksbuchstaben besitzen. Somit tauchen sie unter "SpecialFolder.MyComputer" auf und der Dialog hängt wieder.
Grundsätzlich hätte es geklappt, denn wenn ich ProgramFiles o.ä. als RootFolder wähle stürzt er nicht ab, aber ich komme auch nicht mehr dahin, wo ich hin will (C:, D:, USB-Sticks, etc.).
Und es gibt leider keinen SpecialFolder, der mir nur die lokalen Laufwerke anzeigt.

Dann werd ich den Dialog wirklich selbst implementieren müssen (seufz). Zumindest hab ich mit wenig Aufwand den FileTreeView (danke, Programmierhans) dazu bekommen nur Nicht-Netzlaufwerke und nur Ordner anzuzeigen. Man muss halt trotzdem noch nacharbeiten (NewFolder-Button, Icons, Form basteln, ...), aber es ist wenigstens eine Lösung. =)

Danke für Antworten bisher. Wenn noch jemand eine Idee hat, bitte posten.

28.10.2010 - 11:37 Uhr

Danke Dir, ist aber leider auch keine Option. Dann bleibt zwar kein Dialog hängen, aber ohne die Ordnerauswahl kann er die Funktionen des Programms nicht nutzen. Was aber gehen sollte, denn der Ordner, den er braucht, ist normalerweise lokal vorhanden.

Im Idealfall müsste ich den Dialog dazu kriegen, dass er nur die lokalen Laufwerke anzeigt, ohne dass er versucht die Netzlaufwerke darzustellen.

28.10.2010 - 10:37 Uhr

Ja, da hast Du recht, die Verbindung sollte man haben, aber ich programmier das Tool halt für andere (und da fängt der Ärger meistens an^^) und die laufen mit ihren Laptops dann zu allen möglichen Orten rum, wo sie keine Verbindung haben. Und egal, was die fehlende Verbindung sonst noch für Ärger macht, wenn mein Programm nicht geht, rufen sie bei mir an. 😦

Gibts denn noch irgendwas, was ich machen kann oder ist nun das Fazit, dass ich diesen Dialog bei fehlender Verbindung einfach nicht benutzen darf?

27.10.2010 - 08:47 Uhr

Ich bin als Domänenbenutzer angemeldet (und jeder andere auch, der mein Programm benutzt).

26.10.2010 - 12:18 Uhr

Probiere mal im Explorer die Ordneroption "Automatisch nach Netzwerkordnern und Drucker suchen" zu deaktivieren.

Die Option war gar nicht aktiviert.

Im Übrigen zeigt der Windows Explorer dasselbe Verhalten und geht auf "not responding" . Nur hilft mir leider diese Erkenntnis nichts, da ich mein Programm trotzdem so hinkriegen muss, dass es nicht hängen bleibt.

26.10.2010 - 10:31 Uhr

Hallo Forum

Ich habe ein Problem mit dem FolderBrowserDialog: Wenn an einem Rechner Netzlaufwerke verbunden sind, der Rechner aber nicht am Netz hängt (z.b. einfach indem man vorher den Stecker zieht), dann bleibt der FolderBrowserDialog gleich nach dem Aufschalten komplett hängen (sogar, wenn man einen lokalen Pfad als "Selected" gesetzt hat).

Es kommt die Sanduhr und wenn man dann trotzdem versucht zu klicken, dann erscheint ein "not responding" in der Titelleiste. Der Zustand ändert sich auch nicht mehr (außer man steckt das Kabel wieder ein).

Kann ich das abfangen oder mach ich was falsch?

Danke und Grüße
Robert

14.03.2008 - 10:11 Uhr

Beweis über Quersumme 👍. Der Mann ist gut, der kommt in die Suppe. 😉

14.03.2008 - 08:59 Uhr

Hallo alpi, Hallo dN!3L

Ich mag so Rätsel wahnsinnig gern. Ich finde es auch interessant zu sehen, wie verschieden die Leute so ein Problem angehen und dN!3L hat als Informatiker gleich eine sehr ansprechende Lösung präsentiert. Als Mathematiker hätte ich auch erstmal versucht, es zu beweisen und wäre auch überzeugt, dass es geht, aber wenn man schnell eine Lösung will, wäre eine Mischung das beste. Nach ersten Überlegungen sieht man gleich, dass

  • es keine 3-stelligen Zahlen geben kann (is klar)
  • es mindestens 1 2-stellige geben muss
  • es nicht mehr als 3 2-stellige geben kann (die 4 kleinsten 2-stelligen 1x+2x+3x+4x wäre schon größer als 100)
  • die Reihenfolge der 6 bis 8 Summanden auch egal ist.

Mit diesen Einschränkungen bleiben so wenig Möglichkeiten übrig, dass man ruhig ein primitives BruteForce-Programm machen kann, das alle Möglichkeiten durchprobiert.

Dennoch wäre er rein mathematische Beweis interessant 😉

Grüße
Elric

06.11.2007 - 08:34 Uhr

Hallo

Also der Test mit der MessageBox beweist doch, dass der Fehler dort auftritt.

Es gibt eine Möglichkeit, die genau das Verhalten erklären würde, und zwar wenn du beim Aufrufen der Form eine Fehlerbehandlung gemacht hast, z.B.

try
{
	Application.Run(new Form1());
}
catch
{ }		

Dann würden die Fehler beim Öffnen und Schließen davon abgefangen, die Button-Fehler aber "auf der Form" bleiben.

Grüße
Elric

16.10.2007 - 10:23 Uhr

Nein, das passt schon, es nur etwas verwirrend, dass Du beim ersten Feld "D." davor schreibst. Er müsste aber eigentlich trotzdem das richtige nehmen.

Was ist mit den anderen Fragen:
Hast Du überprüft, ob wirklich solche Daten in der Tabelle sind?
Wo sind die JOIN-Bedingungen in Deinem Select?

16.10.2007 - 10:14 Uhr

Hallo tommy

Mit "Häufigkeit des Datums" meinst Du die wahrscheinlich die Häufigkeit des Datum pro Kunde? Sonst wäre die Abfrage nicht möglich.

Schreib uns doch bitte nicht einfach nur die Aufgabenstellung, sondern auch, was Du schon alles ausprobiert hast. Dann braucht man nur noch Probleme oder Fehler ausmerzen.

Grüße
Elric

15.10.2007 - 17:32 Uhr

Naja, wenn man Dein SQL-Statement ansieht, läßt es eigentlich nur einen Schluß zu: Du hast einfach keine anderen Daten in der Tabelle als die mit 10230755.

15.10.2007 - 14:51 Uhr

die erste Tabelle ist so sortiert, dass IMMER 2 Datensätze mit dem gleichen Namen untereinander liegen! IMMER!!!

Nein, sry, das ist falsch. Die ++Ansicht ++der Tabelle, die Du durch Dein SQL-Kommando angefordert hast, hat eine Sortierung. Die Datensätze, wie sie in der Tabelle sind, haben keine Reihenfolge. Jedes DB-System kann sie speichern, wie sie will, Hauptsache, sie genügt den Anforderung, die ein SQL-Befehl an sie hat.

Mach es so wie Jürgen gesagt hat, einen anderen Weg, fürchte ich, gibts nicht.

Grüße
Elric

15.10.2007 - 08:41 Uhr

Naja, im SQL Server würde (aber nur, wenn ich gar nichts anderes finde und es schnell gehen soll) mit REPLACE arbeiten. Allerdings musst für jedes Zeichen ein Replace drumrumlegen:

Select REPLACE(REPLACE(MeinFeld,'+',''),'-','') ...

Blöd, aber besser als nichts.

12.10.2007 - 07:51 Uhr

Hallo Daiver

In einer Tabelle gibt es keinen 1. oder 2. oder ... Datensatz. Es gibt keine Reihenfolge. Nur in der Anzeige sind sie dann nach einem bestimmten Schema aufgelistet (je nach Sortierungskriterium in der Abfrage). Wenn Du das Kriterium ganz wegläßt kriegst Du sie wahrscheinlich in der Reihenfolge des Eintragens, aber gesichert ist nicht, da es Anforderung an das DB-System ist. Deshalb kann es keine Abfragemöglichkeit geben, die das macht, was Du willst.

Du wirst also wohl oder übel ein logisches Kriterium finden müssen, das die beiden unterscheidet und dann mit einer WHERE-Klausel, wie Jürgen schon sagte, abfragen.

Grüße
Robert

11.10.2007 - 13:51 Uhr

Ja, ich hätte am ConnectionString sehen können, dass Dein Rechner und der DB-Server derselbe ist.

Aber du kannst vielleicht mal auf der Seite stöbern:
http://www.connectionstrings.com

Da steht z.B. auch, dass bei .NET-SqlConnections =true und nicht =yes verwendet wird.

11.10.2007 - 13:31 Uhr

Hallo

Ich hab meine Remoteeinstellungen mal angeschaut.

Wieso Deine? Die vom Server musst Du anschauen.

error: 25 - Verbindungszeichenfolge ungültig

Poste doch nochmal Deinen Connectionstring, so wie er jetzt nach den beiden Änderungen aussieht.

Grüße
Elric

11.10.2007 - 08:50 Uhr

Entweder Du rundest die Zeit, dass der == Vergleich funktioniert. (schlecht)

Oder Du setzt "bald" nach DoIt auf den nächsten Wert (also z.b. auf 18:00 des nächsten Tages).

Überprüf das Setzen von "bald" nochmal, da ich Moment nicht sehe, woher die Datumskomponente von "bald" kommt. Du setzt scheinbar nur eine Uhrzeit.

11.10.2007 - 08:40 Uhr

Wenn Du an den Verbindungseigenschaften (Benutzer, Conn-String,..) nichts zwischendrin verändert hast, könnte es einfach am Netzwerk liegen. Versuch zu ermitteln, ob zu der Zeit der DBServer-Rechner grundsätzlich erreichbar war.

Das mit der Teilnehmerzahl kannst du leicht googeln. Ich glaube, dass es eine maximale gibt, aber dann wäre die Fehlermeldung anders.

11.10.2007 - 08:33 Uhr

Hallo

Und was genau möchtest Du haben oder wie ist Deine Frage?

Dass er es bei (now == bald) gar nicht ausführt, finde ich klar. Nämlich, dass die beiden Zeiten genau auf den Tick (also im Nanosekundenbereich) übereinstimmen ist ja sehr unwahrscheinlich.

Grüße
Elric

11.10.2007 - 08:23 Uhr

Hallo

Das Forms-Steuerelement ist nicht der einzige Timer. Es gibt auch eine "normale" Klasse dafür:

System.Threading.Timer

Schau dazu in die Doku, da ist ein recht gutes Bespiel.

Grüße
Elric

10.10.2007 - 16:40 Uhr

Hallo PatrixJ

Nein, es liegt sicher nicht an einem bestimmten Datensatz.

Eigentlich steht alles in der Fehlerbeschreibung. Der Fehler tritt beim Öffnen der Connection auf
"SQL Server ist nicht vorhanden, oder der Zugriff wurde verweigert."

Hierfür gibt es viele Gründe, die Du selbst überprüfen musst:
Der Benutzer darf nicht, der Connectionstring stimmt nicht, kein Netzwerk,...

Grüße
Elric

10.10.2007 - 11:45 Uhr

Hallo FZelle

Du hast natürlich recht, aber eigentlich verlagerst Du die Diskussion nur. Nach Deiner Aussage muss man nämlich erst überlegen, was ist eine "zusammengehörige Aktion"?

In dem Fall der For-Schleife wären also die 10 Durchgänge eine zusammengehörige Aktion. Was aber (und das konstruiere ich jetzt nicht, sondern genau den Fall habe ich), wenn eventuell Pausen dazwischen sind. Bsp:Ich möchte eineTabelle pollen:

while (Bedingung)
{
     //Hier ist die Abfrage

    Sleep(WarteZeit);
}

Würdest Du in diesem Fall auch das open/close innnerhalb der Schleife machen?
Oder ist es nicht abhängig davon welchen Wert die Wartezeit annehmen kann?
Sollte WarteZeit gegen 0 gehen, hat man eine zusammenhängende Aktion, ab welchem Wert hat man diese nicht mehr?

Grüße
Elric