Hey gfoidl,
das Einhaken bei der Serialisierung klingt recht vielversprechend. Hast du da eventuell noch eine Quelle zu parat?
Gruß
Hast Du mal geschaut ob es mit den alten Serviceproxies besser läuft?
Add Service Reference => Advanced => Add Web Reference
Da ich in VS8 arbeite, habe ich die alte natürlich probiert. Das neue wurde Testweise auch ausprobiert, aber ohne Besserung.
Hallo gfoidl,
danke für die Antwort. Ich habe mir das Tool angeschaut und verschiedene Parameter ausprobiert. Die generierten Dateien brachten allerdings keine Lösung. Weitere Suchen nach dem Problem sagten mir ebenfalls nur, dass es "schwierig" ist. Gibt es eventuell eine andere, meinetwegen manuellere Methode? Im dümmsten Fall muss ich wohl hingehen und die XML-Responses direkt abfangen und selber parsen.
Gruß
bonzy
Hallo zusammen,
ich hänge jetzt seit ein paar Tagen an diesem Problem und komme nicht mehr wirklich weiter. Ich habe bereits viele Kombinationen an Stichwörtern durch Google gejagt, aber sobald es in die Nähe meines Problems kam, gab es keine Antworten mehr.
Ich möchte anhand eines SOAP-Service Daten einer Website abfragen. Dazu habe ich eine Web Reference meinem Projekt hinzugefügt und greife darüber auf die Methoden zu. Dies funktioniert für simple Types wunderbar, sobald ein Complex Type ins Spiel kommt, fange ich mir alle möglichen Exceptions.
Beispielsweise liefert eine Methode getuserids(int) einen Typ ArrayOfUserid zurück. Dieser beinhaltet wiederum ein int[]. Beim Ausführen fange ich mir jedoch eine InvalidCastException > Fehlermeldung:
Ein Objekt des Typ System.Int32[] kann nicht einem Objekt des Typs ArrayOfUserid zugewiesen werden. . Wenn ich die generierte Reference.cs entsprechend verändere, dass die Methode direkt ein int[] zurückliefert, funktioniert es. Das gilt für jeden Array-Typ.
Sobald eine Methode mit einem "einfachen" sprich nicht-Array-Typ aufgerufen wird (z.B. getplayerbyid(int)), gibt es Exceptions wie > Fehlermeldung:
Ein Objekt des Typ System.Xml.XmlNode[] kann nicht einem Objekt des Typs Player zugewiesen werden. oder > Fehlermeldung:
Der angegebene Typ wurde nicht erkannt: Name='Map', Namespace='http://xml.apache.org/xml-soap', bei <return xmlns=''>.
Ich verwende diese WSDL: http://www.comunio.de/soapservice.php?wsdl
Da sich die Reference.cs leicht generieren lässt, kopiere ich den Code jetzt nicht nochmal hierhin. Ich verwende dazu VS8. Ich habe es wie oben angesprochen über Visual Studio generieren lassen, da sind soweit ich das überschaut habe keine Parameter anzugeben.
Unter Java ließ sich das Problem für die Array-Typen laut einem Kollegen lösen, indem über eine Option beim Generieren durch AXIS1 das Unwrapping aktiviert wurde.
Hier noch der Code zum Ausführen:
soapservicewsdl soap = new soapservicewsdl();
object o = soap.getuserids(1458132);
Ich bin recht unerfahren was das Thema anbelangt, daher für jede Hilfe offen. 😃 Für mehr Informationen einfach anfragen.
Schönen Gruß
Edit: Mit dem Tool soapUI konnte ich mir verschiedene Response-XMLs anschauen und bin zumindest mal auf den Typ "Map" gestoßen, der aus dem namespace http://xml.apache.org/xml-soap entstammt. Gibt es eventuell damit bekannte Probleme?
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:soapservicewsdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getplayerbyidResponse>
<return xsi:type="ns2:Map">
<item>
<key xsi:type="xsd:string">id</key>
<value xsi:type="xsd:int">31080</value>
</item>
<item>
<key xsi:type="xsd:string">name</key>
<value xsi:type="xsd:string">Blaszczykowski</value>
</item>
<item>
<key xsi:type="xsd:string">points</key>
<value xsi:type="xsd:int">159</value>
</item>
<item>
<key xsi:type="xsd:string">clubid</key>
<value xsi:type="xsd:int">5</value>
</item>
<item>
<key xsi:type="xsd:string">quote</key>
<value xsi:type="xsd:int">9060000</value>
</item>
<item>
<key xsi:type="xsd:string">status</key>
<value xsi:type="xsd:string">ACTIVE</value>
</item>
<item>
<key xsi:type="xsd:string">position</key>
<value xsi:type="xsd:string">midfielder</value>
</item>
</return>
</ns1:getplayerbyidResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Wieso genau? Letztlich liegen die Bindung und die Property in ein und derselben Klasse und wenn die Verwendung nur intern geschieht, sehe ich den Nutzen nicht, dass es öffentlich für alle ist. Es wird ja so quasi garantiert, dass man immer auf gebundene Properties zugreifen kann und will man das?
Hallo zusammen,
ich habe nur eine kurze Nachfrage: Muss ein Property wirklich public sein, damit sie für DataBinding herhalten kann? In meinen Tests mit einer ImageSource kam es zumindest zu diesem Ergebnis. Kein anderer Zugriffsmodifizierer hat funktioniert.
Gruß
Ich entschuldige mich für die Störung. Ich habe gestern mit WPF angefangen und die Reihenfolge der Margin-Werte hat mich wohl beim Testen verwirrt. Ich hatte diesen Weg ausprobiert, aber links/rechts mit oben/unten vertauscht. Danke für den Anstoß, ich musste es im Prinzip nur nochmal ausprobieren. 😃
Hallo zusammen,
eine wahrscheinlich einfache Frage und Lösung, aber ich komme gerade nicht drauf und habe weder im Netz noch in "WPF 4" (Nathan) was gefunden. Und zwar möchte ich für eine ListBox ein ItemsPanelTemplate anlegen, dass den Abstand zwischen den Elementen regelt. Ein einfaches Stackpanel bewirkt leider nur den Abstand aller Elemente zur ListBox und für jedes Element möchte ich die Margin nicht setzen müssen. Gibt es da einen eleganteren Weg?
Gruß
Hallo Michael,
letztlich läuft es darauf hinaus, dass ich die Funktionalität einer .bat Datei imitiere. Ich nehme dabei sowohl die Arbeit der Erstellung dieser Datei ab als auch mögliche Probleme damit. Wenn ich über eine .bat Datei versuche, firefox mit Parametern zu starten, lande ich in einer Art Schleife. Über die Command Line komme ich anscheinend nicht an die "App Paths" heran. Eine Internetverknüpfung hat eine begrenzte Anzahl an Zeichen, um Parameter zu übergeben.
Das sind nur ein paar Probleme, die ich jetzt schon kenne und mit meinem Programm umgehen kann. Dazu ist es nunmal flexibler und einfacher zu bedienen, als sich für alles eine Datei zu erstellen.
Ich benutze es beispielsweise, um Spiele im Window Mode auszuführen oder um Solutions in Visual Studio zu laden. Die Desktop-Verknüpfungen zu Teamspeak und Filezilla habe ich soeben auch gelöscht und einen Server wähl ich da nicht mehr aus. Der praktische Nutzen wird mit der Zeit eher größer als kleiner, deshalb halte ich es trotz der Alternativen für brauchbar.
Gruß
Version: v1.2
"Create sets of programs which can be executed with as many parameters as you want!"
Ich stelle ein kleines Projekt vor, auf das ich von einem Kollegen angestoßen wurde. Er wollte mehrere Tabs/Seiten in Firefox mit einem Klick öffnen, aber hat es nicht geschafft.
Darauf kam mein Einwand, ich könnte ihm schnell ein Tool schreiben, um sein Problem zu lösen. Das erste Ergebnis war innerhalb von 20 Minuten fertig und lauffähig, aber natürlich unsauber.
Deshalb habe ich noch ein wenig mehr Arbeit reingesteckt und dies ist das Ergebnis.
Produktfunktionalität:
In Planung:
Ich hoffe, dass das Programm in unterschiedlichen Fällen Gebrauch findet und würde mich freuen, wenn spezielle Einzelfälle gepostet würden, in denen das Programm besonders viel Sinn macht.
Ein paar Beispiele meinerseits findet man am Ende dieses Beitrags.
Gruß
Gerade bin ich wieder auf ein kleines Schmankerl gestoßen:
if (this.cbxSuggestionList.SelectedIndex != -1)
{
this.cbxSuggestionList.SelectedIndex = -1;
}
if (this.cbxSuggestionList.SelectedIndex == -1 || this.cbxSuggestionList.DroppedDown)
...
(1) Du rufst die zweite Form wohl mit ShowDialog() auf, wodurch du keinen neuen Thread startest. Das macht es den zwei Formen natürlich unmöglich, parallel zu funktionieren. Stattdessen benutzt du hier Show().
(2) Wenn du sie mit ShowDialog() aufrufst, muss sie eigentlich den Fokus haben.
Ich verstehe das Problem noch nicht so ganz. Du lässt über mehrere Threads die gleiche Aktion mit verschiedenen Suchwerten laufen und synchronisierst alle fertigen Threads, damit die Ausgabe im ListView nicht durcheinander läuft. Und jetzt möchtest du eine gewisse Anzahl an Threads laufen lassen und nur neue aufmachen, wenn alte fertig sind, damit eben dieser Effekt nicht auftritt?
Bei mir kommt das Konzept nicht an, mehrere Suchen gleichzeitig zu starten. Vor allem würdest du mit dem Beenden eines Threads doch diese Suche zerschießen.
Ich hätts gern noch was genauer. 😃
Also wie ich das verstehe ist das Problem, dass "Katze fuettern" statisch ist und "Katze schnurrt" nicht.
public class Cat
{
void static feed()
{
Console.WriteLine("Feeding the cat - yum yum yum");
purr(); // Geht natürlich nicht, weil purr nicht statisch ist und eine Instanz benötigt
}
void purr()
{
Console.WriteLine("prrrr prrr prrr");
}
public static void Main(String[] args)
{
Cat.feed();
}
}
Allerdings verstehe ich nicht, wofür genau man das brauchen sollte. Wenn ichs denn getroffen habe, könntest du den speziellen Fall nennen?
Guten Tag zusammen,
aktuell arbeite ich an einem kleinen Tool (WinForms GUI), dass C++ Source Code anhand von Visual Studio PDB-Dateien analysiert und grob gesehen alle für mich nützlichen Methoden und Funktionen ausliest. Dazu benutze ich das DIA SDK und arbeite somit mit COM-Objekten.
Das Problem an der Geschichte ist eindeutig die Performance: Ich laufe über ca. 200 PDB-Dateien und finde darin um die 1 Mio. Methoden. Der komplette Prozess dauert jetzt allerdings zwischen 5 und 10 Minuten und das liegt hauptsächlich (basierend auf Tests von mir) an der Arbeit mit dem Interface IDiaSymbol. Methoden wie "findChildren" oder "findLinesByAddr", an denen ich nicht vorbeikomme, ziehen auf diese Anzahl an Dateien einfach sehr viel Zeit.
Als Information hier noch ein Link zu MSDN: Debug Interface Access SDK.
Mir fallen ehrlich gesagt keine guten Ansätze ein, wie ich die Performance steigern könnte, da es nunmal stark an Code liegt, der nicht von mir geschrieben ist bzw. optimierbar wäre. Multithreading fällt so gesehen auch flach, weil es ein COM SDK ist. Zumindest ist mir keine Methode bekannt, wie ich damit arbeite, ohne den RCW abzuschneiden.
Ich bin über jede Hilfe und Ansätze dankbar. Wenn es nicht ohne Code geht, liefer ich diesen nach, auch wenn ich wie gesagt der Meinung bin, dass es daran nicht liegt.
Gruß
Edith: Bin durch Zufall darauf gestoßen, dass der RCW nicht aufgrund des Multithreadings, sondern durch einen zu frühen Release des COM-Objekts zustande kommt. Ich hatte diese Threading Geschichte in dem Zusammenhang noch im Hinterkopf und bin direkt von dieser Ursache ausgegangen, aber zumindest das scheint jetzt zu funktionieren. Wenn noch andere Vorschläge reinkommen, nehme ich diese natürlich auch gerne. 😃
Bedankt fürs Verschieben.
Ich bin schon länger mit C# vertraut, aber das mir das nochmal passiert. 😃
public override int GetHashCode()
{
return 0;
}
Das Hinzufügen mit Abfrage auf ContainsKey für über 30k Dictionary-Elemente hat mich Minuten gekostet. 😄
Wie michlG schon sagte, ist es nicht gut, die Controls in der Spielerklasse zu halten. Wie genau ist denn deine Form aufgebaut? Gibt es für jeden Spieler einen eigenen Button oder einen einzelnen, der nach Kriterien auf verschiedene Spieler zugreift? Die einfachste Lösung wäre wohl, LabelAktualisieren den Text zurückgeben zu lassen, den du dem Label zuweisen willst.
public string LabelAktualisieren()
{
return this.Name + this.Geld;
}
private void OnClick(..)
{
this.label = spieler[0].LabelAktualisieren();
}
Grundsätzlich ist es schlechter Stil, wenn man Daten (Spieler) und Darstellung (Form) zusammenschmeißt.
Ich möchte hier mal ein kleines Update veröffentlichen, weil wir vorgestern eine Besprechung hatten und zu einer starken Veränderung in unseren Plänen gekommen sind.
Die bisherigen Arbeiten am Fußballmanager sind vorerst gestrichen und werden erstmal in abgeschwächter Form von mir weitergeführt.
Stattdessen haben wir uns auf ein neues Konzept geeinigt: Der Fußballmanager wird zum Browsergame! Hier schonmal ein paar kleine Einzelheiten:
Es soll ein Ligensystem geben, in dem jeder mit seiner Mannschaft antreten kann. Man kann einen Trainingsplan entwerfen und so seine Mannschaft auf die Spiele an zwei Tagen (voraussichtlich Mittwoch und Samstag) vorbereiten. Es wird einen festen Ablauf von Saisons geben, in die man nicht quereinsteigen kann und stattdessen Zeit für eine Vorbereitung hat. So kann man für die nötigen Konditionellen Werte sorgen und sich beim Training mehr auf die fußballerischen Fähigkeiten konzentrieren.
Auf- und Absteiger wird es natürlich auch geben, sodass es zu einem Kraftakt wird, in eine höhere Liga aufzusteigen und sich dort zu halten. Doch auch wirtschaftliche Faktoren spielen eine große Rolle, denn ein überschuldeter Verein wird bei uns nicht ohne Sanktionen davonkommen. So soll eine möglichst gute Balance zwischen Spaß und Schwierigkeit geschaffen werden, um Einsteiger nicht zu verschrecken und trotzdem eine Herausforderung für die Hobby-Manager dieser Welt zu stellen.
Es wird höchstwahrscheinlich Anfang nächster Woche losgehen und wir hoffen, schneller Ergebnisse präsentieren zu können.
Wir werden speziell in unserem Forum hin und wieder einen Stand rausgeben, also verfolgt uns doch bis dorthin. 😃
Die reine Erklärung der WRITE Methode reicht mir denke ich schon. Damit sollte ich im Stande sein, mein Problem zu lösen. Wenn ich dennoch auf Probleme stoße, melde ich mich wieder.
Ich synchronisiere bereits perfekt von der globalen (SQL Server) in die lokale (CE). Jetzt muss ich allerdings noch die andere Richtung abdenken, sollte lokal etwas verändert werden. Dann muss ich von CE nach SQL Server.
Ich glaube ich habe Varbinary falsch eingeschätzt. Ich dachte bisher, dass MAX bloß für die Grenze von 8000 steht. Also könnte ich image durch VARBINARY(MAX) ersetzen und mit der VARBINARY WRITE Methode arbeiten?
Ich benutze CE nur für die lokale Datenbank, da darf ich also auch ganze Datensätze hinzufügen, ohne dass das Netzwerk etwas mitbekommt. Den schrittweisen Zugriff brauche ich für SQL Server 08.
Zu deinem Vorschlag muss ich dir leider folgendes bezogen auf TEXTPTR Zitieren: "Diese Funktion wird in zukünftigen Versionen von Microsoft SQL Server nicht mehr bereitgestellt. Verwenden Sie diese Funktion beim Entwickeln neuer Anwendungen nicht, und planen Sie das Ändern von Anwendungen, in denen es zurzeit verwendet wird. Alternative Funktionen sind nicht verfügbar."
Und ohne das komm ich ja nicht an den Varbinary-wert, somit fällt die Write Methode auch weg.
Hallo Florian,
den SequentialAccess benutze ich, um größere Spalten vom Typ 'image' in Schritten auszulesen, da die Daten dort sehr groß werden können. Jetzt brauche ich eine Methode, wie ich auf dem gleichen Weg große Daten in kleinen Schritten wieder in die DB kriege. Mit Update kann ich leider nicht arbeiten, da der '+'-Operator nicht mit image gültig ist (andere Datentypen kommen nicht in Frage wegen der Größe der Binärdaten).
Also reicht mir das Zeilenweise schreiben nicht, sondern ich muss erstmal alle Spalten einzeln schreiben und dazu nochmal die großen Spalten in kleinen (10KB) Schritten abarbeiten. Das dient dazu, dass ich während des Vorgangs immernoch einen Geschwindigkeitsanpassung vornehmen kann.
Mit dem Sync Framework habe ich zuerst gearbeitet, aber es bietet mir nicht die Möglichkeit, diese kleinen Schritte darzustellen. Deshalb habe ich bereits begonnen, es zu Fuß zu schreiben.
Darunter waren jetzt wohl Informationen, mit denen ich direkt hätte rüberkommen können, deshalb hoffe ich man kann jetzt etwas mit mit meinem Problem anfangen.
verwendetes Datenbanksystem: MS SQL Server 2008
Tag zusammen,
aktuell schreibe ich einen Synchronisationsvorgang, der eine globale DB (s.o.) lokal ablegt (Compact Edition). Dieser läuft als Windows Dienst im Hintergrund und soll somit möglichst wenig die CPU/das Netzwerk belasten. Dafür habe ich beim Lesen die Möglichkeit des SequentialAccess beim DbDataReader entdeckt, aber was mir fehlt ist ein Gegenstück zum Schreiben.
Dass es einen DataWriter nicht gibt ist mir klar, aber die Frage die sich mir stellt ist, ob es überhaupt möglich ist. Ich habe zumindest noch nicht davon gehört, dass man in Schritten in eine Datenbank bzw. einen Datensatz schreiben kann.
Wäre nett, wenn sich dazu jemand äußern würde. 😃
Aktuell steht einiges still, weil jeder andere Verpflichtungen vorzieht. Es ist und bleibt ein Freizeitprojekt und die ist gerade Mangelware bei jedem von uns. Aber gut, dass du mich nochmal dran erinnerst. Ich werde demnächst nochmal genau nachhaken, wie es weitergehen wird und wenn es etwas Konkretes zu vermelden gibt, wird es hier auftauchen.
Ich habe mich heute auch mit diesem Thema beschäftigt und bin auf eine Lösung gekommen, die keine eigene ScrollBar verwendet. Die ListBox hat eine Property TopIndex, die den Index des Items angibt, der nach einem ScrollVorgang als oberstes Item gezeichnet wird. Wenn man nun diesen Index z.B. beim Zeichnen abfängt und mit dem gespeicherten letzten Stand vergleicht, merkt man leicht, ob gescrollt wurde oder nicht, sogar in welche Richtung.
So, da bin ich nochmal.
Es läuft jetzt alles mehr oder weniger rund. Allerdings stört es mich immernoch, dass meine komplette GUI einfriert, sobald ich in einer mit einem neuen Thread gestarteten Klasse (Connection) ein Thread.Sleep() verwende.
Thread thread = new Thread(new ThreadStart(this.CreateConnection));
thread.Start();
private void CreateConnection()
{
new Connection(this.connection_ConnectedClient);
}
In dieser Klasse warte ich aus Sicherheitsgründen immer auf eine Antwort des Gegenübers bis ich weitersende. Das sieht dann so aus:
do
{
System.Threading.Thread.Sleep(waitLength);
} while (!this.sendFinished);
Das eigentliche Problem könnte wohl daran liegen, dass ich zu einer hergestellten Verbindung ein ChatFenster bereitstelle, welches ich natürlich nur im GUI-Thread erstellen kann. Somit könnte es doch sein, dass mein Vorhaben gar nicht so möglich ist oder?
Bin für jede Antwort dankbar. 😉
Edit: Hat sich keiner mehr gemeldet und war wohl auch nicht nötig, habe es jetzt irgendwie zusammengeschustert.
Hallo Rainbird,
danke schonmal für die Links. Ich habe mich in den Programmen ein wenig umgeschaut und zumindest scheint das oben angesprochene Problem mit den Ports nicht schlimm zu sein, es ist dort nämlich genauso.
Jedoch ist die Methode der Übertragung ein wenig anders, außerdem wird ein wirklicher Server verwendet. Ich will allerdings eine P2P-Verbindung aufbauen und keinen Chatroom.
Edit: Es funktioniert jetzt soweit, allerdings immernoch nur mit ShowDialog(). Mein Hauptfenster scheint dadurch zwar nicht blockiert zu werden, was mich ein wenig sehr verwundert, aber es klappt zumindest.
Hallo Rainbird,
es gilt hauptsächlich der Übung und des Verständnisses. Einfacher geht es quasi immer, aber warum nicht mal zu Fuß sowas machen, um es wirklich verstanden zu haben. Außerdem bin ich schon zu weit, um jetzt "aufgeben" zu wollen.
Edit: Btw. habe ich noch eine kurze Frage zum Thema Sockets. Und zwar läuft der Austausch nicht wirklich, da ich nur von Server zu Client, aber nicht von Client zu Server Daten senden kann. Beim EndPoint des Clients ist der Port angegeben, über den ich kommunizieren will, beim Server jedoch steht ein anscheinend zufälliger Port. Ich nehme an, dass das der Grund ist, aber wieso ist das so, wenn ich die Verbindung doch auch über diesen Port aufbaue? Der Socket, der bei EndAccept() entspringt hat plötzlich diesen anderen Port.
Tag zusammen,
mein Problem beschreibt der Titel schon ganz gut. Ich verbinde mich über Sockets (bisher nur übers Lokale Netzwerk) mit einem anderen Rechner. Die Verbindung steht und ich will nun für beide ein Chatfenster öffnen, um Nachrichten auszutauschen.
Die entsprechende Form kann ich beim "Client" problemlos öffnen, beim "Server" jedoch hängt sie sich nach Show() auf (das Hauptfenster bleibt zugänglich). Ich übergebe dabei vorher die Verbindung und ein paar Daten zum verbundenen Partner. Mein Verdacht ist, dass es hakt, weil ich die Verbindung sprich die Sockets mit übergebe, jedoch hängt sich das Fenster auch auf, wenn ich dieses ohne Parameter starte.
Gerade habe ich es einmal mit ShowDialog() probiert und schon ging es. Allerdings würde mich schon noch interessieren, wieso es in diesem Fall nicht mit Show() geht. Zumal mir trotz ShowDialog() der Zugriff auf mein Hauptfenster auch noch gewährt bleibt.
Mir wäres lieber, wenn ich den Code nicht vollständig veröffentlichen müsste, deshalb bitte gezielt nach Stellen fragen. 😉
Danke
Also zielst du darauf ab, wie man die Breite eines Textes berechnet?
Außerdem wichtig für dich sind die Controls TreeView und ListView.
System.ServiceProcess.ServiceController
Findet man sicher Beispiele zu, ist allerdings auch nicht sonderlich schwer.
Darf man fragen, was der Sinn hinter der Aktion ist? Kann mir gerade nicht wirklich vorstellen, wofür man sowas brauchen könnte.
Ich verstehe den Unterschied auch nicht wirklich. Aber dein mathematische Ansatz klingt soweit schon ganz logisch, bloß würde ich persönlich weniger Wert auf die Aufstellung legen. Letztendlich kommen einfach Werte raus, die angeben, wie stark die Abwehr/das Mittelfeld/der Sturm besetzt ist. Anhand dieser kann man dann errechnen, wie das Spiel ca. laufen soll, ein wenig Glück/Zufall ist natürlich immer mit drin.
Und wieder ist eine Woche vergangen. 😉
Doch es gibt gute Nachrichten von meiner Seite. Die Version 1.2 ist fertig und darf ausgiebig getestet werden!
Bis zuletzt habe ich dokumentiert und ein paar Feinschliffe vorgenommen und ich bin recht zufrieden mit dem Ergebnis.
Es liegt ab sofort eine XML-Dokumentationsdatei bei, die englische Dokumentation zu den einzelnen Methoden des ObjectManagers enthält. Außerdem wurden die Namen und Parameterlisten der Methoden überarbeitet und auch einige neue hinzugefügt.
Besonders für Abfragen ist es ein Fortschritt, dass es nun sowohl die Möglichkeit gibt, ein delegate zu übergeben, welches die Abfrage eigenständig regelt und dem Benutzer viel Freiheiten zulässt als auch ein "Conditionstring" zugelassen wird, der in guter alter SQL-Manier Vergleiche aufstellt, die sich mit "and", "or" und Klammersetzung verbinden lassen. Es können die gängigen Vergleichsoperatoren "==", "!=", ">", "<", "≥" und "≤" verwendet werden.
Das System ist noch nicht ganz ausgereift und beinhaltet sicherlich noch den einen oder anderen Fehler, weshalb ich darum bitte, mir diese bei auftreten zukommen zu lassen.
Vorerst werde ich versuchen, das Abfragesystem weiter zu verbessern, was auch beinhaltet, Vergleiche im Conditionstring mit Hilfe von boolescher Algebra zu optimieren.
Ich hoffe doch, dass sich jemand wenigstens mal kurz mit meiner Arbeit befasst und freue mich über Kritik jeder Art!
Wir hatten zufälligerweise gestern das letzte Meeting. Dort wurden verschiedene Schritte der Projektplanung- und organisation besprochen und es wird sich jetzt verstärkt um einen Editor gekümmert. Wenn es da etwas zu schauen oder zu testen gibt, sagen wir bescheid. 😉
Hallo zusammen,
um mal einen neuen Zwischenstand rauszugeben: Ich sitze nach wie vor an der Version 1.2, allerdings habe ich mir ein wenig mehr vorgenommen als eigentlich geplant. Es wurden nicht nur alte Methoden verbesser oder angepasst, sondern auch einiges Neues eingebaut. Beispielsweise können Methoden mit Bedingung nun auch mit einem delegate aufgerufen werden, dass die Elemente der Liste einschränkt.
Was mich im Moment noch an einem Release hindert, ist wiederrum eine weitere Funktionalität, mit der man Bedingungen angeben kann. Und zwar baue ich eine SQL-ähnliche Sprache ein, die vorerst jedoch nur auf Bedingungen beschränkt ist. Bis sie lauffähig ist, kann es gut noch eine Woche dauern, aber in spätestens zwei Wochen denke ich sollte ich eine Version fertigstellen können, die alle diese Features beinhaltet, besser strukturiert ist und vor allem dokumentiert. 😉
Bis dahin.
@Th69:
Danke für die Tipps. Werden sicher mal darauf zurückkommen. 😉
Hiermit ist vorerst die "Suchphase" abgeschlossen. Das Team bestehend aus MCHomer, Schmitzo, popartin und mir wird sich nun um die Planung und Umsetzung des Projektes kümmern.
Wenn es etwas vorzuzeigen gibt, werdet ihr es erfahren. 😉
verwendetes Datenbanksystem: Oracle 11
Tag zusammen,
und zwar versuche ich im Moment mit OracleClient auf einen Oracle-Server zuzugreifen. Funktioniert von meinem Rechner aus auch tadellos, allerdings von 64Bit Systemen gar nicht. Ich hab mich schon ein wenig schlau gemacht und anscheinend soll es eine 64-Bit-OracleClient Version geben in .NET 3.5 SP1, allerdings find ich da nichts. Das Umstellen des Zielprozessors bringt mir nur eine Warnung, dass OracleClient nicht dafür geeignet ist.
Weiß jemand weiter?
C# ... Anstoss 3 ... Nachfolger ... Bin dabei! 😉
Ne, im ernst. Würde mich sehr gerne an so einem Projekt beteiligen. Mir fehlt für bestimmte Bereiche noch die Erfahrung und gerade mit Grafiken hab ichs nicht so. Aber zusammen würde man das sicher hinkriegen. Allerdings finde ich die Opensource-idee nicht so brilliant, gerade wenn du sagst, dass ein späterer Verkauf in Frage kommt. Vorerst sollte alles Teamintern bleiben, dann kann immernoch entschieden werden, wenn mal eine spielbare Version fertig ist.
Also bin auf jeden Fall interessiert und mit mir kann geplant werden. Habe zwar nicht alzu oft Zeit, aber bin motiviert und plane auch gerne mit am Konzept.
Auch wenn es mit dem Problem nichts zu tun hat, möchte ich dich darauf hinweisen: Oledb (und Odbc) sind nur Notlösungen, wenn es wirklich nichts Besseres gibt. Für Oracle liefert NET bereits eine MS-Lösung in System.Data.OracleClient.dll und dem Namespace System.Data.OracleClient mit. Außerdem sind über
> Hinweise und Links auf spezialisierte, also viel :::
Danke für den Hinweis, werde denke ich mal jetzt wieder auf OracleClient rüberwechseln, hatte zuletzt noch Probleme damit, aber jetzt gehts.
Übrigends hätte es so einfach sein können: Man muss beim DataAdapter die Eigenschaft adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey setzen, dann werden auch Daten zum Primärschlüssel und der Länge übergeben.
Über den ersten Link habe ich es gefunden. Folgender Code bringt mich ans Ziel:
OleDbConnection oleConn = new OleDbConnection("<connection string here>");
string[] restrictions = new string[4] { null, null, null, null }; // should be able to filter tbl here, but isn't working
oleConn.Open();
// Get list of tables columns
DataTable dbRet = oleConn.GetSchema("Indexes", restrictions);
oleConn.Close();
if (dbRet == null || dbRet.Rows.Count == 0) return null;
DataRow[] rows = dbRet.Select("[TABLE_NAME]='" + tbl + "'");
if (rows == null || rows.Length == 0) return null;
return Convert.ToString(rows[0]["COLUMN_NAME"], ""); // just gets the first key column
Danke! 😉
Hallo,
und zwar suche ich eine Lösung, mit der ich aus einer Oracle-Datenbank gewisse Informationen einer Tabelle wie Constraints und den Primärschlüssel auslesen kann. Ich komme im Moment nur an die Spaltennamen, Typen, NotNull und den Defaultwert. Mir würden jetzt noch Angaben fehlen wie eine angegebene Länge z.B. bei Varchar2(20) und ob eine Spalte als Primärschlüssel fungiert. An den Primärschlüssel komme ich weder über DataTable.PrimaryKey noch über die Spalte "isKey" der Tabelle. Ich verzweifle an der ganzen Sache schon ein bisschen und würde mich über schnelle Hilfe sehr freuen. 😉
verwendetes Datenbanksystem: Oracle 10g Express Edition
cmd = new OleDbCommand("Select * from " + tableName, this.connection);
reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo);
DataTable dt = reader.GetSchemaTable();
foreach (DataRow row in dt.Rows)
{
if ((bool)row["isKey"])
{
table.PrimaryKey = (string)row["ColumnName"];
}
}
Ich weiß irgendwie nicht, wo mein Fehler ist. Habe jetzt den passenden ConnectionString von der Seite kopiert und der funktionierte direkt. Danke. 😉
Hallo zusammen,
und zwar habe ich die Express Edition auf meinem lokalen Rechner und möchte von VS05 drauf zugreifen. Mit OracleClient komm ich nicht drauf, weil er mir anzeigt, meine Version wäre zu niedrig -> stimmt nicht, habe 10.2.0.1.0. Mit OleDb schaff ichs auch nicht. Er schmeißt mir immer Fehler, weil ich nicht weiß, welchen Provider ich benutzen kann/sollte. Das ganze sollte möglichst ohne weitere Installationen gehen.
Kennt sich da jemand aus?
Das stimmt, aber da du schreibst ich werde "aber" meine Lösung weiter benutzten, schließe ich daraus das deine Lösung Vorteile hat. Lass uns an diesen Vorteilen teilhaben.
Der "Vorteil" besteht darin, dass sie schon eingebaut ist? Grundsätzlich war ja auch nicht die Frage nach einer Komplettlösung, sondern nach einem Weg, die Breite einer Registerkarte abzufragen. Dabei habt ihr mir geholfen und diese Hilfe habe ich in mein Programm einfließen lassen. Mehr steckt da nicht hinter und denke damit ists auch gut.
Ich habe eine eigene unvollständige Lösung, die bloß nicht korrekt feststellten konnte, auf welche Registerkarte geklickt wurde. Aufgrund der GetTabRect()-Methode kann ich das nun und somit ist sie lauffähig. An euren Lösungen gibt es nichts auszusetzen, aber das muss ja nicht heißen, dass ich unbedingt darauf zurückgreife.
Danke für die Lösungen. Werde aber meine eigene weiterbenutzen und nur auf "Rectangle rect = this.GetTabRect(i);" zurückgreifen. 😉
Nabend,
Situation: Ich habe ein TabControl, dessen TabPages ich gerne über einen Rechtsklick auf die Registerkarte schließen würde. Da allerdings die TabPages nicht über ein geeignetes Click-Event verfügen und die Breite der Registerkarten nicht über die TabPage abrufbar ist, komme ich nicht voran. Es gibt zwar die ItemSize-Eigenschaft des TabControls, allerdings passt sich diese nicht an das angezeigte Element an oder Ähnliches.
Ich bin wirklich gerade etwas aufgeschmissen und würde gerne um eine "aufwändige" Lösung wie das selbstzeichnen oder Verändern des TabControls herumkommen.
Bin für jede Hilfe dankbar.