Laden...
Avatar #avatar-1775.jpeg
norman_timo myCSharp.de - Member
Dipl.-Ing. (BA) Informationstechnik Wald-Michelbach (Odw) Dabei seit 13.07.2004 4.506 Beiträge
Benutzerbeschreibung

Forenbeiträge von norman_timo Ingesamt 4.506 Beiträge

12.02.2009 - 22:30 Uhr

Hallo liebe Community,

für einen Bekannten stelle ich gerade einen PC zusammen. Alles so weit kein Problem, außer einer Tatsache:

Er besitzt eine WinXP Pro 32 Bit Version, die er gerne weiterhin nutzen möchte.

Es gibt aktuell ja nur noch 64 Bit Prozessoren. Grundsätzlich hätte ich ja gesagt, gut nimmt man eben Vista, aber ich hab jetzt zum Ersten mal den Fall, dass keine (erschwinglichen) 32 Bit Prozessoren mehr verfügbar sind.

Hier also meine Fragen dazu:

  • Hab gelesen, dass es 2006 eine Umtauschaktion von Microsoft gab, wo man durch ein kleines Entgeld 32 Bit WinXP Pro auf 64 Bit umtauschen konnte. Die Webseite ist aber nicht mehr aktiv, weiß jemand ob es diese Aktion überhaupt noch gibt?
  • Habe gelesen, dass 64 Bit WinXP Pro alles andere als gut laufen soll, weil überhaupt keine Treiber funktionieren, im Netz ist aber hier nixhts Fundiertes zu finden (zumindest dort wo ich gesucht habe)
  • Läuft denn das WinXP Pro 32 Bit auf dem 64 Bit Prozessor, funktioniert das technisch überhaupt?

Der Rechner soll als primäres System Ubuntu bekommen, daher sieht mein Bekannter es nicht ein, ein neues Windows System kaufen zu "müssen", er möchte Windows eigentlich auch nur für seinen Sohn und wegen Spiele drauf machen.

Habt Ihr schon Erfahrungen damit gemacht?

Grüße
Norman-Timo

Edit: Titel auf erledigt gesetzt

12.02.2009 - 15:52 Uhr

Hallo J.D.,

wenn Du mal das Objekt "DateTime" genauer anschaust, dann wird Dir auffallen, dass es auch eine Funktion "AddDays" gibt. Diese ermöglicht Dir auch Minustage zu addieren.

Grüße
Norman-Timo

12.02.2009 - 09:26 Uhr

Hallo LaTino,

Ist leider nur eine Krücke, und bei knapp 100 solchen Stellen leider auch nicht praktikabel

Da hilft dann wirklich zurzeit nur ein VS-Addin. Darin hast Du Zugriff auf die Quelldateien, und das vor und nach dem Buildprozess. Weiterhin hast Du damit dann auch Zugriff auf die Projektdateien, welche klar erkennen lassen, welche Dateien betroffen wären.
Mit einem VS-Addin könnte man das Ganze dann auch schön automatisieren, ohne immer wieder eine Liste von betroffenen Dateien zu pflegen.

Grüße
Norman-Timo

P.S.: Wenn der Prophet halt net zum Berg will...

11.02.2009 - 16:25 Uhr

Hallo pogo,

Leite dir doch einfach deine Steuerelemente ab und überschreib die Standardfarben (wenn es denn das ist, was du möchtest).

Das ist in der Tat eine sehr starke Einschränkung eines Controls. Wenn ich ein Standardverhalten haben will Ok, aber wenn ich dann für irgendein Control in einem speziellen Fall dann kein Blau haben will, dann geht das mit Deiner Variante nicht mehr.

Also ich präferiere hier auch JAck30lena's Vorschlag einfach ein Set von Farben zu definieren und sich daraus zu bedienen.

(und ja es ist so aufwändig, so dass man das für jedes Control angeben muss)

Grüße
Norman-Timo

11.02.2009 - 16:16 Uhr

Hallo NoLimit,

Das Dataset und die Tables hab ich im Datasetdesigner (VS2008) erstellt. Sind diese dann nicht für das ganze Project verfügbar?

Das kann ich so jetzt gar nicht sagen, da ich diesen Designer nicht verwende. Ich weiß auch nicht, wie sich das Ding dann tatsächlich verhält, und ob es nur eine Instanz von dem DataSet gibt (sozusagen als Singleton), oder ob nicht immer wieder eine neue Instanz davon erzeugt wird.

Kann man das DataSet dann im Designer auf die Form ziehen? Wenn ja, dann schau Dir mal den vom Designer generierten Code an, da steht dann 100%ig so etwas in der Art (Name ist anzupassen) "... = new MyCustomDataSet()".

Da wäre die Alternative das DataSet auf der MainForm über den Designer instanziieren zu lassen, aber in der Unterform darfst Du das dann nicht mehr tun, sondern musst das DataSet aus der MainForm direkt an das Unterform übergeben.

Grüße
Norman-Timo

11.02.2009 - 15:55 Uhr

Hallo NoLimit,

