Laden...

Forenbeiträge von eXmaTri Ingesamt 11 Beiträge

02.11.2010 - 17:12 Uhr

Hallo,
vielen Dank mit deinen Tips geht es jetzt!

Einer meiner Denkfehler war nicht die "lokale" Tabellenspalte sondern die, auf welche verweist wird anzugeben. Das dann ForeignKey anstatt Column da stand, ist dem testen (try and error) geschuldet.

Nach Anforderung muss ich MS Access als Datenbank benutzen, google lieferte für "NHibernate ms access" immer den Hinweis auf Jet.

werde deinen Tip befolgen und mir die Hbm Mappings anschauen.

Gruß & Danke

01.11.2010 - 17:53 Uhr

verwendetes Datenbanksystem: MS Access

Hallo Zusammen,
in meinen aktuellen Projekt geht es um Bildbearbeitung. Die bearbeiten Bilder sollen in einer Datenbank verwaltet werden. Für das Handtieren der Datenbank wird NHibernate (2.1.2.4000) mit Fluent NHibernate, NHibernate.Linq und NHibernate.JetDriver eingesetzt.

Ein Datensatz (z.B. für ein SchwarzWeiß-Bild) enthält ForeignKeys zu Stammdaten (Uhrzeit, Datum, Speicherpfad etc.)

Beim Versuch den ersten Datensatz mit foreign Keys zu lesen gibt es eine

Exception aus dem OleDbCommandExcecuteReader:
[I]System.Data.OleDb.OleDbException occurred
  Message=Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.
  Source=Microsoft JET Database Engine
  ErrorCode=-2147217904
  StackTrace:
       bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       bei System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       bei System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
       bei NHibernate.JetDriver.JetDbCommand.ExecuteDbDataReader(CommandBehavior behavior) in D:\programmieren\NHibernate.Jet\NHibernate.JetDriver\JetDbCommand.cs:Zeile 145.
  InnerException: 
[/I]

Dies führt zu einer ADOException aus NHibernate:


[I]NHibernate.ADOException occurred
  Message=could not execute query
[ SELECT this_.ID as ID11_0_, this_.Dataset_id as Dataset2_11_0_, this_.BasicClaimsData_id as BasicCla3_11_0_, this_.Channel_id as Channel4_11_0_ from `BWPicture` this_ ]
[SQL: SELECT this_.ID as ID11_0_, this_.Dataset_id as Dataset2_11_0_, this_.BasicClaimsData_id as BasicCla3_11_0_, this_.Channel_id as Channel4_11_0_ from `BWPicture` this_]
  Source=NHibernate
  SqlString=SELECT this_.ID as ID11_0_, this_.Dataset_id as Dataset2_11_0_, this_.BasicClaimsData_id as BasicCla3_11_0_, this_.Channel_id as Channel4_11_0_ from `BWPicture` this_
  StackTrace:
       bei NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
       bei NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters)
       bei NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes)
       bei NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session)
       bei NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results)
       bei NHibernate.Impl.CriteriaImpl.List(IList results)
       bei NHibernate.Impl.CriteriaImpl.List()
       bei EarthProject.Basics.Database.Wrapper.DatabaseWrapper.GetAllGeneric[T]() in D:\programmieren\softwarebeleg\test\program\src\Basics\Database\Wrapper\DatabaseWrapper.cs:Zeile 224.
[/I]

Das lesen von Datensätze ohne ForeignKeys funktioniert ohne Probleme.
So sehen meine Entität und Mapping Klassen aus:


public class BWPicture
{
        public virtual int ID { get; private set; }
        public virtual Datasets Dataset { get; set; }
        public virtual BasicClaimsData BasicClaimsData { get; set; }
        public virtual SpectralData Channel { get; set; }
}

public class BWPictureMap:ClassMap<BWPicture>
{
        public BWPictureMap()
        {
            Id(x => x.ID).UniqueKey("ID");
            References(x => x.Dataset).ForeignKey("ID");
            References(x => x.BasicClaimsData).ForeignKey("ID");
            References(x => x.Channel).ForeignKey("ID");
       }
}

So lege ich meine SessionFactory an:


