Laden...

Forenbeiträge von esskar Ingesamt 203 Beiträge

31.05.2011 - 10:46 Uhr

ist jetzt schon länger her. hast du es hinbekommen?

23.08.2010 - 11:54 Uhr

ich würde nen WinService schreiben, mit dem deine ASP seite über z.b. namedpipes (oder auch WCF) kommuniziert und der dann die IP setzt!

22.08.2010 - 10:10 Uhr

wenn du wirklich alles in eine anweisung packen willst, würde ich es folgendermaßen darstellen


var custs =
	from c in db.BESTELLUNG
	join h in db.HERSTELLER on c.HERSTELLER_ID equals h.HERSTELLER_ID into tempHST
	from hst in tempHST.DefaultIfEmpty()
	join k in db.KUNDE on c.KUNDE_ID equals k.KUNDE_ID into tempKU
	from kun in tempKU.DefaultIfEmpty()
	where
		c.BESTELLNUMMER.StartsWith(myBestellungSuche.Bestellnummer) &&
		hst.NAME_1.StartsWith(myBestellungSuche.Hersteller) &&
		kun.KUNDENNUMMER.StartsWith(myBestellungSuche.Kundennummer) &&
		c.LIEFER_NAME_1.StartsWith(myBestellungSuche.Liefer_Name_1) &&
		c.LIEFER_NAME_2.StartsWith(myBestellungSuche.Liefer_Name_2) &&
		(!string.IsNullOrEmpty(myBestellungSuche.Bestelldatum) ? c.BESTELLDATUM.Equals(myBestellungSuche.Bestelldatum) : true) &&
		(!string.IsNullOrEmpty(myBestellungSuche.Bestellstatus) ? c.BESTELLSTATUS.Equals(myBestellungSuche.Bestellstatus) : true) &&
		(!string.IsNullOrEmpty(myBestellungSuche.Bestellart) ? c.BESTELLART.Equals(myBestellungSuche.Bestellart) : true) &&
	select new { .... };

22.08.2010 - 00:08 Uhr

this._current = this._internalDictionary[this._index];
this._index++;

solltest du entweder als

this._current = this._internalDictionary[this._index++];

oder


this._current = this._internalDictionary[this._index];
++this._index;

schreiben!

21.08.2010 - 22:54 Uhr

den (object) cast kannst du dir sparen. in c# ist ja alles ein object!

21.08.2010 - 20:56 Uhr

du machst einmal deine generische implementierung


public TKey Current
{
   get { 
      if(_keys.Count <= 0) throw new ApplicationException();
     return _keys[_index];
   }
}

und dann deine explizite implementierung für IEnumerator


object IEnumerator.Current
{
   get { return this.Current; }
}

bist du aber sicher, dass du deine collection von Ienumerator und nicht von Ienumerable ableiten willst?

21.08.2010 - 20:11 Uhr

ich hab dafür 2 Klassen und ein Interface geschrieben