aha, das ist aber in der Tat ein ganz anderes Problem. Hier solltest Du aus der Main Form heraus ein DataSet bereitstellen, was Du der Unterform mitgibst. Diese Form befüllt dann mit Deinem bisherigen Code die Daten.

Sobald das Unterfenster dann wieder schließt, sollte die MainForm die aktuellen Daten haben.

Was ich nun nicht so ganz verstehe ist das mit dem Doppelklick auf eine Reihe und was soll dann in der Main passieren?

Grüße
Norman-Timo

P.S. Vorsichtshalber: [FAQ] Kommunikation von 2 Forms

11.02.2009 - 15:36 Uhr

Hallo NoLimit,

hast Du das DataSet/DataTable an das DataGridView gebunden? Dann ist das ein Wenig komplizierter 😉

Wenn gebunden:

  • Vor der aktualisierung Bindung aufheben
  • DataSet aktualisieren lassen
  • Erneut mit dem DataSet binden
  • (falls noch notwendig) Anzeige erneuern

Wenn nicht, dann wüsste ich nicht, warum Änderungen verworfen werden sollten.

Grüße
Norman-Timo

11.02.2009 - 15:33 Uhr

Hallo smilingbandit,

und wenn Du eine StoredProcedure dafür schreibst? Oder die Werte direkt berechnen lässt (Min/Max)?

Grüße
Norman-Timo

11.02.2009 - 14:32 Uhr

Hallo smilingbandit,

ich bin mit den Reporting Services nun nicht vertraut, aber allgemein gesprochen könnte ich folgenden Vorschlag machen:

Warum möchtest Du ein "Insert Into" realisieren. Könntest Du nicht einfach auch 2 SELECTs in einer Abfrage zusammenfassen entweder mit JOIN oder UNION?

Sehr einfaches (nicht direkt zusammenhängendes) Beispiel:


SELECT Name, Vorname, 5 FROM Benutzer;

liefert mir auch:
* Müller Hans 5
* Siegfrid Franz 5
* ...

Jetzt kannst Du die 5 auch mit einem weiteren Subselect füllen lassen (also die Koordinaten Deiner zusätzlichen Linie).

Oder habe ich da was falsch verstanden?

Grüße
Norman-Timo

11.02.2009 - 14:09 Uhr

Hallo punkdevil,

danach aber auch unbedingt den Schreibschutz wieder reinnehmen, und überprüfen, ob die Änderungen (wenn auch nicht so wichtig) auch übermittelt und eingecheckt wurden.

Wenns aber wirklich nur um die Unterdrückung der Warnmeldung geht, dann ist der Stand in SourceSafe in diesem einen Fall für die XML-Kommentierung aber auch unwichtig 😉

Grüße
Norman-Timo

11.02.2009 - 13:00 Uhr

Hallo punkdevil,

verwendest Du TFS? Dann würde nur die Möglichkeit bleiben ein VS-Addin zu schreiben, das vor dem Build Vorgang das ganze macht. Das wird allerdings schon ein wenig aufwändiger.

Oder Du bringst dem Tool bei, dass es die Datei auscheckt, Modifikationen vornimmt und danach wieder eincheckt.

Oder verwendest Du ein ganz anderes Versionierungsprogramm? -> Dann ist dort Dein Problem zu suchen, oder es würde eventuell reichen den Schreibschutz zu entfernen, und die Modifikationen vorzunehmen (hängt aber vom Versionsverwaltungsprogramm ab!).

Grüße
Norman-Timo

11.02.2009 - 11:23 Uhr

Hallo zusammen,

also ich würde mir ein kleines Tool schreiben, das im Prä-Build Prozess angeschmissen wird und im generierten Quellcode die fehlenden XML Kommentare einfügt (ich gehe mal davon aus, dass das relativ fix ist).

Grüße
Norman-Timo

11.02.2009 - 11:19 Uhr

Hallo NoLimit,

ja, Du solltest noch zusätzlich XML-Schemas verwenden, dann funktioniert es so:
XML Childnodes auslesen

Grüße
Norman-Timo

11.02.2009 - 09:07 Uhr

Hallo zusammen,

Besteht die Möglichkeit, per C# eine Mail an eine IP-Adresse zu senden?

Wenn damit die IP-Adresse des E-Mail Providers gemeint ist (z.B. Web.de oder T-Online etc). dann ja. Wenn damit die IP-Adresse des E-Mail-Empfängers gemeint ist, dann nein.

Aber selbst wenn der Provider gemeint ist, warum sollte man das per IP-Adresse tun? Große E-Mail-Provider besitzen mehrere E-Mail SMTP Server, jeweils mit eigener IP. Ein verwenden der SMTP-Adresse wird über DNS aufgelöst und eventuell durch einen LoadBalancer an mehrere Server verteilt.

Also ich würde E-Mails über IP-Adresse nur dann versenden, wenn das mein eigener SMTP Server wäre und ich wüsste, dass auch nur dieser angesprochen werden sollte. In allen anderen Fällen würde ich definitiv den SMTP-Namen verwenden (was passiert auch bei Serverumzug, dann müsste ja jedesmal die IP-Adresse mit angepasst werden).

