Laden...

Forenbeiträge von kom2006 Ingesamt 110 Beiträge

20.10.2014 - 14:51 Uhr

Was Du noch nicht geschrieben hast, bzw. ich überlesen habe: Soll das eine Single- oder Multiuseranwendung werden?

Du schreibst zwar von "User", das können x Einzelplatzuser aber auch y Multiuser sein.

Das ist aber grundsätzlich wieder so eine typische Kundenanforderung aus einer der beiden Kategorien "Darf nichts kosten" oder "Darf aber keiner wissen" 😉

04.12.2013 - 11:41 Uhr

Sorry, wenn ich nochmal (dumm) nachfrage.

Ich habe meine aktuelle Anwendung mit diversen Klassen. Das Auslagern der BL in eine weitere Klasse ist kein Problem. Aber wie gestalte ich den WCF Service, damit dieser ebenfalls auf die Klasse zugreifen kann?

Aktuell lagere ich meine WCF-Servicefunktionen immer in separaten DLLs aus, die ich dann entweder in einer Konsolenanwendung zum Testen oder in einem Windows Service für die Produktion hoste.

Verstehe ich es richtig, dass ich in diesem Fall den WCF-Service (also die Klassen) direkt in die Anwendung integrieren muss, damit diese überhaupt die BL, zum Beispiel als statische Funktion, sehen können?

25.11.2013 - 18:42 Uhr

Naja, ich wollte die Anwendung nicht komplett umschreiben, sondern nur für einen Kunden erweitern 😉

25.11.2013 - 15:49 Uhr

Hallo zusammen,

ich habe eine fertig Winforms-Awendung zu der mich ein Kunde gebeten hat, eine für ihn remote steuerbare Version zu erstellen.

Remote steuerbar bedeutet, dass die Anwendung auf einem Rechner läuft und bestimmte Funktionen (mit Parametern) aus der Anwendung remote angestossen und die Ergebnisse dann an einen Webservice übergeben werden. Das Übergeben der Ergebnisse an Webservices ist unproblematisch.

Aktuell bin ich nur (aber ganz gut) mit WCF-Services vertraut und da in der Erstellung und Nutzung von Windows-**Services **- in eine Winforms-Anwendung habe ich noch nie einen WCF-Service integriert.

Ich weiss, dass ich diesen dort auch hosten kann, allerdings läuft dieser in den Standardbeispielen dann in einer Loop bis abgebrochen wird - das behindert ja aus meinem Verständnis dann den Rest der Anwendung.

Und wie stelle ich die Verbindung zwischen WCF-Service und Winforms-Funktionen her? Es soll ja dann tatsächlich z.B. ein Button gedrückt, der Druck simuliert bzw. die Funktion aufgerufen werden und dann passieren bestimmte Dinge auf der Oberfläche, bis die ermittelten Daten vorliegen und per Webservice zurückgemeldet werden.

12.06.2013 - 14:17 Uhr

Selbst in Deinem Snippet gehst Du nicht auf das Meta-Tag sondern auf den HTTP Header ein.

Deine andere Variante teste ich später, wenn ich wieder am Dev-Rechner bin.

Aus der Aussage oben würde doch dann aber folgen, dass ich die Seite zwei mal lesen müsste, oder?

  1. Seite laden, Meta-Tag auslesen
  2. Seite mit korrektem Encoding gem. 1. neu laden.
12.06.2013 - 12:54 Uhr

Hallo zusammen,

bei einer Funktion, um Webseiten auszulesen, versuche ich das Encoding der Webseite zu berücksichtigen, was aber nicht in allen Fällen Funktioniert:


HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Timeout = 5000;
using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
	if (httpWebResponse.StatusCode == HttpStatusCode.OK)
	{
		using (Stream responseStream = httpWebResponse.GetResponseStream())
		{
			Encoding encoding;
			if (String.IsNullOrEmpty(httpWebResponse.CharacterSet))
				encoding = Encoding.Default;
			else
				encoding = Encoding.GetEncoding(httpWebResponse.CharacterSet);
			
			using (StreamReader reader = new StreamReader(responseStream, encoding))
			{
				var htmlstring = reader.ReadToEnd();
				
				doc.LoadHtml(htmlstring);
			}
		}                    
	}
	else
	{
		return null;
	}
}

Dabei erhalte ich stellenweise falsch kodierte Texte, z.B.


unabhängiges Reisebüro für

Diese Schnipsel landen anschließend in einer UTF-8-kodierten SQLite DB. Dort sind die Texte dann (natürlich) ebenfalls falsch kodiert.

Beispielheader für solch eine Seite:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="de-DE" xml:lang="de">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Grüße

25.11.2012 - 11:54 Uhr

Genau so funktioniert es, vielen Dank!

25.11.2012 - 11:13 Uhr

Hallo Diräkt,

ich weiss jetzt gerade nicht, ob wir aneinander vorbei sprechen.

Ich möchte B nie speichern (serialisieren) und die zusätzlichen Eigenschaften von B sollen auch nie gespeichert werden (da sind reine Runtimeinformationen in den zusätzlichen Eigenschaften drin).

Deshalb möchte ich aus B ja wieder A machen, damit beim Speichern tatsächlich auch nur die Konfigurations-Eigenschaften (in A und B vorhanden) gespeichert werden.

25.11.2012 - 04:12 Uhr

Hallo zusammen,

ich habe gerade folgendes Problem:

Basisklasse A ist eine Konfigurationsklasse für Objekte in meinem Programm, die ich per Serialize und Deserialze laden und speichern kann. Es gibt davon mehrere Objekte im Programm zur Laufzeit.

Da ich im Programm während der Laufzeit zusätzliche Eigenschaften für ein Objekt benötige, habe ich dafür eine Klasse von A abgeleitet, nennen wir sie B und entsprechend erweitert - funktioniert auch problemlos.

Während der Laufzeit kann man die Konfiguration einen Objekts ändern und diese möchte ich dann abspeichern. Ich wollte dazu auf die entsprechende Funktion der Basisklasse von B zugreifen, doch das gibt Probleme 😉

Rufe ich die Serialize-Funktion aus dem Objekt B auf, dann schlägt dies fehl, da der Serializer aus der Basisklasse mit den erweiterten Eigenschaften von B nichts anfangen kann. Das verstehe ich.

Was ich nicht verstehe ist, warum folgender Ansatz fehlschlägt:


A tempObjektA = new A();
tempObjektA = B;

bzw.

A tempObjektA = (A)B;

In beiden Fällen ist tempObjektA identisch mit B, also inklusive der erweiterten Eigenschaften.

Ich möchte beim Zurückcasten aber erreichen, dass tempObjektA nur die Eigenschaften der Basisklase A von B hat, um dann die Serialize-Funktion fehlerfrei aufrufen zu können. Ich könnte die Laufzeit-Eigenschaften von B natürlich in A definieren, aber diese haben in der Konfigurationsdatei nichts zu suchen.

Ferner kann ich natürlich die Eigenschaften von A einzeln aus B zuweisen in der Form


A.Prop1 = B.Prop1;
A.Prop2 = B.Prop2;
usw.

aber das muss doch auch einfacher gehen.

Grüße

17.11.2012 - 19:05 Uhr

Hallo zusammen,

ich suche eine praktikable Möglichkeit, die Übersetzung der Benutzeroberfläche und sonstiger Textressourcen einer Winforms-Anwendung an einen Dritten zu übergeben.

Idealerweise exportiere ich mit einem Programm alle Stringressourcen, der Dritte übersitzt diese und ich kann diese Übersetzung wieder automatisch in mein Projekt importieren.

Für die normalen Ressourcendateien wie Resources.resx und Resources.de.resx habe ich ein Programm gefunden, aber wie mache ich das mit den Ressourcen aus den Forms?

Grüße

27.06.2012 - 16:20 Uhr

Du musst aber neben dem Service Namen noch andere Parameter (zumindest den Port) konfigurieren - ausserdem machst Du die Verwaltung und Upgrades deutlich muehsamer mit mehreren Instanzen mit eigenem Namen. Waere es nicht einfach, wenn Du innerhalb Deine Service einfach anders aufbaust, so dass es einen Service mit mehreren Listenern gibt?

Wie gesagt, der Service selbst wird heute schon über eine Konfigurationsdatei konfiguriert (Port, Datenbank, Zugangsdaten, etc.).

Ich möchte das als getrennte Services haben, da hinter jedem Service auch eine eigene Datenbank steckt und ich so eine "Mandantenfähigkeit" realisieren kann. Also der Zugriff verschiedener Nutzer tatsächlich physisch getrennt ist.

Da ich die Services selbst betreibe, beschränkt sich ein Update auf das x-fache kopieren der Service-DLL, das schaffe ich gerade noch so 😉

27.06.2012 - 14:11 Uhr

Kannst Du mir dazu bitte mal ein Codebeispiel posten?

27.06.2012 - 13:47 Uhr

Ah super, dann lasse ich den Servicenamen aus der Installerklasse raus, oder wird dieser durch die Namensangabe bei der Nutzung von InstallUtil überschrieben?

27.06.2012 - 13:27 Uhr

Hallo zusammen,

ich möchte auf einem Server einen eigenen Windows-Sienst (WCF-Service) mehrfach installieren, die jeweils über verschiedene Ports erreichbar sein sollen.

Jetzt suche ich nach einer praktikablen Lösung, um den einzelnen Installationen einen individuellen Servicenamen mitzugeben, damit ich diese z.B. über InstallUtil.exe installieren kann.

Im Verzeichnis des jeweiligen Service liegt bereits eine Konfigurationsdatei, die beim Start des Services geladen wird. In diese könnte auch der Servicename hinterlegt werden.

Ist es möglich / wäre es praktikabel, in der Installerklasse auf die Konfigurationsdatei zuzugreifen und den Servicenamen entsprechend zu setzen?

// Provide the ProjectInstaller class which allows 
    // the service to be installed by the Installutil.exe tool
    [RunInstaller(true)]
    public class ProjectInstaller : Installer
    {
        private ServiceProcessInstaller process;
        private ServiceInstaller service;

        public ProjectInstaller()
        {
            process = new ServiceProcessInstaller();
            process.Account = ServiceAccount.LocalSystem;
            service = new ServiceInstaller();
            service.ServiceName = Hier den Namen aus der Konfiguration rein
            service.Description = "Beschreibung";
            Installers.Add(process);
            Installers.Add(service);
        }
    }

Oder gibt es noch andere, schlanke Wege?

Grüße

01.05.2012 - 23:27 Uhr

Meinst Du so etwas?