public class RegistryHelper
    {
        private RegistryKey m_registryKey = null;
        private string m_registryPath = null;

        public RegistryHelper(RegistryKey registryKey, string registryPath)
        {
            this.RegistryKey = registryKey;
            this.RegistryPath = registryPath;
        }

        public RegistryKey ConfigurationStore
        {
            get { return this.RegistryKey.CreateSubKey(this.RegistryPath); }
        }

        public RegistryKey RegistryKey
        {
            get { return m_registryKey; }
            set { m_registryKey = value; }
        }

        public string RegistryPath
        {
            get { return m_registryPath; }
            set { m_registryPath = value; }
        }

        public string LoadString(string name, string def, bool create)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                return (string)key.GetValue(name, def);
            }
            finally
            {
                if (create && !HasValue(name))
                    SaveString(name, def);
                key.Close();
            }
        }

        public string[] LoadStringArray(string name, string[] def, bool create)
        {
            return this.LoadStringArray(name, def, ",", create);
        }

        public string[] LoadStringArray(string name, string[] def, string sep, bool create)
        {
            string s = this.LoadString(name, def != null ? string.Join(sep, def) : "", create);
            return s.Split(new string[] { sep }, StringSplitOptions.RemoveEmptyEntries);
        }

        public void SaveString(string name, string val)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                key.SetValue(name, val);
            }
            finally
            {
                key.Close();
            }
        }

        public int LoadInteger(string name, int def, bool create)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                return (int)key.GetValue(name, def);
            }
            finally
            {
                if (create && !HasValue(name))
                    this.SaveInteger(name, def);
                key.Close();
            }
        }

        public uint LoadDword(string name, uint def, bool create)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                return (uint)key.GetValue(name, def);
            }
            finally
            {
                if (create && !HasValue(name))
                    this.SaveDword(name, def);
                key.Close();
            }
        }

        public void SaveDword(string name, uint val)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                key.SetValue(name, val, RegistryValueKind.DWord);
            }
            finally
            {
                key.Close();
            }
        }

        public void SaveInteger(string name, int val)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                key.SetValue(name, val, RegistryValueKind.DWord);
            }
            finally
            {
                key.Close();
            }
        }

        public Type GetValueType(string name)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                RegistryValueKind kind = key.GetValueKind(name);
                if (kind == RegistryValueKind.DWord)
                    return typeof(int);
                else if (kind == RegistryValueKind.String)
                    return typeof(string);
                else
                    return typeof(object);
            }
            catch (System.IO.IOException) { return null; }
            finally
            {
                key.Close();
            }
        }

        public bool HasValue(string name)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                return key.GetValue(name) != null;
            }
            finally
            {
                key.Close();
            }
        }

        public void DeleteValue(string Name)
        {
            RegistryKey key = this.ConfigurationStore;
            try
            {
                key.DeleteValue(Name, false);
            }
            finally
            {
                key.Close();
            }
        }        
    }

public interface IConfiguration
    {
        uint LoadDword(string name, uint def, bool create);
        int LoadInteger(string name, int def, bool create);
        string LoadString(string name, string def, bool create);
        decimal LoadDecimal(string name, decimal def, bool create);
        string[] LoadString(string name, string[] def, bool create);

        void SaveDword(string name, uint val);
        void SaveInteger(string name, int val);
        void SaveString(string name, string val);
        void SaveDecimal(string name, decimal val);

        IConfiguration GetSection(string name);

        StringDictionary GetValues();
        StringDictionary GetValues(Strings names);
        Strings SectionNames { get; }
        Strings ValueNames { get; }
        Type GetValueType(string valueName);
    }


 public class RegConfiguration : Win32.RegistryHelper, IConfiguration
    {        
        public RegConfiguration(string registryPath)
            : base(Microsoft.Win32.Registry.LocalMachine, registryPath)
        {            
        }

        #region IConfiguration Members

        public decimal LoadDecimal(string name, decimal def, bool create)
        {
            decimal retval;
            if (!decimal.TryParse(this.LoadString(name, def.ToString(ThreadHelper.Culture), create), NumberStyles.Number, ThreadHelper.Culture, out retval))
                retval = def;
            return retval;
        }

        public void SaveDecimal(string name, decimal val)
        {
            this.SaveString(name, val.ToString(ThreadHelper.Culture));
        }

        public IConfiguration GetSection(string name)
        {
            return new RegConfiguration(Path.Combine(this.RegistryPath, name));
        }

        public Strings SectionNames
        {
            get
            {
                Strings strings = new Strings();
                strings.AddRange(this.ConfigurationStore.GetSubKeyNames());
                return strings;
            }
        }

        public Strings ValueNames
        {
            get
            {
                Strings strings = new Strings();
                strings.AddRange(this.ConfigurationStore.GetValueNames());
                return strings;
            }
        }
        
        public StringDictionary GetValues(Strings names)
        {
            return ConfigurationHelper.GetValues(this, names);
        }

        public StringDictionary GetValues()
        {
            return ConfigurationHelper.GetValues(this, null);
        }

        public string[] LoadString(string name, string[] def, bool create)
        {
            return ConfigurationHelper.LoadStringArray(this, name, def, create);
        }

        #endregion
    }