Grüße
Norman-Timo

10.02.2009 - 16:48 Uhr

Hallo Key,

Struct und Ref sind 2 Sachen, die man nur benutzen sollte, wenn man ganz genau weiss, was man tut.

Das ist das was ich vage vermutet habe. Habe bisher von vernherein diese Kombination vermieden, daher habe ich diesbezüglich noch keine Negativerfahrungen damit gemacht. Aber das ist das erste was mir ins Auge gesprungen ist.

Da FZelle das auch in seinem Augenmerk hat, würde ich doch ersteinmal versuchen das Ganze ohne "Ref" und eventuell mit Klassen zu probieren.

Hab mich nur nicht getraut das so direkt zu formulieren.

Grüße
Norman-Timo

10.02.2009 - 14:14 Uhr

Hallo Key,

dann versuche doch mal so etwas in der Art:


public bool WriteXMLProtokoll1(ref STRUCT_DB701 refDB)
{
   string Path = m_Protokoll1 + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fffffff") + ".xml";
   using (XmlWriter writer = XmlWriter.Create(Path, settings))
   {
      writer.WriteStartElement("DOCUMENT");
      writer.WriteStartElement("HEADER");
      writer.WriteElementString("WERT1", "Dummy");
      writer.WriteEndElement();
      writer.WriteEndElement();
   }
}

Auch wahlweise mit und ohne "Close" mal ausprobieren.
Resultiert das mit dem selben Ergebnis?

Grüße
Norman-Timo

10.02.2009 - 14:06 Uhr

Hallo Peter Bucher,

Wie meinst du das jetzt genau?
Das ist in vielen Fällen ja gar nicht möglich, ausser man bildet wieder Redundanz.

Naja ich meine, wenn man es auf die Spitze treiben möchte, und wenn man die Annahme treffen möchte, dass ich durch einen Methodenaufruf einen Performanceverlust erleide, dann müsste ich alles in die Methode Main schreiben, und dürfte die Logik nicht in mehrere Methoden bauen.

Und ich wollte nur ausdrücken, dass wir alle das natürlich nicht tun, und sehr wohl eine Aufteilung in Methoden machen. -Nicht mehr und nicht weniger- wollte ich damit sagen.

Grüße
Norman-Timo

10.02.2009 - 12:40 Uhr

Hallo Golo Roden,

ich kann hier auch keine Zahlen vorlegen, aber ich würde vermuten, dass das allokieren von Speicherbereichen den größten Teil vom "Objekt erzeugen" ausmacht. Ob dann ein Konstruktor oder mehrere durchlaufen werden, spielt wahrscheinlich keine große Rolle.

-> Man könnte das sinngemäß auch auf Überladungen allgemein ausweiten, dort ist ja das selbe Szenario anzutreffen. Der Übersicht halber macht man hier lieber auch eine eigenständige Methode, anstatt alles in einer zu Programmieren 😉

Grüße
Norman-Timo

10.02.2009 - 11:59 Uhr

Hallo Key,

mir fällt nach dem ersten Anschauen nichts relevantes auf. Ich glaube aber nicht, dass der XmlWriter das roblem sein sollte, dieser wird mit "using" verwendet, so wird auch sicher ein "Dispose" dafür aufgerufen, und das sollte der Speicher frei halten.

Ich habe aber eine Frage:
Warum übergibst Du die Struktur "byRef"? Könntest Du nicht einfach auch ohne "ref" arbeiten?

Versuche mal die Methode aufzurufen, aber den Inhalt zu minimieren:

public bool WriteXMLProtokoll1(ref STRUCT_DB701 refDB)
{
   // aktuelles Sendedatum mit Zeit z.B. 06.11.2008 10:01:01
   System.Diagnostics.Debug.WriteLine("SENDETERMIN", DateTime.Now.ToString());
   // Benennung
   System.Diagnostics.Debug.WriteLine("BENENNUNG", refDB.BENENNUNG);
   //Werte
   System.Diagnostics.Debug.WriteLine("WERT1", refDB.Wert1);
   System.Diagnostics.Debug.WriteLine("WERT2", refDB.Wert2);
   System.Diagnostics.Debug.WriteLine("WERT3", refDB.Wert3);
   System.Diagnostics.Debug.WriteLine("WERT4", refDB.Wert4);
   System.Diagnostics.Debug.WriteLine("WERT5", refDB.Wert5);

   return true;
}

Und danach das gleiche auch mal ohne das "ref" Schlüsselwort. Was passiert dann mit dem Speicherproblem?

Grüße
Norman-Timo

10.02.2009 - 11:45 Uhr

Hallo zokzok,

Der Maximalwert der TRACEDaten beträgt mit Zeitindex ca. 12000 Werte (4000/Spalte). Ich kann nicht beurteilen, ob das viel ist. Für eine Datenbank vermutlich nicht, für ein Array wahrscheinlich schon.

