Moin!
Welche Adresse hat denn Dein Netz? Wenn Deine Rechner z.B. im Netz 192.168.0.x / 255.255.255.0 laufen, dann kannst Du unter der Adresse 192.168.0.255 alle Rechner in diesem Netz erreichen.
Adressen von privaten Netzen, werden übrigens gem. irgendeinem RFC nicht ins Internet "gespammt". 😉
Denn caste doch auf IDataReader, wenn das die gemeinsame Schnittstelle ist.
-Jürgen
Okay...okay...
Hab nicht daran gedacht, dass Color ein struct ist. Ich muss also auch jedesmal die Eigenschaft IsEmpty abfragen, um alle relevanten Informationen zu haben.
-Jürgen
Ja!
Schau Dir mal die Eigenschaft FormBorderStyle und den Wert None an.
-Jürgen
Moin!
Ich reg mich gerade auf über Form.TransparencyKey...
Diese Eigenschaft einer Form hat nach Erzeugen defaultmässig den Wert Color.Empty. Dieses ist gleichbedeutend mit dem ARGB-Wert 0,0,0,0. Ich erhalte auch den int-Wert 0 durch die Methode TransparencyKey.ToArgb().
Schön und gut... ABER wenn ich die Eigenschaft auf 0 setze mit Color.FromArgb(0), dann wird alles schwarze transparent dargestellt.... Wo ist denn da bitteschön der Unterschied? Gibt es einen zwischen 0,0,0,0 und Color.Empty ???
-Jürgen
Ist wahrscheinlich wirklich besser, unterschiedliche Verfahren für ArrayLists und Arrays zu wählen.
Was mich nur wundert: Warum kann ich nach dem Casten auf die Property Item zugreifen, aber nicht mit InvokeMember??? Naja...
Ich werden nun prüfen mit Type.IsArray und dann entweder nach dem Casten die Methode Add bzw. das Property Item benutzen. Ausserdem muss ich mich darum kümmern, dass die Anzahl der einzufügenden Elemente bei den Arrays vorher bekannt ist.
Vielen Dank für Deine Antworten!
Ich habe mal einige Versuche gestartet:
Erzeugung einer ArrayList mit einer initialen Kapazität von 100 (ist aber egal, da die initiale Kapazität 16 beträgt) mit Activator.CreateInstance
Hinzufügen eines Objekts an die Stelle 0 mittels InvokeMember("Item",.....):
System.ArgumentOutOfRangeException
in System.Collections.ArrayList: set_Item(int,object)
Hinzufügen eines Objekts an die Stelle 1 mittels InvokeMember("Item",.....):
System.ArgumentOutOfRangeException
in System.Collections.ArrayList: set_Item(int,object)
Hinzufügen eines Objekts an die Stelle 0 mittels InvokeMember("set_Item",.....):
System.MissingFieldException
in System.MonoType: InvokeMember(string,.......)
Erzeugung eines ObjectArrays mit einer initialen Grösse von 100 mit Array.CreateInstance
Hinzufügen eines Objekts an die Stelle 0 mittels InvokeMember("Item",......):
System.MissingFieldException
in System.MonoType: InvokeMember(string,.......)
Hinzufügen eines Objekts an die Stelle 0 mittels InvokeMember("set_Item",......):
System.MissingFieldException
in System.MonoType: InvokeMember(string,.......)
Hinzufügen eines Objekts an die Stelle 0 mittels InvokeMember("SetValue",......):
System.MissingFieldException
in System.MonoType: InvokeMember(string,.......)
Den größten Erfolg hatte ich noch in der ArrayList. Scheinbar ruft Item die Methode set_Item auf, die ich aber nicht direkt aufrufen kann. Eine ArrayList kann ich ja nur mit einer initialen Kapazität erzeugen. Das ist aber leider nicht das gleiche wie die Gössenangabe eines Arrays...
*grübel*
Nein, habe ich noch nicht versucht... Das würde aber wiederum bedeuten, dass ich vorher wissen muss, wieviele Elemente das Array hat.
Und wenn ich es wüsste, wie übergebe ich denn eine initiale Grösse? Bei einer ArrayList kann ich diese ja dem Konstruktor übergeben... aber bei einem Array?
Original von cdr
Wenn es also möglich wäre zb. jeweils nach dem Zurückkehren einer NT-Blockierung abzufragen ob der Thread interrupted wurde
Dazu müsste ja erstens überhaupt bekannt sein, dass eine Betriebssystemabhängige Blockierung stattgefunden hat. Wird etwa ein Event dazu ausgelöst? Bis jetzt habe ich unter .NET zwar noch nicht mit Threads gearbeitet. Es erscheint mir aber doch sehr ungewöhnlich!
Wie wäre es denn mit einem Sleep(0)? Das sollte nicht allzusehr aufhalten und ich bin es von anderen Entwicklungsumgebungen gewohnt, dass auch bei einem Sleep(0) der Scheduler prüft, ob eine weiterer Thread an die Reihe kommen soll.
-Jürgen
Moin!
Wenn ich mit mittels CreateInstance z.B. eine ArrayList erzeuge, wie kann ich dann per InvokeMember ein Objekt hinzufügen?
Zu einem geht es ja hervorragend über die Methode "Add". Ich möchte aber per InvokeMember auf die Property "Item" zugreifen... Dann klappts auch mit normalen Arrays und nicht nur mit ArrayLists. 😉
Aber ein Aufruf von
object o=System.Activator.CreateInstance(Type.GetType("ArrayList"));
o.GetType().InvokeMember("Item",BindingFlags.Default|BindingFlags.SetProperty,null,o,new object[] {0,"XYZ"});
führt zu einer System.ArgumentOutOfRangeException.
Nun liegt es sicher daran, dass das interne Array noch keinen Speicher für irgendwelche Objekte reserviert hat...
Mir fällt bis jetzt nur die Möglichkeit ein, mit der Methode "Add" aus IList zu arbeiten... Und bei normalen Arrays müsste man ein neues Array mit einer Speicherstelle mehr erzeugen, den ganzen Krempel umkopieren und das neue Element hinzufügen....
Wie bekomme ich das geschickter hin? So dass es mit Arrays und ArrayLists funktioniert. Immerhin haben doch alle die Property "Item". ?(
Gruß
Jürgen
Original von lacher
String connection="DRIVER={MySQL ODBC 3.51 Driver};"+
"SERVER=profex;"+
"DATABASE=test;"+
"UID=root;";
connection = connection + ";PASSWORD=" + passwort;+
"OPTION=3";
Die Fehlermeldung verstehe ich jetzt nicht, weil ich Strings immer mit dem +-Operator zusammenfüge...
In der Zeile connection=connection+";PASSWORD="+passwort;+
ist das Semikolon hinter passwort falsch. Deswegen wird der Compiler auf jeden Fall meckern!
Wenn Du das beseitigst, dann sieht der ConnectionString wie folgt aus:
DRIVER={MySQL ODBC 3.51 Driver};SERVER=profex;DATABASE=test;UID=root;;PASSWORD=XXXXXXOPTION=3
Vor PASSWORD ist ein Semikolon zuviel und hinter dem eigentlichem Passwort fehlt ein Semikolon. Deshlab dürfte es wohl auch Probs bei Deiner ODBC-Verbindung geben.
Gruß
Jürgen
Aber man könnte ja Assemblies in anderen AppDomains laden. Diese wären dann ja entladbar.
Mein jetziger Weg ist aber noch 1000mal einfacher und unkomplizierter. Alle Objekte, die ich erzeugen möchte, gab es vorher schon einmal. Also muss ich mir an dieser Stelle nur merken (Speicher, File, DB) aus welchem Assembly es stammte.
-Jürgen
Danke für Eure Hilfe!
Type.GetType() sucht also in den geladenen Assemblies und im Cache. Dann funzt es leider nicht, was ich vorhatte...
Ich werde jetzt auf dem Weg weitermachen, dass nicht nur der Klassenname, sondern auch der Assemblyname übergeben werden muss, um eine Instanz zu erzeugen.
Eine andere Möglichkeit wäre noch, alles Assemblies im Arbeitsverzeichnis zu laden und dann dort nach der Klasse zu suchen. Aber das ist mir jetzt zu aufwendig... 😉
Gruß
Jürgen
Danke!
Es funktioniert aber nur, wenn MeinNamespace.MeinKlassenname auch in der gleichen Datei wie der Aufruf GetType() vorhanden ist!
Wie bekomme ich aber den Typ aus einer anderen Klasse in einem anderen Assembly? Dabei weiss ich aber ausserdem nicht immer, in welchem Assembly diese Klasse steckt...
Gruß
Jürgen
Moin!
Welche Typen findet Type.GetType() eigentlich anhand des Namens??? Ein System.Int32 wird ja z.B. problemlos gefunden.
Wie finde ich aber eigene Klassen?
public class A{
public static void Main(){
System.Type t = System.Type.GetType("A");
// hier ist t immer noch null :-(
}
}
Gibt es einen Weg, wie ich mir den Typ 'A' erzeugen kann? Auf welche Bereiche beschränkt sich GetType() überhaupt?
Gruß
Jürgen
Original von Maddinel
Wie hast du Mono installiert? Als *.tar Paket?
Nein, mit Red Carpet... Hab Dir 'ne PM geschrieben, weil es hier OT ist.
Gruß
Jürgen
In welcher Hilfe? Diese MSDN-Library? ... Och Mönsch... muss ich schon wieder Windows booten? 😉
Gruß
Jürgen
Läuft bei mir unter Linux/Mono einwandfrei.... Sowohl der Online, als auch der Offline-Fall....
?(
Moin!
Was passiert eigentlich, wenn während des Ausführens von DataAdapter.Update ein Fehler auftritt? (Netzwerkverbindung verloren, Datenbank hat kein Speicherplatz, oder, oder, oder...)
Dieses Update verursacht doch ein Aufruf einer ganzen Sequenz von UPDATE-, INSERT-, DELETE-Statements... Bedeutet das, daß nur ein Teil der Anweisungen ausgeführt wird und danach die Datenbank dann inkonsistent ist? Oder werden zunächst nur Daten übertragen, aber noch nicht dauerhaft gesichert? Oder hängt das von der Datenbank ab?
Zumindest wird wohl zumindest eine Exception ausgelöst werden...
Gruß
Jürgen
Hängt sich auf??? Tut also nix mehr???
Haste denn auch schon kleine Debug-Meldungen eingebaut, damit Du sicher sein kannst, dass er wirklich beim HttpWebRequest oder beim GetResponse hängenbleibt?
Gruß
Jürgen
Original von Ftee
Wenn ich auf den anderen Thread schiele, fällt mir leider auf, das viele keinerlei Ahnung von Referenzierung und dem Umgang damit haben.
Denn bin ich ja beruhigt. Ich dachte schon die ganze Zeit, dass ich im falschen Film bin. 8o
Ein Ping nicht durchzulassen, kommt wohl noch daher, dass damit einst DoS-Attacken möglich waren... und traceroute beruht auf einzelne Pings mit unterschiedlichen TTL-Wert.
Abgesehen davon ist es möglich, ein Ping mit einer Firewall zu blocken. Das alleine reicht aus, um es im Programm zu berücksichtigen.
Aber ich habe bis jetzt habe ich auch noch keinen Ausfall von google bemerkt. Von daher sollte eine TCP-Verbindung auf Port 80 von google ausreichend sein, um zu prüfen, ob man online ist.
Wie sieht es eigentlich aus, wenn man hinter einem http und/oder ftp-Proxy steckt? Ist man dann auch online? 😉
Gruß
Jürgen
...mit der Einschränkung, daß Apache/mod_mono bisher nur unter Unix funzt und noch nicht unter Windows... aber wer will das schon? 😉
Gruß
Jürgen
Gut! Das widerspricht nicht meinem Verständnis von OOP! 😉
Aber ich befürchte ein Prob wegen des Sleeps... Das sollte in einem Extra-Thread passieren, damit am Ende auch myApfel.isVerfault = true ist. 😁
Gruß
Jürgen
Wenn die Firewall Pings druchlässt ja....
Gruß
Jürgen
Moin!
Ich denke, Du könntest höchstens feststellen, ob eine Dfü-Verbindung besteht... (dafür gibts eine DLL).
Wenn Du in einem Netzwerk bist, hast Du keine Möglichkeit festzustellen, ob Du online bist. Du könntest dann höchstens versuchen, eine TCP-Verbindung zu einem Rechner im Internet herzustellen. Aber wenn der mal ausfällt? Wenn dazwischen eine Firewall ist?
Ist nicht trivial das Problem!
Gruß
Jürgen
Moin!
In verschiedenen Threads ist ja die Diskussion über Referenzen ausgebrochen...
Ich möchte nicht weiter in themenfremden Threads darüber diskutieren, deshalb hier der neue Thread!
Immer wieder lese ich, daß eine Referenzübergabe gegen objektorientierte Programmierung verstößt! 8o
Habe ich denn immer etwas falsch verstanden? Kann ich denn gar nicht objektorientiert denken???
Bsp:
Wenn ich meinen konkreten Apfel(myApfel = newApfel()) in Deine Hände lege und Du abbeißt (Du.beisstAb(myApfel)), dann ist mein Apfel kleiner geworden und es wurde nie von einer Kopie meines Apfels abgebissen.
Das ist die Nachbildung der realen Welt, das ist in meinen Augen OOP.
Liege ich da so falsch?
Gruß
Jürgen
Original von norman_timo
Also ich glaub ich bin jetzt beleidigt!@GhoBu:
Was ist das denn: unbestimmte Anzahl von integer als Übergabeparameter?Das ist doch ein Array, oder? Übrigens spricht man das auch so an:
numbers[x] (siehe mein Bsp. oben).
Es gibt keinen Grund beleidigt zu sein! Ich führe auch keinen Privatkrieg...
Es war nur in dem Zusammenhang völlig falsch! Wenn Du ein int[] übergeben willst, dann geht das so:
public void DoSomething(int[] intarray){
...
}
public void CallOtherMethod(){
int[] ar = { 1 ,2 ,3 ,4 ,5 };
DoSomething(ar);
}
Wenn Du eine Methode deklarierst, die eine unbestimmte Anzahl von ints bekommt, geht das so:
public void DoSomething(params int[] intarray){
...
}
public void CallOtherMethod(){
DoSomething(1,2,3,4,5);
DoSomething(1,2);
...
}
Vielleicht verstehst Du jetzt, was ich meine: eine variable Parameterliste!
Gruß
Jürgen
params benutzt man, wenn man nicht festlegen will, wieviele Parameter übergeben werden sollen. Auch den Rest von noman_timo würde ich mit Vorsicht geniessen.
Gruß
Jürgen
Oder nur mit der Name-Eigenschaft:
switch (MeineKlasse.MeinField.FieldType.Name)
{
case "Int32":
...
break;
case "String":
...
break;
default:
...
break;
}
Wenn Du weißt, was Du tust... (Gleicher Name im anderen Namensraum möglich)
Gruß
Jürgen
Moin!
Mal was zum genaueren Verständnis der Referenzen:
Wenn ich eine Klasse instanziiere mit z.B.
MyClass c = new MyClass();
Nun übergebe ich diese Instanz einer Methode als Parameter:
doSomethin(c);
Dann arbeite ich in dieser Methode nicht mehr mit der erzeugten Instanz, sondern dieses ist dann eine neue Instanz, die aber alle Felder aus der alten Instanz kopiert hat. Richtig?
Eine Änderung der Felder hat keine Auswirkungen auf die Instanz außerhalb der Methode.
Das heißt, wenn ich diese Instanz durch diese Methode in ein Array, AraayList o.ä. packe, dann kann ich später nicht feststellen, ob meine Original-Instanz 'c' in diesem Array enthalten ist.
Sehe ich das soweit richtig?
Gruß
Jürgen
Danke für den Tipp! Leider war es nicht ganz kompatibel zu meinem Problem, da ich z.Zt. gerade mit MySQL arbeite.
Was ich vermeiden wollte, war das Übertragen der Daten von der Datenbank in das DataSet. Inzwischen habe ich endlich kapiert, daß das Setzen des SelectCommands gar keine Verbindung und Datenaustausch erzeugt, sondern dem DataAdapter lediglich die Struktur einer Tabelle mitteilt.
Ein InsertCommand habe ich dann mit dem CommandBuilder erzeugen lassen und DataAdapter.Update liess dann endlich die neu generierten Datensätze ohne vorheriges DataAdapter.Fill in die Datenbank rauschen. 🙂
Gruß
Jürgen
Moin!
Damit hast Du lediglich eine Referenz auf den Stack in die ArrayList gelegt. Wenn Du alle Objekte des Stacks in die ArrayList packen willst, mußt Du über alle Instanzen im Stack iterieren und sie mittels der Methode ArrayList.Add der ArrayList hinzufügen.
Es mag auch eine Methode geben, die dieses in einem Schritt erlaubt...
Gruß
Jürgen
Moin,
Original von Unikum
Als Hochsprache könnte man die Sprachen erst dann bezeichnen, wenn der Übergang gleich zum Assembler erfolgt (sprich native Codes müssen erstellt werden können), ohne das eine andere Hilfssprache von Extern nötig ist.
dieses liefert aber keinen Grund C# als Interpretersprache zu bezeichnen. Denn der aus C# generierte MSIL wird nicht interpretiert, sondern in nativen Code übersetzt und dann ausgeführt.
Gruß
Jürgen
Moin!
Ich möchte einer Datenbank Datensätze hinzufügen. Dazu muss ich ersteinmal ein DataSet erzeugen. Normalerweise bekomme ich mit DataAdapter.Fill die Tabelle aus der Datenbank in das DataSet, kann dann Änderungen vornehmen und mit DataAdapter.Update die Änderungen in die Datenbank übernehmen.
Nun ist meine Datenbank aber sehr groß. Wenn ich diese Daten erst in den Speicher schreiben soll, hätte ich evtl. Probleme mit dem Arbeitsspeicher und ausserdem würde es zu lange dauern, bis alle Daten übers Netzwerk transportiert sind. Außerdem völlig unnötig, weil ich nur Datensätze hinzufügen will. Keine Änderungen! Keine Löschungen!
Ich könnte mir eine entsprechende DataTable im DataSet bauen und die DataRows hinzufügen. Aber wie bekomme ich sie dann in die Datenbank??
Oder sollte ich ganz anders vorgehen?
Gruß
Jürgen