internal static class NHibernateConfiguration
{
        internal static ISessionFactory CreateSessionFactory(string pathToDataBase)
        {
            return Fluently.Configure()
                .Database(
                        JetDriverConfiguration.Standard.ConnectionString(c => c.DatabaseFile(pathToDataBase))
                        )                
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<RGBPictureMap>())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<BWPictureMap>())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SpectralData>())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<BasicClaimsData>())
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Datasets>())                
                .BuildSessionFactory();
        }
}

So versuche ich z.B. alle SchwarzWeiß-Bilder aus der Datenbank auszulesen:


        private IEnumerable<T> GetAllGeneric<T>()
        {
            IEnumerable<T> _Result = null;
            ISessionFactory _SessionFactory = NHibernateConfiguration.CreateSessionFactory(DataBasePath);
            ISession _Session = _SessionFactory.OpenSession();
            ITransaction _Transaction = null;
            try
            {
                _Transaction = _Session.BeginTransaction();
                IEnumerable<T> _TempStore = from set in _Session.Linq<T>()
                                            select set;
                _Result = CreateCopy<T>(_TempStore);
            }
            catch (Exception e)
            {
                throw new DataBaseAccessException(String.Format("Error reading items: {0} Stacktrace: {1}", e.Message, e.StackTrace), DataBasePath, typeof(T));
            }
            finally
            {
                if (_Transaction != null) _Transaction.Dispose();
                if (_Session != null) _Session.Close();
            }

            return _Result;
        }

Ich habe anstatt des Linq auch schon IList _TempStore = _Session.CreateCriteria(typeof(T)).List(); probiert.... selbes Ergebnis.

Versteht jemand warum es immer zu dieser Exception kommt und was man dagegen machen kann?

Danke Schomal!

30.01.2009 - 16:09 Uhr

*bump*

Jemand eine Idee?

09.12.2008 - 08:34 Uhr

Hallo All,
hat noch jemand eine Idee?
Mache ich etwas generelles falsch?

Gruß
eXmaTri

04.12.2008 - 07:50 Uhr

Hallo Xynratron,
erstmal vielen Dank für deine Antwort.

Einen string zurück liefern ist kein Problem (hatte als Test den Pfad des Servers zurück geliefert).

Um Sicherzustellen das, dass clipboard gefüllt ist, habe ich immer vor Starten des Servers einen Text kopiert und diesen vom Server ausgeben lassen.

€dit: Und so geh ich sicher das ich ein Datenobject bekomme

Debug.Assert(Clipboard.GetDataObject() != null);

Mit den sniffen des Datenverkehrs ist ne gute Idee.

Gruß & Danke
eXmaTri

03.12.2008 - 15:36 Uhr

Hallo All,
ich arbeite mich gerade in .Net Remoting ein und versuche ein Tool zu schreiben, was dass IDataObject aus dem ClipBoard über Remoting zur Verfügung stellt.

Interface:


    public interface IClipBoardSyncer
    {
        IDataObject ShareClipBoard();
    }

ServerObject:


[Serializable]
    public class ClipBoardData : MarshalByRefObject, IClipBoardSyncer
    {
        public ClipBoardData()
        {
            //will call during remoting access
        }

        #region IClipBoardSyncer Members

        public IDataObject ShareClipBoard()
        {
            //should run on server
            return Clipboard.GetDataObject();
        }
       #endregion
    }

Server:


     //init instance of data object
     m_Data = new ClipBoardData();

     //set up server channel

     BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
     serverProvider.TypeFilterLevel = TypeFilterLevel.Full; //required for remote access to data objects
     IDictionary properties = new Hashtable();
     properties.Add("port",4711); //maybe the only relevant property?!

     DataChannel = new TcpChannel(properties, null, serverProvider);   //BinaryClientFormatterSinkProvider is not needed
     ChannelServices.RegisterChannel(DataChannel, false); //false mean no security > TODO
 
      RemotingServices.Marshal(m_Data, "myData"); //publish object under name myData

