[Gelöst] Ein Stream an Navision von .NET

8. Juni 2007 14:24

Hallo!

Ich versuche einen .NET-Stream nach Navision zu bekommen, um anschließend diesen für den XML-Port zu verwenden. Dabei benutze ich folgenden Beispiel:
MIBUSO

Folgende Routine in C# soll dabei einen Stream als VAR-Parameter an Navision liefern:

Code:
      public bool SendToNavision([Out, MarshalAs(UnmanagedType.AsAny)] object COMStream, string fileName)
      {
         IStream COMStream1 = COMStream as IStream;
         this.rwBytes = Marshal.AllocHGlobal(4);
         int bytes = 0;
         byte[] buffer1 = new byte[0xafc8];
         FileStream reader = new FileStream(fileName, FileMode.Open);
         //IStream COMStream = new IStream();
         int _rwBytes = 0xafc8;
         bool result = true;
         int bytesRead = 0;
         do
         {
            bytesRead = reader.Read(buffer1, 0, _rwBytes);
            Marshal.WriteInt32(this.rwBytes, bytesRead);
            COMStream1.Write(buffer1, bytesRead, this.rwBytes);
         }
         while (bytesRead > 0);

            //COMStream1.Commit(0);
         reader.Close();
         reader.Dispose();
         Marshal.FreeHGlobal(this.rwBytes);
         return result;
      }


Wie folgt, soll es Navision dann ausgelsen werden:
Code:
Rec.INIT;
Rec.INSERT;
Rec.BlobData.CREATEINSTREAM(InStr);

CREATE(StreamTest);
RetVal :=StreamTest.SendToNavision(InStr,'C:\toNAV.xml');
Rec.MODIFY;

XMLPORT.IMPORT(80003, InStr); //Hier ist der InStr schon leer!!!


Das Problem dabei ist, dass wenn der InStr in ein XMLPort eingelesen wird kommt eine XML-Parser Fehlermeldung, dass keine Daten vorhanden sind.
In das BLOB-Feld werden Daten aber wunderbar geschrieben!?!?!

Wie könnte man das Problem anders lösen?
Mir würde es auch reichen die Daten von dem BLOB nach XMLPort zu kopieren, leider habe ich bis jetzt dazu auch keine Lösung finden :-(

8. Juni 2007 16:16

Das Problem konnte ich jetzt über das BLOB-Feld lösen können:

Code:
Rec.INSERT;
Rec.BlobData.CREATEINSTREAM(InStr);

CREATE(StreamTestAutom);
RetVal := StreamTestAutom.SendToNavision(InStr,'C:\toNAV.xml');
Rec.MODIFY;

Rec.BlobData.CREATEINSTREAM(InStr);  //Nochmal ein InStream erzeugen
XMLPORT.IMPORT(80003, InStr);  //Und schon geht alles!!

12. Juni 2007 11:32

hallo f.ritz

Kannst Du noch was zur Performance sagen? Wie siehts aus wenn man grössere Dateien (>10 mb) streamt?

wakestar