vielleicht hilft es dir ja. aber statisch würde ich die sache nicht halten.
eher ne normale klasse wie ich, die du dann ggf. global statisch zur verfügung stellst!

20.08.2010 - 14:59 Uhr
  
        public void Huhu()   
        {  
            // Zähler für Schleife  
            int tmpCounter = 0;  
  
            while (tmpCounter < 10)  
            {  
                try  
                {  
                    // Aktion war erfolgreich  
                    tmpCounter = 10;   
                }  
                // ...  
            }  
        }  
  

würde ich eher als

// Aktion war erfolgreich break;

schreiben!

20.08.2010 - 14:08 Uhr

würde ja mal den kompeltten WebRequest teil in ein try { } catch { } auslagern
und fehlermeldungen richtig abfangen!

20.08.2010 - 13:46 Uhr

dann mal


tooltip.Show("Hallo Welt", (sender as ToolStripMenuItem).Owner.Parent, Control.MousePosition);

natürlich ggf. noch überall auf null checken

20.08.2010 - 13:36 Uhr

hi.
ToolStripMenuItem ist ja so oder so kei IWin32Window

versuchs mal so!


private void MouseHover(object sender, EventArgs e)
{
      tooltip.Show("Hallo Welt", this, Control.MousePosition.X, Control.MousePosition.Y);
}

20.08.2010 - 13:24 Uhr

das ist eine schreibweise für inline callbacks (oder wie das genau heißt, kenn noch closures)
"früher" hat man das so geschrieben


ThreadPool.QueueUserWorkItem(delegate(object unused) { notifier.SendTileNotification(subscribers, "PushNotificationsToken", "/Images/" + weatherType + ".png", temperature, location, OnMessageSent)});

20.08.2010 - 10:57 Uhr

weiß nicht, ob du das so meinst?


menuItemForSave.Click += new EventHandler(this.OnSaveSomething);
buttonForSave.Click += new EventHandler(this.OnSaveSomething);

protected virtual void OnSaveSomething(object sender, EventArgs ea)
{
}

das hat jetzt nix mit idle zu tun. sowas macht man normalerweise im construktor bzw. in der InitializeComponent Funktion (wird meistens vom Designer anglegt)

20.08.2010 - 10:39 Uhr

hi.
* hast du mal alle fenster geschlossen, und dann ein rebuild gemacht?
* was passiert genau im Form1 Konstruktor? Ist Form1 widerrum abgeleitet von 3rdpartyform?

  • base() wird automatisch aufgerufen, wenn nix angegeben wird!
19.08.2010 - 09:56 Uhr

hatte zu schnell geantwortet. hatte da wohl linux im kopf.
was kommt den für eine fehlermeldung? access denied oder wie?

19.08.2010 - 09:31 Uhr

hi. für ports < 1024 brauchst du admin rechte.

19.08.2010 - 08:32 Uhr

lasst es mich anders formulieren:
kann ich dem webservice irgendwie sagen, dass er es ignorieren soll, dass meine Klasse Foo IXmlSerializable implementiert!?!

17.08.2010 - 13:46 Uhr

ersetz mal dein if(value != title) durch


bool b1 = value != title;
bool b2 = !value.Equals(title);
if(b1 && b2)

dann kannst du im debugger mal schauen, ob b1 und b2 in deinem fall beide true sind; also value wirklich ungleich title

17.08.2010 - 11:05 Uhr

Strings müssen immer mit .Equals() verglichen werden, ansonsten vergleichst Du die Adressen und nicht die Werte.

nein. das ist nur bei objecten so, die die == und != opertoren nicht überschreiben.
mit echten System.String's solltest du kein solches problem haben


var foo1 = "foo";
var foo2 = new string(new char[] { 'f', 'o', 'o' });

Console.WriteLine(foo1 == foo2);
Console.WriteLine(foo1 == "foo");
17.08.2010 - 10:52 Uhr

Hallo,