Würde ich jetzt für grenzwertig betrachten. Das lässt sich auch nicht immer eindeutig beantworten. Ich bin da eher ein Freund, lieber für WorstCase planen (also DB), denn für die ist die Datenmenge noch lange kein Problem 😉

Datenbank fällt wohl flach, weil ich dann garantieren muss, dass diese auch auf anderen Rechnern installiert ist, oder ist diese Funktion dann schon im .Net-Framework installiert?

Die Datenbank selbst ist im Framework nicht enthalten. Es sind aber alle Zugriffsmöglichkeiten vorhanden. Dann muss die Datenbank nur EINMAL für ein (logisches) Netzwerk installiert sein. Also so lange ich im Netzwerk den Rechner erreichen kann, auf dem die DB läuft, so lange brauche ich auch nur die eine DB.

Ob nun DB oder DataSet, das musst Du letztendlich entscheiden.

Grüße
Norman-Timo

09.02.2009 - 15:23 Uhr

Hallo LaTino,

Ob der Datenzugriff schneller wird, wenn man sie vorher aus der CSV in eine Datenbank schreibt und dann in ein DataSet liest, statt sie zu lesen und im Speicher zu halten?

Wahrscheinlich nicht, aber mir geht es darum, dass der SQL Server gerade was mathematische Funktionen angeht doch ein paar nette Features anbietet, und der ist verdammt schnell wenns um Sortierung oder Extrahieren etc geht 😁

Also die Entscheidung, dass DB war bei mir nur wegen der Einfachheit halber und der Bequemlichkeit halber getroffen 😉

Grüße
Norman-Timo

09.02.2009 - 15:13 Uhr

Hallo zokzok,

wenn die Datenmenge nicht zu groß ist, dann würde ich Dir empfehlen, die Werte nicht in ein Array zu packen, sondern z.B. ein DataSet zu nehmen. Oder noch besser eine kostenloase Express Datenbank (das wäre das bequemste).

Mittels dem DataSet lassen sich dann analog zur Datenbank auch Funktionen zeilenbasiert ausführen.

Für die Berechnungen (z.B. Wendepunkte) ist mir auch keine .Net Bibliothek bekannt, aber das ist sicherlich überhaupt nicht kompliziert das selbst in einer Funktion zu implementieren 😉

Für die Zuordnung der Berechnungsergebnisse zu den Eingangsdaten: Hier wäre es ganz dringend empfehlenswert ein DataSet oder eine Datenbank zu verwenden. Dort kann man nämlich zusätzliche Spalten generieren, und diese mit den Berechnungsergebnissen auffüllen lassen. Auch eine Sortierung oder eine Suche wird wesentlich komfortabler zu tätigen sein.

Deshalb mein Rat:
Nimm SQL Server Express, kostenlos und genau für solche Anwendungen konzipiert.

Grüße
Norman-Timo

06.02.2009 - 11:42 Uhr

Hallo landau66,

für eine eigene Collection Klasse, schau mal hier:
Microsoft - How to implement a custom Collection with C#

oder alternativ hier:
CodeProject - Generics and Custom Collection (hier aber unbedingt die wenigen Kommentare auch lesen)

Grüße
Norman-Timo

06.02.2009 - 10:20 Uhr

Hallo landau66,

Oder sollte ich besser eine Struct oder Klasse kreieren, die diese Daten aufnehmen kann?

Kurz und schmerzlos: Ja.

Wenns wirklich performancekritisch ist (mehrere Tausend Daten), dann ein Struct, ansonsten eine Klasse.

Dann am Besten nicht mit klassischen Array's arbeiten, vielleicht auch hier eine eigene Collection-Klasse verwenden (oder Listen/Dictionaries).

Grüße
Norman-Timo

06.02.2009 - 08:51 Uhr

Hallo Slaya23,

sonst kann ich Datei nicht mehr mit meinem DataSet einlesen.

Wenn Du anschließend die XML Datei in ein DataSet einlesen möchtest, dann empfehle ich Dir nicht die XML Datei auf diese Art und Weise zu erzeugen, wie Du es gepostet hast.

Einfacher ist es, Du verwendest gleich ein DataSet und lässt dieses dann die Daten in XML-Form in eine Datei wegschreiben. Siehe hierzu auch hier:
XML Childnodes auslesen

Du solltest in diesem Fall auch unbedingt XML Schemas Dir verinnerlichen, die machen Dir das Leben hier deutlich einfacher.

Grüße
Norman-Timo

05.02.2009 - 11:44 Uhr

Hallo spike24,

so hatte ich es zumindest gemeint (umgangssprachlich verwende ich bei Deinem Code "das DataSet ist 'gelockt'", das kann man aber auch falsch verstehen).

Danke für die Präzesierung, falls meine Aussage missverständlich war.

Grüße
Norman-Timo

05.02.2009 - 11:25 Uhr

Hallo c-killer,

wenn Du wirklich sicher gehen willst (was ich mal vermute), dann mache ein "lock" bei JEDEM Aufruf und JEDER Datenmanipulation, dann hast Du eine vollständige Synchronisierung der Daten für das DataSet und der darinligenden Daten.