public class MeinService: IMeinService
    {
        public static Logger logger = LogManager.GetCurrentClassLogger();        
        public static string appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);

        static MeinService()
        {
            logger.Debug("Initialisierung");
        }        

        public dtoUser Login(string Username, string Password)
        {

Ja, das funktioniert, ABER tatsächlich erst, wenn eine Methode des WCF-Service aufgerufen wird. Das habe ich bei meinen Tests natürlich nicht gemacht.

Vielen Dank und Grüße!

01.05.2012 - 23:11 Uhr

Hallo gfoidl,

mein Problem ist, dass ich zwar in "MeinService" einen Standard-Konstruktor angeben kann,


public class MeinService: IMeinService
    {
       public MeinService()
      {
         // Der Konstruktor wird nie aufgerufen
      }
       public dtoUser Login(string Username, string Password)
        {
          ....
        }
    }

dieser wird aber durch die Initialisierung in der HostApp

ServiceHost host = new ServiceHost(typeof(MeinService));

nicht aufgerufen.

Gönne ich "MeinService" einen parametrisierten Konstruktur, erhalte ich in der HostApp den Fehler, dass ich den ServiceHost nicht mit einem parametrisierten Typ erstellen kann.

Viele Grüße

01.05.2012 - 20:30 Uhr

In der DLL sind die Funktionen eines WCF-Services implementiert, also das Interface und die Implementierung der Funktionen des Interfaces.

[ServiceContract]
    public interface IMeinService
    {
      [OperationContract]
        dtoUser Login(string Username, string Password);
      [OperationContract]
      ...
    }

und

 public class MeinService: IMeinService
    {
       public dtoUser Login(string Username, string Password)
        {
          ....
        }
    }

Mehr ist da nicht drin.

In der Executable (die Konsolenanwendung) wird die DLL eingebunden und wie beschrieben, der WCF "ServiceHost" mit der Klasse "MeinService" als Parameter instanziiert.

ServiceHost host = new ServiceHost(typeof(MeinService));

            logger.Debug("Opening Service...");

            host.Open();
            Console.WriteLine("The service is ready at {0}");
            Console.WriteLine("Press <Enter> to stop the service.");
            Console.ReadLine();
            host.Close();
01.05.2012 - 19:53 Uhr

Hallo zusammen,

ich habe eine Service-DLL und einen Service-Host entwickelt, funktioniert super.

Jetzt möchte ich statt der app.config eine eigene XML-Konfigurationsdatei verwenden, da insgesamt drei Programme auf eine gemeinsame Konfigurationsdatei zugreifen sollen.

Grds. ist eine eigene XML-Konfigurationsdatei kein Problem, aber: Wie komme ich an diese Datei aus meiner Service-DLL heraus heran?

In meinem Service Host (Konsolenprogramm) erstelle ich den Service mit:

 ServiceHost host = new ServiceHost(typeof(MeinService));

Ich kann zwar in der Main-Methode des Service-Host die Konfiguration einlesen, aber aus meiner Service-DLL heraus habe ich ja keinen Zugriff darauf.

Und die Service-DLL selbst hat ja keinen Konstruktor, wo ich die XML-Datei einlesen könnte, um dann auch aus dem Service-Host auf die Konfigurationsdaten zugreifen zu können.

Ich habe schon überlegt, die Konfiguration in eine eigene DLL auszulagern, aber da habe ich ja wieder das Problem, dass ich aus meiner Service-DLL heraus keinen "Startpunkt" (Konstruktur) habe.

Ich drehe mich hier gerade im Kreis... Evtl. ist die Lösung simpel, aber ich sehe diese im Moment nicht.

Danke und viele Grüße

15.04.2012 - 16:02 Uhr

verwendetes Datenbanksystem: MS SQL 2008 R2 mit NHibernate 3

Hallo zusammen,

ich versuche gerade nach diversen Tutorials so genannte PagedQueries mit NHibernate hinzubekommen.

Das Problem dabei ist, dass dabei immer auf folgendes Konstrukt aufgesetzt wird:


class Queries
    {
        public class PagedResult<T>
        {
            public int TotalItems { get; set; }
            public IEnumerable<T> PageOfResults { get; set; }
        }

        public interface IPagedQuery<T> : IQuery<PagedResult<T>>
        {
            int PageNumber { get; set; }
            int ItemsPerPage { get; set; }
        }
    }

Bei der Interface-Definition bekomme ich aber immer folgenden Fehler:

IQuery<PagedResult<T>>

Fehler 3 Typ "NHibernate.IQuery" ist nicht generisch und kann daher nicht mit Typargumenten verwendet werden.

Evtl. fehlt mir noch irgendein Assemblyverweis, habe dazu aber schon einiges durch - ohne Erfolg.

Danke und Grüße

06.04.2012 - 10:22 Uhr

Vielen Dank, habe mir Auto Mapper jetzt auch angeschaut und werde des benutzen.

Mann mann mann, da kommt man ja vom Hundertsten ins Tausendste.

Viele Grüße

05.04.2012 - 11:24 Uhr

man sollte möglichst vermeiden, sein Datenmodell direkt per Webservice an Clients weiterzureichen. Zum einen sind Änderungen im Datenmodell dann auch immer gleich Änderungen am Service-Kontrakt, zum anderen sind die durch einen ORM relativ leicht zu managenden Relationen zwischen Objekten ein ziemliches Problem bei der Serialisierung. Von daher sollte man immer Datentransfer-Klassen (im Prinzip so, wie du es im Beispiel schon machst) erzeugen, die dann für diesen einen Zweck optimiert sind.

Danke Dir, das beantwortet meine grundsätzliche Frage schon fast komplett.

Das ist mein erstes ORMapper-Projekt und auf der Service / Server-Seite bin ich echt begeistert davon. Mir hat aber der offenbar notwendige Stilbruch Gänsehaut bereitet.

Denn im Endeffekt muss ich ja für jedes Objekt quasi einen Transport-Wrapper zusätzlich schreiben und das kann ja beliebig kompliziert werden.

Nehmen wir als Beispiel eine Order. Dann habe ich *Order-Systemdaten *Order Stammdaten (mit Kunde, Kundenadresse(n)) *Orderpositionen *etc.

die ich dann am Client erstmal in ein "Order"-Objekt packen, an den Service senden und dort mit den ORMapper-Methoden "zusammenbasteln" muss.

Aber wenn das der Weg ist, dann ist das der Weg 😉

04.04.2012 - 23:25 Uhr

Hallo zusammen,

ich habe einen WCF-Service, auf dem das Datenhandling mit einem ORMapper (NHibernate Designer von Mindscape) und einem MSSQL-Server realisiert ist und einen entsprechenden Winform-Client.

Auf der Service-Seite funktioniert die Datenverarbeitung durch die OR-Schicht wunderbar, mich plagt aber aktuell der Datentransfer zum Client.

Beispiel: eine Entität "User" mit einer Assoziation zur Entität "Role" und eine Assoziation zu "RoleRights". "Role" beinhaltete eine RollenID und einen RollenNamen, in die RoleRights sind die einzelnen Rechte der Rolle enthalten (in der Form "Operation" -> True / False).

Auf der Service-Seite kann ich mir zum Beispiel einen User wie folgt holen:


User myUser = (User)session.CreateQuery("from User u where u.Username=:username and u.Password=:password")
                    .SetString("username", Username)
                    .SetString("password", Password)
                    .UniqueResult();

Dan habe ich wunderbar den User, ich kann über User.Role auf den Rollennamen zugreifen und mit User.Role.Rolerights auf die einzelnen Rechte.

Idealerweise wünsche ich mir, dass ich das Objekt "User" jetzt so über den WCF-Service dem Client bereitstellen kann, aber das knallt, sobald eine Assoziation wie Role oder RoleRights mit im Spiel ist.

Ich kann sehen, dass der Service das gewünschte "Gesamtobjekt" zurückgibt, aber auf der Clientseite stoße ich dann auf einen Fehler, wenn ich zum Beispiel so abfrage:


EnterpriseService.EnterpriseClient myClient = new EnterpriseService.EnterpriseClient();

//EnterpriseService.User myUser = new EnterpriseService.User();  / Fehler kommt mit und ohne diese Anweisung

EnterpriseService.User myUser = myClient.LoginEx(textBoxX1.Text.Trim(), textBoxX2.Text.Trim());

Fehler beim Empfangen der HTTP-Antwort für
>
. Die Ursache kann sein, dass die Dienstendpunktbindung kein HTTP-Protokoll verwendet. Eine andere mögliche Ursache ist, dass der HTTP-Anforderungskontext vom Server abgebrochen wird (vermutlich auf das Herunterfahren des Diensts zurückzuführen). Weitere Informationen finden Sie in den Serverprotokollen.

Meine vom Designer generierte OR-Klasse sieht auszugsweise so aus:


[System.CodeDom.Compiler.GeneratedCode("NHibernateModelGenerator", "1.0.0.0")]
  [System.Runtime.Serialization.DataContract]
  public partial class User
  {
    [System.Runtime.Serialization.DataMember]
    public virtual int Id { get; set; }
    [System.Runtime.Serialization.DataMember]
    public virtual string Username { get; set; }
    [System.Runtime.Serialization.DataMember]
    public virtual string Password { get; set; }
    [System.Runtime.Serialization.DataMember]
    public virtual string FirstName { get; set; }
    [System.Runtime.Serialization.DataMember]
    public virtual string LastName { get; set; }
    [System.Runtime.Serialization.DataMember]
    public virtual Role Role { get; set; }

Geht das überhaupt so, wie ich mir das vorstelle? Aus der Not heraus, habe ich angefangen, mir einen Wrapper zu schreiben, der ungefähr so aussieht.


[DataContract]
    public class EnterpriseUser
    {
        int id;
        [DataMember]
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        string username;
        [DataMember]
        public string Username
        {
            get { return username; }
            set { username = value; }
        }

...

        List<RoleRights> userrights;
        [DataMember]
        public List<RoleRights> Userrights
        {

            get { return userrights; }
            set { userrights = value; }
        }
      
    }

Und damit geht es dann, aber das empfinde ich irgendwie nicht den Sinn der Sache. Hier sehe ich zudem enorme Probleme bei der Datenbearbeitung.

Viele Grüße

02.04.2012 - 23:07 Uhr

Danke Dir, ich habe jetzt eins bei K-Software bestellt.

02.04.2012 - 11:14 Uhr

Vorsicht, der Punkt "Assembly signieren" im VS und die Signatur mit dem signtool sind zwei unterschiedliche paar Schuhe.
Erstere signiert das .NET Assembly mit einem starken Namen mit dem privaten Schlüssel des CodeSignatur-Zertifikates. Diese Assemblysignatur ist aber keine Authenticode Signatur die benötigt wird um z.B. die Meldung "Unbekannter Herausgeber" zu entfernen. Diese bekommt man nur mit dem signtool.

Genau das war der Punkt bzgl. meiner Unsicherheit, WAS für ein Zertifikat ich benötige.

Ich hatte einen Anbieter gefunden, bei dem ich im ersten Step zwischen ca. 10 Zertifikatstypen wählen musste, und da war dann aus bei mir 😉

02.04.2012 - 01:16 Uhr

Hallo zusammen,

ich suche aktuelle Infos zum Thema "Software signieren". Also das Signieren von z.B. einem Setup, damit unter Windows der Hinweis des "unbekannten Herausgebers" unterbleibt und sichergestellt wird, dass die Software aus einer bestimmten Quelle stammt. Ich habe dazu im Web nicht so recht passende Infos gefunden.

Mir geht es dabei speziell um folgende Punkte:*Was für ein Zertifikat genau benötigt man dafür? *Wer sind "gute" Anbieter solcher Zertifikate? *Lässt sich der Signierungsvorgang im VS Buildprozess integrieren (ich nehme an, ja)?

Danke und Grüße!

16.02.2012 - 23:40 Uhr

Wollte nur kurz Ergebnis-Rückmeldung geben:

Ich habe mir

http://www.mindscapehq.com/products/nhdesigner

gekauft und komme als O/R-Einsteiger damit sehr gut zu recht.

Viele Grüße

15.02.2012 - 02:29 Uhr

Kommt ein OR-Mapper(zb nHibernate) in Frage? Da stellst du es in der Konfig ein welcher Dialekt verwendet wird und den Rest übernimmt nHibernate für dich.

Danke, das sieht ja gut aus, aber auch nach viel Handarbeit.

Kennt jemand von euch dieses AddIn für Visual Studio? US$ 99 scheinen die Features wert zu sein.

http://www.mindscapehq.com/products/nhdesigner

Viele Grüße
kom2006

13.02.2012 - 18:14 Uhr

Hallo zusammen,

ich suche nach einem Ansatz, wie ich es am besten umsetze, dem Anwender in einem Programm die Möglichkeit zu geben, entweder mit einer MS SQL oder einer MYSQL Datenbank zu arbeiten.

Die Auswahl erfolgt bei der ersten Nutzung des Programms über eine Konfigurationsdatei und bleibt dann auch so.

Ich könnte jetzt natürlich bei jedem DB-Zugriff prüfen

if (MSSQL)
...
else if (MYSQL)
...

Aber das ist bestimmt nicht der Weisheit letzter Schluß.

Habt ihr da einen Tipp für mich, wo ich mich einlesen kann?

Danke und Grüße

18.01.2012 - 00:32 Uhr

Fehler gefunden...

Es muss lauten

MyDateTime = DateTime.ParseExact(MyString, "dd.MM.yyyy HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture);

Große "HH".

Danke euch trotzdem vielmals.

18.01.2012 - 00:09 Uhr

Also irgendwie habe ich hier der Wurm drin. Den deutschen DateTime-Wert lese ich aus einer XML-Datei. Dieser steht dann auch korrekt in MyString drin.

Aber selbst, wenn ich den Wert direkt zuweise, kommt der Fehler. Jetzt auch auf meinem deutschen OS bei ParseExact:



string MyString = "20.01.2012 23:33:22";

DateTime MyDateTime = DateTime.ParseExact(MyString, "dd.MM.yyyy hh:mm:ss", System.Globalization.CultureInfo.CurrentCulture);


Ergibt:

Fehlermeldung:
"Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."

Ich hatte bisher mit

DateTime MyDateTime = DateTime.Parse(MyString);

gearbeitet, was funktioniert, aber da habe ich gelesen, dass sollte man nicht. Mit ParseExact klappt das aber irgendwie nicht.

Was will ich konkret erreichen?

  1. DateTime String aus XML auslesen => OK
  2. diesen String in ein DateTime umwandeln, abhängig von der Cultureinfo auf dem Zielrechner. Mit ParseExact klappt das aus irgendeinem Grunde nicht.
  3. den DateTime Wert aus 2. mit DateTime.Now auf dem Zielrechner vergleichen
17.01.2012 - 21:01 Uhr

Was brachte dieses Ergebnis? Du zeigst nur wie du Text in DateTime umwandelst, aber davon ist die Ausgabe nicht betroffen.
DateTime hat kein Format, das ist ein Zahlenwert.

Aber Moment, wenn ich meinen deutschen DateTime-String wie o.g. auf dem US-Zielsystem auf DateTime umwandle, dann muss doch auf dem US-Zielsystem ein


textBox2.Text = oldDate1.ToString();

aber dann 12/05/2011 08:37:12 ausspucken und nicht 05/12/2011 08:37:12, oder nicht?

17.01.2012 - 20:48 Uhr

Hallo zusammen,

ich habe ein Datetime im deutschen Format

05.12.2011 08:37:12

und möchte dieses, je nachdem unter welcher localization (Betriebsystem) das Programm läuft, mit einem Datetime.Now (also dem lokalisierten Wert unter dem das Programm gerade läuft) abgleichen.

Mein bisheriger Versuch mit (in textBox1 steht das o.g. Datetime im deutschen Format)

DateTime oldDate1 = DateTime.ParseExact(textBox1.Text, "dd.MM.yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

unter einem US-Betriebssystem brachte folgendes zu Tage:

05/12/2011 08:37:12

Das sieht zwar nett aus, zeigt aber eigentlich den 12.05.2011 und nicht den 05.12.2011.

Habt ihr eine Idee für mich?

Grüße

22.12.2011 - 00:27 Uhr

Hallo zusammen,

ich habe seit ein paar Tagen ein ziemlich nerviges Problem.

Meine Anwendung ist unter VS2010 in deutsch und englisch lokalisiert (Englisch ist die Standardsprache). Es wird die "Language" Property in den einzelnen Forms genutzt und auch eine Resources.de.resx für lokalisierte Messagebox-Meldungen. Zusätzlich verwende ich die Ribbon-Komponente aus der DotNetBar von DevComponents.

Wenn ich Änderungen an der Main Form vornehme (und nur dort, bei keiner anderen lokalisierten Form), ein Control hinzufüge oder ein neues Event im Designer erstellen lasse, kommt eine Wartepause von 1-2 Sekunden (Eieruhr) und es werden mir sofort mit dieser Aktion im Designercode (frmMain.Designer.cs) alle Vorkommen von z.B.


this.ribbonPanel1.Style.Class = global::Testprogramm.Properties.Resources.metatags_;

in


this.ribbonPanel1.Style.Class = global::Testprogramm.Properties.Resources_de.metatags_;

umgewandelt, was zu folgender Fehlermeldung führt.

Fehlermeldung:
Fehler 1 Der Typ- oder Namespacename "Resources_de" ist im Namespace "Testprogramm.Properties" nicht vorhanden. (Fehlt ein Assemblyverweis?) E:\Testprogramm\frmMain.Designer.cs 263 98 Testprogramm

Gehe ich dann in die frmMain.Designer.cs und lasse alle "Resources_de" durch "Resources" ersetzen, funktioniert wieder alles, bis zur nächsten Änderung an der frmMain.

Danke und viele Grüße

12.12.2011 - 23:47 Uhr

Oh mann, nachdem ich mir die sogar die Mailingliste im Schnelldurchlauf reingezogen habe, bin ich auf die Lösung gestossen.

Der Schlüssel ist das "Pooling". Verwaltet FB selbst die Connections, gibt es diese nicht sofort frei und das ist der Standard, aber mit "Pooling=false", geht es 😉

12.12.2011 - 22:44 Uhr

Ich habe jetzt mal ein neues Projekt nur mit dieser Funktion erstellt, selbes Ergebnis:

Firebird Embedded 2.5.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FirebirdSql.Data.FirebirdClient;
using System.IO;

namespace FBFileTest
{
    public partial class Form1 : Form
    {
        public string UserDataFolder = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Me\\Data\\";
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ReadData("me");
        }

        private void ReadData(string lCode)
        {
            FbConnection PMSKConn;
            FbCommand PMSKCom;
            FbDataReader PMSKReader;

            if (File.Exists(UserDataFolder + "\\data\\" + lCode + "_data.dat"))
            {
                using (PMSKConn = new FbConnection("ServerType=1;User=MYPC;Password=xxxxx;Dialect=3;Database=" + UserDataFolder + "\\data\\" + lCode + "_data.dat"))
                {
                    PMSKCom = new FbCommand("SELECT * FROM entries ORDER BY lastaccess ASC", PMSKConn);
                    PMSKConn.Open();
                    PMSKReader = PMSKCom.ExecuteReader();
                    //Helper.DataList.Clear();
                    while (PMSKReader.Read())
                    {
                        //Helper.DataList.Add(PMSKReader["user"].ToString(), PMSKReader["profession"].ToString());
                    }
                    PMSKReader.Close();
                    PMSKConn.Close();
                    PMSKConn.Dispose();
                    PMSKReader.Dispose();
                }
            }
            File.Delete(UserDataFolder + "\\data\\" + lCode + "_data.dat"); // -> Peng! Kann nicht gelöscht werden, da von anderem Prozess genutzt
        }
    }
}

Es muss mit der Datenbank zu tun haben, da ich dies zuvor mit einer Textdatei gelöst hatte, die ich über den selben Prozess einlesen und löschen konnte

12.12.2011 - 21:55 Uhr

Nein, leider auch nicht. Kann es sein, dass ich die Datenbankdatei noch irgendwie aus der Firebird Engine entladen muss?

Hier habe ich ja nur die Connection geschlossen.


public static void ReadData(string lCode)
        {
            FbConnection PMSKConn;
            FbCommand PMSKCom;
            FbDataReader PMSKReader;

            if (File.Exists(UserDataFolder + "\\data\\" + lCode + "_data.dat"))
            {
                using (PMSKConn = new FbConnection("ServerType=1;User=MYPC;Password=xxxxx;Dialect=3;Database=" + UserDataFolder + "\\data\\" + lCode + "_data.dat"))
                {
                PMSKConn.Open();
                PMSKCom = new FbCommand("SELECT * FROM entries ORDER BY lastaccess ASC", PMSKConn);
                PMSKReader = PMSKCom.ExecuteReader();

                DataList.Clear();

                while (PMSKReader.Read())
                {
                    DataList.Add(PMSKReader["user"].ToString(), PMSKReader["profession"].ToString());
                }
                PMSKConn.Close();

                    PMSKConn.Dispose();
                    PMSKReader.Dispose();
                }
            }
        }

Selbst bei einem einmaligen Aufruf kann ich am Ende der Funktion die Datei nicht löschen. Also Öffnen, Lesen, Schließen -> Löschen = Fehler.


public static void ReadData(string lCode)
        {
            FbConnection PMSKConn;
            FbCommand PMSKCom;
            FbDataReader PMSKReader;

            if (File.Exists(UserDataFolder + "\\data\\" + lCode + "_data.dat"))
            {
                using (PMSKConn = new FbConnection("ServerType=1;User=MYPC;Password=xxxxx;Dialect=3;Database=" + UserDataFolder + "\\data\\" + lCode + "_data.dat"))
                {
                PMSKConn.Open();
                PMSKCom = new FbCommand("SELECT * FROM entries ORDER BY lastaccess ASC", PMSKConn);
                PMSKReader = PMSKCom.ExecuteReader();

                DataList.Clear();

                while (PMSKReader.Read())
                {
                    DataList.Add(PMSKReader["user"].ToString(), PMSKReader["profession"].ToString());
                }
                PMSKConn.Close();

                    PMSKConn.Dispose();
                    PMSKReader.Dispose();
                }
            }
        File.Delete(UserDataFolder + "\\data\\" + lCode + "_data.dat");
        }

Und auch wenn ich die statische Funktion aus der statischen Klasse nehme und in meine Mainform packe, ändert sich nichts.

12.12.2011 - 21:18 Uhr

Hallo zusammen,

ich habe das Problem, dass ich nach Aufruf der folgenden Funktion die angegebene Firebird-Datei von einer anderen Stelle im Programm nicht löschen kann.

Führe ich die Funktion ReadData nicht aus, kann ich die DB-Datei löschen. Diese muss also offenbar nach Aufruf der Funktion ReadData gelockt sein, aber ich weiss nicht wieso.


public static void ReadData(string lCode)
        {
            FbConnection PMSKConn;
            FbCommand PMSKCom;
            FbDataReader PMSKReader;

            if (File.Exists(UserDataFolder + "\\data\\" + lCode + "_data.dat"))
            {                           
                PMSKConn = new FbConnection("ServerType=1;User=MYPC;Password=xxxxx;Dialect=3;Database=" + UserDataFolder + "\\data\\" + lCode + "_data.dat");
                PMSKConn.Open();
                PMSKCom = new FbCommand("SELECT * FROM entries ORDER BY lastaccess ASC", PMSKConn);
                PMSKReader = PMSKCom.ExecuteReader();

                DataList.Clear();

                while (PMSKReader.Read())
                {
                    DataList.Add(PMSKReader["user"].ToString(), PMSKReader["profession"].ToString());
                }       
                PMSKConn.Close();
            }
        }

20.10.2011 - 11:41 Uhr

Also ich beziehe mich auf genau das von Dir genannte (neue) SQlite-Projekt, bzw. dessen Fortführung:

System.Data.SQLite Download Page

Das mit der CustomAction wäre ein Weg, aber da habe ich aktuell kein Wissen, wie ich das umzusetzen habe.

19.10.2011 - 22:33 Uhr

Hallo zusammen,

ich stehe gerade vor dem Problem beim Einsatz der aktuellen SQLite-Version eine x86 und x64 Variante meines Programms anbieten zu müssen. Die neue Version ist offenbar targetspezifisch, auch wenn es als 32 Bit kompiliert wird.

Das Programm unter 64 Bit Windows benötigt nur die statische system.data.sqlite.dll in der 32 Bit Version, das Programm unter 32 Bit Windows läuft nur mit der system.data.sqlite.dll in der dynmischen 32 Bit Version + der SQLite.Interop.dll.

Da ich mir meine Projektmappe nach x Versionsversuchen mit unterschiedlichen DLL-Version nicht komplett zerschießen möchte, folgende Frage:

Wie kann ich die drei DLLs in das Projekt einbinden, um, je nach Ausgabe (32 oder 64 Bit), die Anwendung mit den korrekten DLLs zu kompilieren und auch die korrekten DLLs im jeweiligen Ausgabeverzeichnis zu bekommen?

Edit: Zusätzlich kann die SQLite.Interop.dll auch nicht als Verweis hinzugefügt, sondern kann überhaupt nur als "vorhandenes Element" hinzugefügt werden ("es konnte kein Verweis auf.. hinzugefügt werden"). Diese wird dann wohl in jeder Version mitkopiert.

Hier nochmal etwas übersichtlicher:


Dev-Umgebung    |    x64    |
----------------+-----+-----+
Kompilat        |    x86    |
----------------+-----+-----+
Nutzerplattform | x86 | x64 |
----------------+-----+-----+
statische 64er  |     |     |
SQLite.DLL      |  -  |  +  |
----------------+-----+-----+
64er SQLite.DLL |     |     |
+ SQLite.Interop|  -  |  +  |
----------------+-----+-----+
statische 32er  |     |     |
SQLite.DLL      |  -  |  +  |
----------------+-----+-----+
32er SQLite.DLL |     |     |
+ SQLite.Interop|  +  |  -  |
----------------+-----+-----+

Wie ich gerade festgestellt habe, reicht es aus, eine 32-Bit Anwendung zu erstellen und nur die o.g. DLL-Konstellationen, je nach Nutzerplattform auszutauschen.

Was mich dann aber dennoch dazu zwingt, 2 Setups zu erstellen. Oder gibt es mit dem VS Installer eine Möglichkeit, Dateien abhängig vom Zielsystem zu kopieren?

Danke und Grüße
Igotcha

14.10.2011 - 01:05 Uhr

Danke für den Tipp, habe es so umgesetzt und funktioniert wunderbar.

12.10.2011 - 00:19 Uhr

Hallo zusammen,

ich erstell gerade einen WCF-Service und habe eine Frage zum Design. Folgender Ablauf soll realisiert werden:

  1. Service wird vom Client aufgerufen (funktioniert)
  2. Service erstellt einen Datensatz in der Datenbank (funktioniert)
  3. Service gibt eine Rückmeldung an den Client (funktioniert)
  4. Jetzt soll der Service eigentlich nach 3. den unter 2. gespeicherten Datensatz weiter verarbeiten. Z.b. eine Mail versenden.

Ich wollte 4. nicht zwischen 2. und 3. einbauen, wegen evtl. auftretender Timeout-Geschichten.

Kann / sollte man hier ggf. mit Events arbeiten, um 3. nicht zu blockieren oder wie löst man so etwas nach best practice?

Grüße

12.09.2011 - 22:51 Uhr

Du kannst auf die Dateien nur lesend zugreifen, Änderungen sind nicht vorgesehen.

Sollen die Dateien vom User geändert werden können (also auch geschrieben), dann pack diese nach %appdata%.

09.09.2011 - 20:43 Uhr

Habe 2008 deinstalliert und 2010 installiert, 2008er Projekt geöffnet, kompiliert, alles bestens.

Danke!

09.09.2011 - 16:43 Uhr

zu 1)
VS 2008 und 2010 lassen sich problenlos parallel betreiben. Du musst da nichts vorher deinstallieren.

Ich möchte die ja gar nicht parallel betreiben, oder anders, idealerweise habe ich nur noch ein Visual Studio auf dem Rechner.

Die Frage ging in die Richtung, ob es ein Update wird, also aus der vorhandenen 2008 wird eine 2010 und wenn ja, wie die Erfahrungen damit sind. Kann ja sein, dass es damit bekannte Probleme gibt.

zu 2)
Ja, du kannst die 2008er Projekte im 2010 öffnen. Diese werden dann konvertiert und können anschließend nicht ohne manuellen Eingriff wieder in 2008 geöffnet werden. Wie kommst du darauf, das sich das Kompilat vom 2010er anders verhalten wird/soll als beim 2008er?

Siehe 1, die will ich ja auch gar nicht mehr in VS2008 öffnen.

Keine Ahnung ob sich da was ändert, deshalb frage ich ja.

09.09.2011 - 16:33 Uhr

Hallo zusammen,

ich habe zwei Fragen zum Update von VS2008 auf VS2010 Professional:

  1. Installiert sich VS2010 tatsächlich als Update bei einer vorhandenen VS2008 Installation, oder ist es ratsamer VS2008 zuerst zu deinstallieren und dann VS2010 zu installieren?

  2. Kann ich in VS2010 meine vorhandenen VS2008-Projekte öffnen und diese quasi im "VS2008-Modus" kompilieren lassen, so dass die erzeugten Dateien sich so verhalten, als ob sie noch mit VS2008 erstellt wurden? Hintergrund: Ich möchte ein bestehendes Programm in VS2010 weiter pflegen (.NET 3.5) und in einem neuen Projekt (.NET 4) weiter entwickeln.

Grüße

18.08.2011 - 23:19 Uhr

Es handelt sich hierbei wohl um einen bekannten Bug im RichText Control.

Ich werde mal versuchen, mir eine eigene Undo / Redo - Routine zu schreiben, indem ich bei reinen Textänderungen (Vergleich Text Puffervariable mit RichtextBox.Text) in einem String-Array oder in einer String-List jeweils den aktuellen, kompletten Text zwischenspeichere und bei einem Redo wieder der Text-Eigenschaft zuweise.

Mal schauen, ob das klappt.

18.08.2011 - 22:47 Uhr

Hallo zusammen,

ich führe im onTextChanged-Event in einer RTB eine Syntaxformatierung (Color, Style) des gesamten Textes durch, was sehr performant ist und an sich gut funktioniert.

Jetzt habe ich festgestellt, dass Undo und Redo (natürlich) nicht mehr korrekt funktionieren, da offenbar auch die Formatierung als "changed Text" interpretiert wird.

Gibt es eine Möglichkeit, hier eine Beschränkung auf den reinen Text durchzuführen, so dass durch Undo und Redo wirklich nur inhaltliche Textänderungen beachtet und wiederhergestellt werden können?

Grüße

16.08.2011 - 12:06 Uhr

Seit zwei Tagen ist die Webseite vom Updatesystem nicht mehr erreichbar.

26.07.2011 - 11:42 Uhr

Grundsätzlich bin ich der Meinung, dass man als Hobby-Programmierer nicht in allen Programmier-Disziplinen ein "Meister" sein muss und kann - ich denke, nicht einmal ein professioneller Entwickler ist ein "Meister aller Klassen".

Wie im Eingangspost zu sehen ist, habe ich mir durchaus Gedanken zum Thema gemacht und auch das von Dir erwähnte Tool genutzt.

Also bitte etwas Nachsicht mit uns "dummies".

Grüße

26.07.2011 - 00:48 Uhr

Ich weiss, warum ich RegExps hasse 😁

Mit einem

(?<text>.*?)

klappts dann auch. Was so ein einzelnes Zeichen doch für eine Wirkung haben kann...

Danke und Grüße