ich hab hier ne WebMethod Foo[] Bar();. das hatt auch lange so funktioniert.
im vergangen jahr hab ich dann irgendwann mal Foo IXmlSerializable implementieren lassen, mit dem hintergrund, dass ich paar wichtige details von Foo in einer Datei ablegen kann. in der datei brauch ich nur 1 bis 2 Properties von Foo, über den Webservice jedoch alle.
als ich jetzt gestern den webservice upgedatet hab, hab ich gemerkt, dass nun die Foo definition aus der wsdl verschwunden ist. stattdessen hab ich jetzt nur noch eine System.Data.DataSet[] Bar() (<- wurde mit wsdl.exe erzeugt)
wie biege ich das denn wieder gerade? ich hätt gern die selbe definition in meiner wsdl wie vorher.

16.08.2010 - 16:03 Uhr

das ding hat nen modem und network treiber

16.08.2010 - 15:21 Uhr

Hallo,

ich hab diverse surfsticks (o2, fonic, ...).
deren SMS feature würde ich gerne nutzen können.
also SMS die ankommen, würde ich gerne irgendwo anzeigen.
kann mich da jemand in ne richtige richtung lenken?

07.06.2010 - 18:55 Uhr

eine andere wäre sowas wie


public class Window<T> where T: Form, new()
    {
        public Window()
        {
            this.InnerForm = new T();
        }

        public T InnerForm
        {
            get; private set;
        }
    }

wobei man dann für Window all das neu schreiben müsste, was es für form schon gibt. da man dann auch keinen designer hat, müsste man dann von hand die controls hinzufügen. ist eben recht mühseelig.

07.06.2010 - 18:32 Uhr

Ich hab 2 Arten von Base-Formen.

class BaseForm : System.Windows.Forms.Form, ITransportHandler

und eine

class DockableBaseForm : Irgendeine.Andere.DockingLibrary.Form, ITransportHandler

Irgendeine.Andere.DockingLibrary.Form ist natürlich irgendwo eine System.Windows.Forms.Form, aber da komm ich erstmal nicht dran.

ich kann jetzt über das ITransportHandler interface daten an das fenster schicken.
Um die Sache noch komplizierter zu machen, gibt es auch

SpecialForm : BaseForm

und

SpecialDockableForm : DockableBaseForm 

. Beide stellen das selber da, aber das eine ist eben dockable, das andere nicht.

ist relativ dumm.

am liebsten hätte ich so eine art

class Window : Form 
{
    public Window(Form innerForm) 
    {
       this.InnerForm = form;
    }

    public Form InnerForm { get; private set; }
}

leider lassen sich ja aber nicht alle properties/funktionen von Form überschreiben, so dass ich eine Form ja nicht komplett wrappen kann.

hat sonst jemand ne idee wie ich das geschickt machen könnte?

14.05.2010 - 19:23 Uhr

ah, man muss doch noch bissle mehr tun


public class TabModelPersistenceHelperBinder : System.Runtime.Serialization.SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Type retval = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
            if(retval.Equals(typeof(Dictionary<string, List<string>>)))
                retval = typeof(Dictionary<string, HybridSet<string>>);
            else if(retval.Equals(typeof(KeyValuePair<string, List<string>>)))
                retval = typeof(KeyValuePair<string, HybridSet<string>>);
            else if (retval.Equals(typeof(List<string>)))
                retval = typeof(HybridSet<string>);
            return retval;
        }        
    }

14.05.2010 - 19:01 Uhr

hmm, so ganz einfach ist es nun doch nicht
hab jetzt folgendes


public class TabModelPersistenceHelperBinder : System.Runtime.Serialization.SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            Type retval = Type.GetType(String.Format("{0}, {1}", typeName, assemblyName));
            if(retval.Equals(typeof(Dictionary<string, List<string>>)))
                retval = typeof(Dictionary<string, HybridSet<string>>);
            return retval;
        }        
    }

werde auch auf gerufen, jedoch wird jetzt die Exception geworden, dass IConvertible implementiert werden muss.
Leider kann ich ja Dictionary<string, List<string>> nicht mehr von Iconvertible ableiten.
Gibts noch andere ideen?