Vermutung: Wenn Du "nur" auf das DataSet ein Lock machst, aber an anderen Stellen Du (z.B. in einer Klassenvariablen) die Referenz auf ein DataTable innerhalb des DataSets hälst, dann würde ich vermuten, dass die DataTable nicht "gelockt" ist. Begründung (warum ich zu dieser Vermutung komme). Das DataSet lockst Du. Damit wäre das Objekt "DataSet" mit einer Referenz xyz gelockt. DataTables sind aber wiederum Referenzen, die woanders im Speicher gehalten werden. Sollten sich darin Daten verändern, so betrifft das nicht die Referenz des DataSets. (Nochmal: Vermutung!)

Wenn Du Gewissheit haben willst, dann mach doch schnell eine TestKonsolenanwendung mit 2 Threads, während das DataSet im ersten Thread gelockt wird, dann der erste Thread für ne Minute schlafengelegt, und versucht mit dem 2. Thread dann Daten zu manipulieren/einzufügen. Das Ganze dann mit Debug/Trace Ausgaben, dann weisst Du in welcher Reihenfolge was passiert, und ob das "locken" des DataSets ausreicht, oder nicht. (geschätzte Aufwandszeit ca. 15 Minuten maximal).

Grüße
Norman-Timo

P.S: Beim Locken aber schön auf DeadLocks aufpassen, gelle 😉

02.02.2009 - 16:46 Uhr

Hallo DaMoe80,

Hier habe ich eine Gegenfrage: Interessieren sich nicht gerade Fachleute für ein spezielles Wissen? Ist denn das nicht gerade interssant für ein Unternehmen zu wissen, wie sein Konkurrent bestimmte Daten auswertet? Warum der Konkurrent bspw. seine Daten in 2h anstatt selber die gleichen Daten in 5h auswertet?

Naja, ich denke, wenn meine Auswertung nur 2h braucht, und die der Konkurrenz 5h, dann muss ich an der Fähigkeit des Entwicklerteams zweifeln. Da ist wirklich die Frage, ob ein Codereview (des eigenen kommentierten Codes) und das Entwicklen von Performanceverbesserungen durch Profiler nicht billiger ist, als fremden (unkommentierten) Code zu analysieren und so umzubiegen, dass er auf meinen Code passt.

Ich denke gerade, dass Konkurrenten gerne auf Software bzw. die Business Logik schauen.

Das mag sein. Aber die Analyse, wie nun die BL des fremden Codes aussieht, und dann noch das Umstricken der eigenen, so dass die fremde Logik auch in den eigenen Quellcode passt ist ein (zu) hoher Auffwand, so dass sich das rentieren könnte. Meist ist es auch absichtlich gewollt, dass man es anders als die Konkurrenz macht, denn viele Wege führen nach Rom, und Unterscheidungsmerkmale machen gegenüber dem freien Markt die Würze im Konkurrenzleben.

auch wenn du einen besonderen algorithmus versteckst, der etwas besonders gut kann und für die konkurenz interessant wäre (sowas ist mir bislang ncoh nicht untergekommen, da alles keine magie ist....), muss der konkurent diesen erstmal finden. das bedeutet, er muss ihn nciht nur lokalisieren sondern auch als solchen erkennen und das ist die wahre kunst dabei. ohne dokumentation ist man so auf verlorenem posten und da ist es billiger zu reimplementieren als zu analysieren und ggf. zu kopieren.

So sehe ich das auch.

Grüße
Norman-Timo

02.02.2009 - 10:36 Uhr

Hallo BAUHAUS,

mal davon abgesehen, dass der Code den ich aktuell produziere in einer sehr dedizierten Umgebung läuft, kann ich von meiner Erfahrung her nur sagen:

Bisher wurde dieses Thema bei jedem Arbeitgeber angesprochen. Jeder hat zunächst einmal schockiert reagiert. Aber das andere ist, was ist der Aufwand und was ist der Nutzen davon, dass man seinen Quellcode unzugänglich macht.

In fast allen Projekten, in denen ich bisher tätig war, war jedes Mal Fachwissen gefragt, welches mit in den Quellcode geflossen ist. Wenn man dieses Fachwissen nicht besitzt, dann kann man zwar den Quellcode sich aneignen, jedoch wird man nicht richtig schlau draus, warum das so oder anders gelöst worden ist.

Die meiste Software ist für die Konkurrenz (die auch eigene Software hat) oder für den Kunden (Endanwender) völlig uninteressant. Der Endanwender möchte dass seine Software funktioniert und die Konkurrenz kann sowieso nicht das gesamte Projekt umschmeissen, nur weil es ähnlichen Softwarequelltext vorfindet (der nur eventuell besser meist nur anders ist).

Daher würd ich sagen, dass es sich einfach nicht rentiert hier Mühe und Not reinzustecken, auch noch den Quellcode schützen zu wollen. Wahre Cracker und Hacker gehen sowieso auf Assembler runter, und da kann man KEINE Software vor irgendwas schützen.

Grüße
Norman-Timo

29.01.2009 - 09:08 Uhr

