Blob-Feld auslesen

6. Dezember 2016 12:35

Hallo,

ich bin ganz neu im Navision Umfeld und habe ein problem, zu welchem ich keine Lösung finde.
Ich habe im Artikelstamm ein Beschreibungsfeld (in SQL als Typ Image) und muss dies mit c# auslesen.
Leider habe ich bisher keine Möglichkeit gefunden das Feld richtig auszulesen. Ich bekomme immer irgendwelche komischen Zeichen zurück.

Ich habe schon viele sachen probieret, aber leider funktioniert nichts davon.
Anbei mein letzter Versuch und ich wäre super happy wenn mir jemand helfen könnte.

Code:
internal string ReadTextData()
        {

            //zuerst lese ich das Feld in eine Datei ein     
            SqlConnection con = SQL.getSQL_NAV_Connection();
            SqlDataAdapter da = new SqlDataAdapter("SELECT [Formatted Text]  as test FROM[TEST$Extended Text Line]  WHERE(No_ = 'X0000004') AND([Table Name] = 2) AND(Type = 0) ", con);
            SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
            DataSet ds = new DataSet("[TEST$Extended Text Line]");

            byte[] MyData = new byte[0];

            da.Fill(ds, "[TEST$Extended Text Line]");
            DataRow myRow;
            myRow = ds.Tables["[TEST$Extended Text Line]"].Rows[0];

            MyData = (byte[])myRow["test"];
            int ArraySize = new int();
            ArraySize = MyData.GetUpperBound(0);

            FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("~/") + "Artikelbeschreibung.bin", FileMode.OpenOrCreate, FileAccess.Write);
            fs.Write(MyData, 0, ArraySize);
            fs.Close();

            string note = string.Empty;

            using (StreamReader streamReader = new StreamReader(HttpContext.Current.Server.MapPath("~/") + "Artikelbeschreibung.bin"))
            {
                using (BinaryReader reader = new BinaryReader(streamReader.BaseStream))
                {
                    note = reader.ReadString();
                    reader.Close();
                }

                streamReader.Close();
            }
            return "";
        }

Re: Blob-Feld auslesen

7. Dezember 2016 08:47

Hi Scrat,

BLOB Felder sind komprimiert, ergo müsstest du sie nach dem auslesen dekomprimieren und dürftest diese dann lesen können.

Code:
public long Decompress(Stream input, Stream output) {
    byte[]  buffer = new byte[BUFFER_SIZE];
    long    nBytes = 0;
     
    using (input = new DeflateStream(input, CompressionMode.Decompress)) {
        int length;
        while ((length = input.Read(buffer, 0, buffer.Length)) >= 0) {           
            output.Write(buffer, 0, length);
            nBytes += length;
        }
    }   
    return nBytes;
}


So etwas in der Richtung müsstest du bauen

Gruß

Re: Blob-Feld auslesen

7. Dezember 2016 11:27

Hallo PNeu,

danke für die Info, leider scheint das nicht zu klappen, ich bekommen immer die Fehlermeldung "Die Blocklänge entspricht nicht dem Komplement".
Hast du noch eine Idee?

Viele Grüße

Re: Blob-Feld auslesen

7. Dezember 2016 14:13

Hi,

lass die ersten 2 Ziffern mal weg meist ist das sowas wie 0x für hexadecimal oder andere Präfixe.

Gruß

Re: Blob-Feld auslesen

7. Dezember 2016 17:26

HI,

danke, aber leider erhalte ich damit die gleiche Info.
Bist du sicher das die Felder wirklich Kompremiert sind?
Wir haben einen SQL-Standard und laut meiner Info, ist eine Kompremierung nur beim Enterprise möglich?

Viele Grüße und herzlichen Dank für die Unterstützung.

Re: Blob-Feld auslesen

7. Dezember 2016 17:36

Hi,

hier mal eine möglicherweise hilfreiche Quelle (ist zwar 2013, aber versuch macht klug ;-)

https://devch.wordpress.com/2014/01/21/accessing-compressed-blobs-from-outside-nav-nav2013-revisited/

Re: Blob-Feld auslesen

7. Dezember 2016 17:45

das hatte ich bereits versucht und klappt nicht.
Ich versteht das echt nicht.

Re: Blob-Feld auslesen

17. April 2018 13:39

Scrat2006 hat geschrieben: die Fehlermeldung "Die Blocklänge entspricht nicht dem Komplement".

Falls mal jemand danach sucht:
Diese irreführende Meldung hatten wir heute, weil eine der Zip-Dateien, die in einem Verzeichnis entpackt werden sollten (mit Funktion ExtractZipFile in Codeunit 419 aus NAV 2018), verschlüsselt war (wie mein Kollege nach längerer Suche entdeckt hat).