Client:


      //set up client channel

      BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
      serverProvider.TypeFilterLevel = TypeFilterLevel.Full; //required for remote access to data objects

      IDictionary properties = new Hashtable();
      properties.Add("port", 0); //used by most how to's

      DataChannel = new TcpChannel(properties, null, serverProvider);
      ChannelServices.RegisterChannel(DataChannel, false); //BinaryClientFormatterSinkProvider is not needed
      IClipBoardSyncer data = (IClipBoardSyncer)Activator.GetObject(typeof(IClipBoardSyncer), "tcp://localhost:4711/myData"); //TODO: add alternative to choose customized ips

      //call method (running on remote server)
      IDataObject clip = data.ShareClipBoard();

Leider liefert ShareClipBoard immer null zurück. Ich habe schon versucht beim Server anstatt RemotingServices.Marshal()
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ClipBoardData),"myData", WellKnownObjectMode.SingleCall); zu verwenden.
Oder ich habe Probiert das IDataObject vom ClipBoard zu wrappen:


    [Serializable]
    public class MyDataObject: MarshalByRefObject
    {
        public MyDataObject()
        {
            
        }

        public IDataObject GetClipBoardData()
        {
            return Clipboard.GetDataObject();
        }
    }

Leider alles ohne Erfolg. Dann habe ich probiert den RemoteHelper zu verwenden (thx @ Rainbird schöne Dll).
Server:


    RemotingHelper.PublishObjectOverTCP(m_Data, "myData", 4711, false, false);

Client:


    IClipBoardSyncer sync = (IClipBoardSyncer)RemotingHelper.GetRemoteObjectOverTCP(typeof(IClipBoardSyncer), "myData", "localhost", 4711, false, false);
    IDataObject dataObj = sync.ShareClipBoard();

Aber auch da bekomme ich für mein IDataObject null zurück. Meine Schlussfolgerung ist das ich irgendwas total falsch verstanden haben muss 😃

Ist es nicht so das Activator.GetObject an dem Server eine Instanz des spezifizierten Objectes anlegt und die Methode IClipBoardSyncer.ShareClipBoard() auf dem Server an dieser Instanz ausgeführt wird?

Oder habe ich etwas anderes Grundlegend falsch gemacht?

Gruß & Vielen Dank für die Hilfe, ich habe viele Tutorials, How Tos, threads zu dem Thema gesucht und gefunden, leider keine Lösung für mein Problem.

eXmaTri

03.06.2007 - 19:38 Uhr

neue Version des Quelltextes!

03.06.2007 - 19:30 Uhr

Hmm leider stürzt das Programm ab wenn man einen Pfad Wählt der Leerzeichen enthält (z.B. Eigene Dateien).

€dit: Hab den Fehler entdeckt Uri.AbsolutPath ersetzt ein Leerzeichen durch %20 und dann zerhaut es einen beim Speichern!
Lösung: Uri.LocalPath

neue exe

03.06.2007 - 17:45 Uhr

und hier noch der Quell text!

Ach so beinah vergessen, mein Programm bindet sich gegen .NET 1.1.
Und ich habe es unter die GPL gestellt.

Edit:
(03.06.2007-20:57) update der Sources auf neuste Version

03.06.2007 - 17:38 Uhr

Hi all,
ich hab mal ein kleines Programm geschrieben, was wenn man einen Screenshot macht, diesen unter dem Ausgewählten Pfad, mit dem Ausgewählten Namen und dem Ausgewählten Bildtyp speichert.

  • geht in systray wenn Starten geklickt wurde
  • unterstüzt werden bmp, jpg und png
  • funktioniert aktuell nicht für ALT + DRUCK
  • an die Namen der Bilder wird automatisch eine Nummer angehängt

Viel Spaß damit!

Gruß

Hier erstmal die exe

Edit:
(03.06.2007-20:57) Okay sorry! Die neuste Version gibts immer in den obersten Posts

03.02.2007 - 14:05 Uhr

Hi all,
mich würde mal interessieren ob es in der großen C# Klassenbibliothek irgend welche Funktionen gibt um mit Audio formaten zu arbeiten. Ich beabsichtige ein Programm zu schreiben das aac (aac+) in mp3 zu verwandeln und/oder aac Dateien schneiden kann.
Oder kann mir jemand einen link geben zu dem know how über den Aufbau einer AAC+ /mp3 Datei um das zu verwirklichen?
Ich weis es ist das Falsche Forum, aber das Topic passte und ich wollte keinen neuen Thread eröffnen.

Schonmal vielen Dank