Hallo vollmond,

warum verlagerst Du diese Art nicht in C# Code, hier kannst Du ein DataSet halten, das Ergebnis Deiner SP dort zwischenspeichern und individuell reagieren/verarbeiten.

Es gibt auch die Möglichkeit eine Funktion zu schreiben und diese in MS SQL Server 2005 als StoredProcedures ausführen zu lassen, als letzte Alternative, wenn Du es unbedingt in der Datenbank haben willst.

Mir ist immer noch nicht klar, was Dein eigentliches Ziel ist?

Grüße
Norman-Timo

29.01.2009 - 08:55 Uhr

Hallo Lion1984,

interessant, hab ich noch nie gesehen. Ist das wirklich die Original-Ereignisanzeige von Windows?

Grüße
Norman-Timo

29.01.2009 - 08:37 Uhr

Hallo LaTino,

danke für Deinen Test, sohab auch ich etwas dazu gelernt, so oft verwende ich WebServices dann auch nicht.

Was ebenfalls interessant sein sollte:
WebService rückgabe Daten mit Funktion

Ich war der Überzeugung, dass DataSets zu den komplexen Objekttypen gehören, die nicht über WebServices übertragen werden könnten.

Grüße
Norman-Timo

28.01.2009 - 16:30 Uhr

Hallo vollmond,

was mir hierzu aber einfällt:

ich will ein StoredProcedure in C# erstellt und auf dem SQL Server Deployt

Ich gehe davon aus, dass Du "habe" anstatt "willst" gemeint hast.

-> Du kannst ja innerhalb Deiner SP schon temporäre Tabellen verwenden, und Du kannst den Inhalt dann auch per Result an den Aufrufer der SP übermitteln, reicht das denn dann nicht?

Grüße
Norman-Timo

28.01.2009 - 16:27 Uhr

Hallo Jelly,

Datatables können jedenfalls nicht von Webservices zurückgegeben werden

Das ist allerdings wiederum richtig, dennoch können DataSets serialisiert werden. Das sind 2 paar Schuhe.

Warum das bei WebServices nicht geht, liegt vereinfacht gesprochen daran, weil ein gültiges WSDL Dokument dem WebService zugrunde liegen muss. Auch alleine wg. der Plattformunabhängigkeit, so dass auch ein Linux-Client mittels Java einen C# WebService aufrufen kann. -> Ein DataSet ist halt nur innerhalb von .Net gültig 😉

Grüße
Norman-Timo

28.01.2009 - 16:22 Uhr

Hallo vollmond,

wie erstellet man ein SQL #TempTable in C# und wie lange Gültig?

puh, wie sage ich's meinen Kindern 😉

Es geht einfach nicht. Eine temporäre Tabelle wie es mittels SQL Server 2005 innerhalb von SP angeboten wird, kann nicht außerhalb davon verwendet werden (eventuell geht das noch bei Triggern, weiß ich aber nicht).

Ich frage mich gerade, warum es überhaupt sinnvoll sein könnte aus C# heraus solch eine temporäre Tabelle anlegen zu können, was versprichst Du Dir damit, oder was möchtest Du denn erreichen?

Grüße
Norman-Timo

28.01.2009 - 15:50 Uhr

Hallo mosspower,

naja, wenn das mit Replace etc. einfach nicht funktioniert, und /r/r/n zu Verzwickungen führt, dann baue Dir doch ein eigenes ReadLine(), bei mir Entwicklungszeit 5 Minuten:


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace TestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            using (StreamReader myFile = new StreamReader(@"C:\Dokumente und Einstellungen\[BenutzerAusgeblendet]\Desktop\Wtf.txt"))
            {
                while (myFile.Peek() >= 0)
                {
                    Console.WriteLine(ReadSpecialStreamLine(myFile));
                }
            }

            Console.WriteLine("Press Key!");
            Console.ReadKey();
        }

        private static String ReadSpecialStreamLine(StreamReader p_Stream)
        {
            char tmpByte;

            StringBuilder sb = new StringBuilder();
            while (p_Stream.Peek() >= 0)
            {
                tmpByte = (char)p_Stream.Read();
                if (tmpByte == '\r' && p_Stream.Peek() == '\r')
                {
                    p_Stream.Read();
                }

                sb.Append(tmpByte);
            }

            return sb.ToString();
        }

    }
}

Damit wird Deine Datei wie gewünscht angezeigt.

Grüße
Norman-Timo

28.01.2009 - 15:31 Uhr

Hallo s0h0,

Ach was... ihr seit ja soooo Erwachsen.

da ich mich hierbei auch angesprochen fühle...

Ich bin wenigstens in einer Richtung erwachsen:
Ich erkenne Situatuationen in der Art und Weise, dass ich in aller Regel weiß, wann man ersnst werden sollte. Es gibt durchaus auch Situationen, wo ich mich extrem kindisch benehme, dafür bin ich Mann & IT'ler & einfach zu gut gelaunt.