14.05.2010 - 17:53 Uhr

wie sooft geb ich mir die antwort selbst:
Haber System.Runtime.Serialization.SerializationBinder gefunden (siehe Overriding Assembly / Type information auf http://www.diranieh.com/NETSerialization/BinarySerialization.htm#Advanced%20Serialization)
Denke mal, das wird mir weiter Helfen.

14.05.2010 - 16:21 Uhr

Hallo,

ich hab hier ein Projekt von nem ehemaligen Kollegen umgestellt, ein Member ist jetzt kein Dictionary<string, List<string>> mehr, sondern ein Dictionary<string, HybridSet<string>>

HybridSet<> ist eine Klasse von mir.

Nun kann man die Klasse mit eben diesem Member auch serialisieren.
Problem nun: es gibt eben alte Serialisiereungen, die sich natürlich mit der neuen Definition beißen:

Object of type 'System.Collections.Generic.Dictionary2[System.String,System.Collections.Generic.List1[System.String]]' cannot be converted to type 'System.Collections.Generic.Dictionary2[System.String,Collections.Generic.HybridSet1[System.String]]'.

kann ich das irgendwie mit einem Typconverter lösen?

nachtrag: ich hab schon mit operatoren überladungen rumprobiert, aber es scheint es nicht zu tun.

14.01.2010 - 14:33 Uhr

okay. dann musst du eben auch die Position property überlagern und ja nach dem den m_current setzen. anhand des der filelength weißt du ja, wann du den m_current ändern musst.

14.01.2010 - 14:11 Uhr

kenn das format nicht, aber wie wäre es mit sowas


class Streams : Stream
{
    private List<Stream> m_streams = new List<Stream>();
    private Stream m_current;

    public void AddStream(Stream s) { m_streams.Add(s); }    
}

jetzt implementierst du das interface so, dass solange vom m_current liesst, bis dieser weg "leer" ist und dann auf den nächsten springst.

14.01.2010 - 13:35 Uhr

Ich hab mir überlegt, ich baue stattdessen eine Art Drehscheibe, so änlich wie in einem Geldspielautomat und lasse immer nur einen Ausschnitt anzeigen, vielleicht komm ich damit weiter.

ich denke, wenn du die darstellen im bogen hast, ist das scrollen nicht mehr so schwer.
fang doch erstmal mit der bogendarstellung an. ich denke, wenn du das hast, wird dir der recht leicht fallen.

14.01.2010 - 13:00 Uhr

sqlite, oder mit online anbindung.

12.01.2010 - 19:31 Uhr

vorallem aber ist es in .net nciht möglich einzelne dll´s innerhalb einer appdomain wieder zu entladen. daher wäre es spannend wie dieses problem umgangen wird.?

ich denke, dass man das nicht mit appdomains hinbekommt, sondern eher auf die script schiene gehen muss. aber ich werd mal tüffteln.

ideen sind aber so oder so willkommen.

In Prinzip aber gerade für Serveranwendungen ne interessante Idee.

daher eben. genau dieses problem hab ich momentan

12.01.2010 - 19:28 Uhr

wie denn? wenn ein anderes objekt gerade diesen proxy verwendet, du aber die implementierung noch während der ausführung komplett änderst und methoden, die noch verwendet werden sollten (innhalb der ausführung), nicht mehr existieren oder mehr argumente verlangen oder oder oder.

der proxy weiß ja, ob die funktion gerade benutzt wird oder nicht.
solange sie läuft, macht sie was sie tut.

gibt es ne neue version, weiß sie das und läd sich erst beim nächsten aufruf neu.
das kann natürlich beliebig lang dauern, je nach dem viele abhängigkeiten nach sich gezogen werden.

willst du das für c# und .net machen?

erstmal nur c# code unterstützen.

12.01.2010 - 17:15 Uhr

das geht nur solange du non-breaking changes hast.

naja, wenn man den aufrufenden code mit abändert, sollte es immer noch möglich sein.

ich werde mal anfangen, nen prototypen zu bauen. bzw. hab ich schon angefangen.
wenn jmd lust hat mit zu machen, schieb ich es mal ins github.

12.01.2010 - 17:04 Uhr

Beim erstellen der Buttons schreib den Index in das Tag-Property des Buttons.

saubere wäre wohl, von Button abzuleiten und nen eigene Property drannageln.
irgendwann braucht man das Tag vielleicht für was anderes.

12.01.2010 - 17:01 Uhr

was mir auch gerade noch dazu einfällt: man könnte so ne art schichten model haben.
jede Klasse wird als interface umgewandelt in der einen schicht.

also aus "class Foo" wird z.B. interface MinkFoo, was all den public kram von Foo bekommt. und aus "new Foo()" wird dann z.B. "Mink.CreateProxy(typeof(Foo))"

der Proxy hat jetzt in einer anderen schicht den eigentlichen code von Foo. dieser kann dann dynamisch ausgetauscht werden.

12.01.2010 - 16:52 Uhr

mach dir nen meta container.
erst registrierst du den typ, schaust welche properties hast und legst die namen pro type ab, damit du sie später per namen setzen und lesen kannst


static class PropertyMetaContainer
{    

    public static void RegisterType(Type type)
    {
        PropertyInfo[] type.GetProperties(BindingFlags.Public|BindingFlags.Instance);
        // to register properties per type
    }

    public static string GetMetaData(Type type, string property)
    {
    }  

    public static void SetMetaData(Type type, string property, object data)
    {
    }
}

12.01.2010 - 16:18 Uhr

Hallo,

das ganze ist erstmal nur eine Idee.

Ziel:
eine Art Application Framework, dessen Funktionaliät komplett während der Laufzeit ändern kann. Anstatt sein Programm zu kompileren, wirft man es als code Mink zum fressen vor. Das ganze wird dann z.b. mit Hilfe von http://www.csscript.net/ interpretiert und gestartet.
Jetzt läuft das ganze. Jetzt ändert man als Entwickler etwas am Code und wirft es wieder der laufenden Mink application vor. Der Code wird jetzt ersetzt. Geht wohl nicht komplett, aber Teile davon. Beispiele wären z.B. Funktionen die irgendwas parsen oder konfiguration lesen.
Ist alles etwas schwammig, aber haltet ihr das überhauot für möglich (naja, möglich ist alles), aber auch vom aufwand "überschaubar".

Meinung sind gefragt.

03.11.2009 - 17:26 Uhr

hast du da was gefunden? hab jetzt mal auf neuste hibernate + neuste mysql.data.dll umgestellt, jetzt selber fehler.

15.10.2009 - 12:54 Uhr

nein!

void x() { while(true); }

😉

15.10.2009 - 09:15 Uhr

cool, sehr geil. es geht.
wenn jmd den Code brauch, einfach bescheid geben.

14.10.2009 - 11:21 Uhr

Hallo,

ich hab eine Expression Klasse und auch einen ExpressionEditor, als auch den Editor mit einem UITypeEditor an die Expression gebunden.
Die Klasse Strategy hat mehrere solche Expressions. Strategy Objekte werden über das PropertyGrid editiert. und ich bin auch in der lage, die expression mit dem Editor zu editieren.
leider kann ich die expressions nun im propertygrid nicht mehr per "hand" editieren, heißt ich muss immer erst das kleine knöpfchen neben der expression klicken, damit der editor geöffnet wird.
Ich möchte aber auch einfach die expression direkt im propertygrid ändern (also wie ein object vom typ string)
weiß jmd, ob ich das beides kombinieren kann?

18.06.2009 - 13:33 Uhr

liegt es auch im licht, also dahinter?

16.06.2009 - 14:28 Uhr

habs jetzt; fürs archiv:


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Ox.WireMon.Lib.Database.Objects"
                   assembly="WireMonLib">

  <class name="ObjTraffic" table="wm_traffic">
    <id name="Id" column="id" type="Int32">
      <generator class="identity"/>
    </id>
    <property name="Direction" column="dir" type="Int32" />
    <property name="DestinationAddress" column="dst" type="String" />    
    <property name="LocalAddress" column="lcl" type="String" />
    <property name="DestinationPort" column="dst_port" type="Int32" />    
    <property name="DataLength" column="length" type="Int32" />
    <property name="TimeStamp" column="timestamp" type="DateTime" />    
  </class>

  <class name="ObjTrafficSummary">
    <composite-id>
      <key-property name="Year" type="Int32" />
      <key-property name="Month" type="Int32" />
      <key-property name="Day" type="Int32" />
      <key-property name="Upload" type="Int64" />
      <key-property name="Download" type="Int64" />
      <key-property name="Total" type="Int64" />
    </composite-id>
  </class>

  <sql-query name="trafficSummary">
    <return alias="ts" class="ObjTrafficSummary" />
    <![CDATA[
    SELECT
              YEAR(  ts.timestamp               ) AS Year,
              MONTH( ts.timestamp               ) AS Month,
              DAY(   ts.timestamp               ) AS Day,
              SUM(   IF(ts.dir=0, ts.length, 0) ) AS Upload,
              SUM(   IF(ts.dir=1, ts.length, 0) ) AS Download,
              SUM(   ts.length                  ) AS Total
    FROM      wm_traffic ts
    GROUP BY  Day
  ]]>
  </sql-query>

  </hibernate-mapping>


namespace Ox.WireMon.Lib.Database.Objects
{    
    public class ObjTrafficSummary
    {
        private long m_upload, m_download, m_total;
        private int m_day, m_month, m_year;

        public ObjTrafficSummary() { }

        public virtual int Day
        {
            get { return m_day; }
            set { m_day = value; }
        }

        public virtual int Month
        {
            get { return m_month; }
            set { m_month = value; }
        }

        public virtual int Year
        {
            get { return m_year; }
            set { m_year = value; }
        }

        public virtual long Upload
        {
            get { return m_upload; }
            set { m_upload = value; }
        }

        public virtual long Download
        {
            get { return m_download; }
            set { m_download = value; }
        }

        public virtual long Total
        {
            get { return m_total; }
            set { m_total = value; }
        }

        public override bool Equals(object obj)
        {            
            return this.GetHashCode() == obj.GetHashCode();
        }

        public override int GetHashCode()
        {
            return string.Format(
                "{0}.{1}.{2}:{3}.{4}.{5}", 
                this.Year, this.Month, this.Day,
                this.Upload, this.Download, this.Total
            ).GetHashCode();
        }
    }
}

16.06.2009 - 09:54 Uhr

so ganz versteh ich es ja nicht.
hab jetzt die query angepasst


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Ox.WireMon.Lib.Database.Objects"
                   assembly="WireMonLib">

  <class name="ObjTraffic" table="wm_traffic">
    <id name="Id" column="id" type="Int32">
      <generator class="identity"/>
    </id>
    <property name="Direction" column="dir" type="Int32" />
    <property name="DestinationAddress" column="dst" type="String" />    
    <property name="LocalAddress" column="lcl" type="String" />
    <property name="DestinationPort" column="dst_port" type="Int32" />    
    <property name="DataLength" column="length" type="Int32" />
    <property name="TimeStamp" column="timestamp" type="DateTime" />    
  </class>

  <sql-query name="trafficSummary">
    <return alias="trafficSummary" class="ObjTrafficSummary" />
    <![CDATA[
    SELECT
              YEAR(  timestamp                  ) AS trafficSummary.Year,
              MONTH( timestamp                  ) AS trafficSummary.Month,
              DAY(   timestamp                  ) AS trafficSummary.Day,
              SUM(   IF(direction=1, length, 0) ) AS trafficSummary.Upload,
              SUM(   IF(direction=2, length, 0) ) AS trafficSummary.Download,
              SUM(   length                     ) AS trafficSummary.Total
    FROM      wm_traffic trafficSummary
    GROUP BY  trafficSummary.Day
  ]]>
  </sql-query>

  </hibernate-mapping>

und ne neue klasse geschrieben.


namespace Ox.WireMon.Lib.Database.Objects
{
    public class ObjTrafficSummary
    {
        private long m_upload, m_download, m_total;
        private int m_day, m_month, m_year;

        public ObjTrafficSummary() { }

        public virtual int Day
        {
            get { return m_day; }
            set { m_day = value; }
        }

        public virtual int Month
        {
            get { return m_month; }
            set { m_month = value; }
        }

        public virtual int Year
        {
            get { return m_year; }
            set { m_year = value; }
        }

        public virtual long Upload
        {
            get { return m_upload; }
            set { m_upload = value; }
        }

        public virtual long Download
        {
            get { return m_download; }
            set { m_download = value; }
        }

        public virtual long Total
        {
            get { return m_total; }
            set { m_total = value; }
        }
    }
}

wenn ich jetzt die query ausführe, bekomm ich


NHibernate.MappingException: No persister for: Ox.WireMon.Lib.Database.Objects.ObjTrafficSummary, WireMonLib, Version=1.0.0.0, Culture
neutral, PublicKeyToken=null
   at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String className, Boolean throwIfNotFound)
   at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String className)
   at NHibernate.Loader.Custom.SQLQueryReturnProcessor.GetSQLLoadable(String entityName)
   at NHibernate.Loader.Custom.SQLQueryReturnProcessor.ProcessRootReturn(SQLQueryRootReturn rootReturn)
   at NHibernate.Loader.Custom.SQLQueryReturnProcessor.ProcessReturn(ISQLQueryReturn rtn)
   at NHibernate.Loader.Custom.SQLQueryReturnProcessor.Process()
   at NHibernate.Loader.Custom.SQLCustomQuery..ctor(ISQLQueryReturn[] queryReturns, String sqlQuery, ICollection additionalQuerySpaces, ISessionFactoryImplemen
or factory)
   at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results)
   at NHibernate.Impl.SessionImpl.List[T](NativeSQLQuerySpecification spec, QueryParameters queryParameters)
   at NHibernate.Impl.SqlQueryImpl.List[T]()

