ist jetzt schon länger her. hast du es hinbekommen?
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!
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 { .... };
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!
den (object) cast kannst du dir sparen. in c# ist ja alles ein object!
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?
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!
vielleicht hilft dir folgender link weiter http://notgartner.wordpress.com/2007/09/06/using-certificate-based-authentication-and-protection-with-windows-communication-foundation-wcf/
meine google query dazu: http://www.google.com/search?hl=en&client=firefox-a&hs=YQW&rls=org.mozilla%3Ade%3Aofficial&q=wcf+client+authentication+certificate&aq=2&aqi=g3&aql=&oq=wcf+client+auth&gs_rfai=
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!
würde ja mal den kompeltten WebRequest teil in ein try { } catch { } auslagern
und fehlermeldungen richtig abfangen!
dann mal
tooltip.Show("Hallo Welt", (sender as ToolStripMenuItem).Owner.Parent, Control.MousePosition);
natürlich ggf. noch überall auf null checken
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);
}
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)});
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)
hi.
* hast du mal alle fenster geschlossen, und dann ein rebuild gemacht?
* was passiert genau im Form1 Konstruktor? Ist Form1 widerrum abgeleitet von 3rdpartyform?
hatte zu schnell geantwortet. hatte da wohl linux im kopf.
was kommt den für eine fehlermeldung? access denied oder wie?
hi. für ports < 1024 brauchst du admin rechte.
lasst es mich anders formulieren:
kann ich dem webservice irgendwie sagen, dass er es ignorieren soll, dass meine Klasse Foo IXmlSerializable implementiert!?!
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
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");
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.
das ding hat nen modem und network treiber
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?
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.
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?
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;
}
}
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?
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.
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.Dictionary
2[System.String,System.Collections.Generic.List
1[System.String]]' cannot be converted to type 'System.Collections.Generic.Dictionary2[System.String,Collections.Generic.HybridSet
1[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.
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.
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.
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.
sqlite, oder mit online anbindung.
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
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.
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.
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.
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.
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)
{
}
}
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.
hast du da was gefunden? hab jetzt mal auf neuste hibernate + neuste mysql.data.dll umgestellt, jetzt selber fehler.
nein!
void x() { while(true); }
😉
cool, sehr geil. es geht.
wenn jmd den Code brauch, einfach bescheid geben.
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?
liegt es auch im licht, also dahinter?
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();
}
}
}
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
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.
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.