Aber selbst wenn ich in meiner kindischen Phase bin, so denke ich zu wissen, in welchem Spektrum mein Handeln sich bewegt. Wenn ich mit der Handbremse um die Kurve fahre, so nehme ich auch die Konsequenz hin, wenn ich dann ins Schleudern komme und eventuell mein Auto gegen den Bordstein knallt. Aber ich würde z.B. NIE die Handbremse benutzen, wenn ich wüsste, dass ich andere damit gefährde.

Was will ich damit sagen: Beim erwachsen werden, lernt man einfach immer die Tragweite des Handelns zu beurteilen, nicht, dass man überhaupt keinen Unsinn mehr betreibt. Und ganz wichtig finde ich, dass es dazu gehört seinen egozentrischen Horizont zu verlassen, und einem bewusst werden zu lassen in wie weit mein Handeln andere beinflusst.

Grüße
Norman-Timo

28.01.2009 - 14:39 Uhr

Hallo vollmond,

aber es muss irgendwie leichter gehen.

jo mein Gott 😉

-> Also .NET Bordmittel, das geht net. Selbst Ado.NET geht immer von einer anderen Richtung aus. Es liest die Tabellenstruktur der DB und übersetzt diese in das DataSet/DataTable.

Wenn Du also den umgekehrten Weg haben willst, dann bleibt Dir nur die Möglichkeit, das händisch zu lösen. Da würde ich mir eine eigene Klasse schreiben, die Dir automatisch aus einem Dataset die DataTables ausliest, dort dann die Spalten(typen) durchgeht und aus diesen Informationen dann einen "Create Table" SQL Befehl generiert.

Das macht man dann einmal, und mit Hilfe dieser Klasse kann man dann alle DataSets/DataTables übersetzen lassen.

Eine andere (leichtere) Möglichkeit sehe ich nicht. Schneller geht es eventuell nur, wenn Du im Netz schon eine fertige Implementierung findest. z.B. Codeproject oder dergleichen.

Grüße
Norman-Timo

P.S.: Falls Du Dir selbst die Mühe machst, dann kannst Du das Ergebnis ggf. als Snippet Komponente hier im Forum veröffentlichen (Falls Du darfst/willst).

28.01.2009 - 14:31 Uhr

Hallo Xynratron,

bringt es etwas das "RaiseError" in eine StoredProc auszulagern? Ich kann mir gut vorstellen, dass der SQL Server dann den Trigger getrennt von der SP behandelt, ist aber eine reine Vermutung.

Grüße
Norman-Timo

28.01.2009 - 14:18 Uhr

Hallo brainwave,

dann vermute ich mal ganz stark, dass Windows hier andere regionale Settings eingestellt hat. Die Kommawerte von CSV Dateien sind zwar klar auf "." (Punkt) geregelt, weil Komma ja für Datentrennung vorgesehen ist, jedoch Excel interpretiert es dann mit "3.2" anstatt "3,2".

Das wirst Du so einfach nicht aufgefrickelt bekommen. Hier hilft nur, dass Du selbst die CSV einliest, alle Werte, die einen "." enthalten besonders behandelst, und diese manuell mit differenziertem Format in Excel übergibst.

Genau das gleiche Problem hatte ich beim SQL Server 2005, der selbst Daten in CSV exportiert hatte und nicht in der Lage war die unmodifizierten Daten wieder zu importieren.

Das ist eine große Schwäche von CSV, mit der Du leben musst.

-> Also alles manuell, sorry, wenn es hier kein Allerheilmittel für gibt.

Grüße
Norman-Timo

Edit:

da Excel in der Zelle jetzt "03.02.2009" drin stehen hat und er den Ursprungswert ja nicht mehr kennt "3.2".

Das ist so nicht korrekt, eine Formatsumstellung verändert NICHTS an den Daten, daher kennt Excel nur das, was man ihm auch zu anfangs gibt.

28.01.2009 - 14:14 Uhr

Hallo pkoeppe,

ich würde auch nach der Art und Weise, wie die DLL eingebunden ist unterscheiden:

Es meiner Meinung nach 3 Unterscheidungskriterien:

* Statisch (direkte) <--> dynamische Referenzierung
* CopyToLocal = True <--> = False
* FixVersion = True <--> = False

Je nach diesen Kriterien ist ein Neuerstellen der eigenen Assembly vonnöten, und da ist es dann empfehlenswert, falls Neukompilierung, dann auch Versionsnummer erhöhen.

Grüße
Norman-Timo

28.01.2009 - 14:10 Uhr

Hallo mosspower,

eventuell hilft es auch, wenn Du vor dem Einlesen ein Ersetzen vornimmst, das "\r\r" zu "\r" ersetzt?

Grüße
Norman-Timo

28.01.2009 - 14:07 Uhr

Hallo brainwave,

Ich hätte mir ein Property gewünscht, um dieses Verhalten abzustellen bzw. Excel
mitzuteilen, dass er alles als String also Text betrachten soll.

ich denke das ist kein Problem (auch wenn ich es nicht konkret weiß, weil ich mit Office Automation noch nicht sehr viel am Hut hatte), das ganze Excel-Blatt mit "einem" Befehl umzuformatieren.