obwohl die Klasse in dem Assembly enthalten ist

15.06.2009 - 17:49 Uhr

danke, das hilft mir jetzt weiter.

15.06.2009 - 17:13 Uhr

ich versteh folgendes nicht.

Mein ObjTraffic Object hat kennt ja nur seine Properties Dirction, DestinationAddress, LocalAddress, DestinationPort, DataLength, TimeStamp

Meine Query verlangt ja aber schon die "Properties" Download, Upload und Total. Da ich .NET 2 benutzte, ist mir z.B. da schon nicht klar, wie ich später diese Properties ansprech; außerdem weiß ich auch nicht, wie ich z.B. SUM( IF(direction=1, length, 0) ) as Upload im Select angebe. Normalerweise hab ich immer nur SUM z.b. im WHERE clause eingesetzt.

15.06.2009 - 16:41 Uhr

verwendetes Datenbanksystem: MySQL 5

Ich hab folgende Tabelle


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   namespace="Ox.WireMon.Lib.Database.Objects"
                   assembly="WireMonLib">

  <class name="ObjTraffic" table="wm_traffic">
    <id name="Id" column="id" type="Int32">
      <generator class="identity"/>
    </id>
    <property name="Direction" column="dir" type="Int32" />
    <property name="DestinationAddress" column="dst" type="String" />    
    <property name="LocalAddress" column="lcl" type="String" />
    <property name="DestinationPort" column="dst_port" type="Int32" />    
    <property name="DataLength" column="length" type="Int32" />
    <property name="TimeStamp" column="timestamp" type="DateTime" />    
  </class>

  
</hibernate-mapping>

und würde gerne folgende query drauf anwenden:


SELECT
YEAR(timestamp) as year,
SUM( IF(direction=1, length, 0) ) as Upload,
SUM( IF(direction=2, length, 0) ) as Download,
SUM( length ) as Total
FROM wm_traffic
GROUP BY year

hab nur keinen blassen wie ich da das Icriteria object füttern muss.