Ich habe auf die schnelle nur Folgendes gefunden:
Bytes.com - change cell format

und es gibt die Möglichkeit eine Range festzulegen, für die eine Formatangabe gemacht werden kann. Siehe hierzu:
MSDN - How to automate Excel

Grüße
Norman-Timo

28.01.2009 - 13:55 Uhr

Hallo nochmal,

ja irgendwie machts doch der Kontext lustig, und nicht der Text 😉

Grüße
Norman-Timo

Edit:
Wobei GMLOD's gezeigte Bilder hier im Thread noch ein Niveau zeigen, mit dem ich mich anfreunden könnte, aber andere Bilder (nicht von GMLOD) sind da einfach nur bescheuert (meine pers. Meinung).

28.01.2009 - 13:53 Uhr

Hallo radix,

um den typ festzulegen aber sowas find ich in keinsterweise für die category.

Um die Kategorie anzugeben, musst Du die Nicht-statischen Überladungen zu EventLog.WriteEntry verwenden, im speziellen dann z.b. folgende Überladung:
MSDN - EventLog.WriteEntry (spez. Überladung)
Im Beispiel der MSDN findest Du auch ein konkretes Beispiel (nach unten scrollen).

Aber die Kategorie ist eine positive Integer-Ganzzahl, ich weiß nicht, ob das an der Übersicht im Ereignisprotokoll eine Verbesserung bringt?

Grüße
Norman-Timo

28.01.2009 - 13:39 Uhr

Hallo zusammen,

ich bin mir nicht sicher, ob das überhaupt hilft, weil ich nicht ganz verstanden habe, was der Zweck des Ganzen sein soll.

Wenn es aber nur darum geht, dass Sessions mit Hilfe von WebRequest und Co. verwaltet werden, so ist das dann möglich, wenn man SessionContainer mit in die Ganze Schose einbaut.

Für WebServices habe ich hier mal eine Helferklasse gebaut, jedoch weiß ich nicht, ob diese Helferklasse auch auf herkömmliche WebRequests sich umbiegen lässt:
Immer neue Objektinstanz auf WebService?

Grüße
Norman-Timo

P.S.: Meist ist das Problem, dass man denkt, man wäre auf dem richtigen Weg zum Ziel, weil man denkt "das müsste funktionieren", aber eventuell vergisst man, dass man hier die "legalen" Wege verlässt. Deshalb: Ich unterstelle auch niemanden direkt Böswilliges 😉

28.01.2009 - 13:20 Uhr

Hallo brainwave,

das ist Excel Standardverhalten. Wenn man es Standalone bedient (also das Excel Programm bedient), dann muss man hergehen und die Formatierung der einzelnen Zellen (oder komplette Spalte(n)/Zeile(n)) verändern, damit die Interpretation von Excel umgangen wird.

Problem bei CSV ist halt, dass darin keine explizite Formatangben enthalten sind, deshalb muss man nachträglich diese Angaben tätigen.

Wie man das nun programmatisch tun kann weiß ich nicht, aber in diese Richtung musst Du gehen.

Grüße
Norman-Timo

28.01.2009 - 13:16 Uhr

Hallo zusammen,

ich bin irgendwie beruhigt 😁

Ich erkenne also an, dass das keinen tieferen Sinn haben muss, und dass das nicht jedermanns Sache ist, und dass das nicht alle komisch finden.

Es ist also ein Zeitvertreib für den bestimmten Nutzerkreis, so wie andere z.B. Computerspielen nicht als "sinnvolle" Freizeitbeschäftigung sehen.

Ich danke allen, die mich erleuchtet haben 😉

Grüße
Norman-Timo

P.S.: Ich hab selbst 2 Katzen zu Hause, und ich finde das in Real-Life viel witziger 😉)

28.01.2009 - 13:07 Uhr

Hallo tkrasinger,

eventuell wird es deutlich schneller, wenn Du die ganze Update-Aktion in eine ranghohen Transaktion packst, die dann auch die ganze Tabelle für andere Aktionen sperrt.

Wenn Du nämlich immer wieder einzelne Update-Befehle feuerst packt der SQL Server das in einzelne Transaktionen, die jedes mal für einen Updatevorgang gelten -> Performanceverlust.

Grüße
Norman-Timo

28.01.2009 - 13:01 Uhr

Hallo azatoth,

es sei denn ich würde das ToolStripButton-Control ableiten und die entsprechenden Basis-Events überschreiben. Meintest du das so oder hast du an eine elegantere Lösung gedacht?

Du hast Recht, aber das wäre meiner Ansicht nach "die elegante" Lösung. Mit eigenen ToolStrip-Buttons könnte man sich auch das Errechnen des Buttons sparen, da ja jeder Button für sich selbst reagiert.

Es ist ja wirklich kein großer Aufwand von ToolStripButton abzuleiten und diesen zu benutzen, Du überschreibst ja nur eine/zwei Funktionalitäten, der Rest erledigt ja dann die schon vorhandene Basisklasse.

Grüße
Norman-Timo