Laden...

Firebird BLOB .NET Provider mit DataReader lesen

Erstellt von ChristofS vor 18 Jahren Letzter Beitrag vor 18 Jahren 9.929 Views
C
ChristofS Themenstarter:in
34 Beiträge seit 2005
vor 18 Jahren
Firebird BLOB .NET Provider mit DataReader lesen

Hallo,
ich möchte gerne ein BLOB mit Textinhalt mit einem DataReader (Firebird .NET Provider) lesen.

Es handelt sich nicht um ein CLOB sondern um ein BLOB mit Text gegebenfalls auch noch mit Formatierinformationen (wie ein z.B. beim RTF).

Wie kann ich das auslesen und z.B. in ein String umwandeln? Ich habe nur Code-Beispiele gefunden indem eine Datei auf die Festplatte geschrieben wird (bei z.B. Bildern). Das will ich ja nicht machen, soll alles im Speicher passieren.

Hat jemand eine Idee und gegebenfalls ein Codebeispiel ?

Gruß
Christof

B
13 Beiträge seit 2005
vor 18 Jahren

Hänge gerade bei dem selben Problem allerdings in MySQL.
Möchte einen Text auslesen (BLOB) und diesen dann in eine TextBox einfügen.

4.221 Beiträge seit 2005
vor 18 Jahren

Schön stufenweise 🙂

Blob --> byte[]

MemoryStream kann den im Construcor brauchen

mit dem nun erstellen MemoryStream kannst Du einen StreamReader anwerfen...

Und Mit StreamReader.ReadToEnd kriegste alles als string.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

B
13 Beiträge seit 2005
vor 18 Jahren

Bin blond, also verzeih mir 😉

Ja habe es ähnlich hingekriegt, danke nochmals für Deine Mühen 😉

U
91 Beiträge seit 2004
vor 18 Jahren

@Christof

irgendwie kam mir das Posting doch gerade bekannt vor. Ich muß doch feststellen das ich nicht der einzige Delphianer bin der umgestiegen ist.

@Programmierhans & beforegod

Wenn ihr einen Blob mit Textinhalt als string behandelt geht das auch problemlos! Nur bei wirklich binärem Inhalt muß ich über Streams gehen.


Gruß
Uwe

A
196 Beiträge seit 2005
vor 18 Jahren

Original von Programmierhans
Schön stufenweise 🙂

Blob --> byte[]

MemoryStream kann den im Construcor brauchen

mit dem nun erstellen MemoryStream kannst Du einen StreamReader anwerfen...

Und Mit StreamReader.ReadToEnd kriegste alles als string.

Ich kann auch kein Text aus mysql richtig auslesen also habe ich das gemacht was du geschireben hast:

String b2="Select text from talk Where titel='"+titel+"' and datum='"+datum+"';";
				MySQLCommand com  = new MySQLCommand(b2,this.con);
				read=(MySQLDataReader) com.ExecuteReader();
				System.Text.Encoding encoding=System.Text.Encoding.Default;
				while(read.Read())
				{
					byte[] test=encoding.GetBytes(read[0].ToString());
					MemoryStream ms=new MemoryStream(test);
					StreamReader st=new StreamReader(ms);
					
					MessageBox.Show(st.ReadToEnd());
				}

Der Text wird aber nicht ausgegeben 🙁

S
34 Beiträge seit 2005
vor 18 Jahren

Hallo,

folgenden Code habe ich mir mal aus unterschiedlichen Quellen zusammengestellt.
Das Feld DOKUMENT ist in der Firebird-DB als BLOB SUB_TYPE 0 SEGMENT SIZE 80 eingerichtet. Get_Doku lädt alles in ein globalen Memorystream, dem es wurscht ist, ob Bild, Text, Word, Exel, PDF oder was anderes gespeichert wurde.

Die Extrahierung von Text könnte dann so aussehen:

string s= Encoding.UTF7.GetString(TSpeicher.GetBuffer(),0,(int)TSpeicher.Length);


public MemoryStream TSpeicher;


public bool Get_Doku (int Index)// lädt ein Dokument in Speicher
{

  int idx = (int) primaer.Tables["Info_Doku"].Rows[Index]["NR"]; // realen Index der tabelle holen
  FbCommand PicCMD = new FbCommand("SELECT DOKUMENT FROM DOKUMENTE where NR= @INDEX", con);
  PicCMD.Parameters.Add("@INDEX", SqlDbType.Int).Direction = ParameterDirection.Input;
  PicCMD.Parameters["@INDEX"].Value=idx;
  FbDataReader Reader = PicCMD.ExecuteReader(CommandBehavior.SequentialAccess);
  try
  {
    TSpeicher = new MemoryStream();
    msbw = new BinaryWriter(TSpeicher);
    int bufSize = 100;                   // Size of the BLOB buffer.
    byte[] obyte = new byte[bufSize];  // The BLOB byte[] buffer to be filled by GetBytes.
    long returnval;                            // The bytes returned from GetBytes.
    long beginnIndex = 0;                    // The starting position in the BLOB output.
    while (Reader.Read())
    {
      // Reset the starting byte for the new BLOB.
      beginnIndex = 0;

      // Read the bytes into outbyte[] and retain the number of bytes returned.
      returnval = Reader.GetBytes(0, beginnIndex, obyte, 0, bufSize);

      // Continue reading and writing while there are bytes beyond the size of the buffer.
      while (returnval == bufSize)
      {
        msbw.Write(obyte);
        msbw.Flush();

        // Reposition the start index to the end of the last buffer and fill the buffer.
        beginnIndex += bufSize;
        returnval = Reader.GetBytes(0, beginnIndex, obyte, 0, bufSize);
      }
      // Write the remaining buffer.
      if (returnval >0){
              returnval=returnval-1;
      }
      msbw.Write(obyte, 0, (int)returnval);
      msbw.Flush();
    }
    Reader.Close();
    //msbw.Close();
    // Close the reader and the connection.

    Aktuell_Gueltig=true;
    return true;
  }
  catch (Exception e){
          MessageBox.Show(e.Message + e.InnerException );
          Reader.Close();
          Aktuell_Gueltig=false;
          return false;
  }
}


A
196 Beiträge seit 2005
vor 18 Jahren

Wie einfacher geht das nicht ?(8o

Ich glaube ich habe mich etwas im Topic vertan X(
Ich habe eine MySQL DB welche eine Tabelle hat wo ein Wert vom Typ Text drin steht.Ich will nun den Text ausgeben lassen

S
34 Beiträge seit 2005
vor 18 Jahren

Hallo,

du weisst, es ist nur Text, für die DB ist ein BLOB aber nur eine Anhäufung von Nullen und Einsen mit einer zumindest theoretischen möglichen Länge von mehreren GB. Darum greifen einfache Zugriffsmethoden auch nicht. Man sollte sich daher gut überlegen, ob Textdaten in einem Blob-Feld gut aufgehoben sind (obwohl es dafür sicherlich gute Gründe geben kann).

Ansonsten Lektüre => .NET SDK 1.1 , nach "BLOB" suchen , erste Fundstelle ist der Artikel: "Abrufen von BLOB-Werten aus einer Datenbank". Ich hab den größten Teil meines Codes dort übrigens wiedererkannt.

4.221 Beiträge seit 2005
vor 18 Jahren

um deinen Reader zu verwenden....

ich würds irgendwie so probieren


			byte[] bytes=new byte[1048576]; //1 Mega
			long lngRead=read.GetBytes(0,0,bytes,0,bytes.Length);
			string strRead=System.Text.Encoding.Default.GetString(bytes,0,(int)lngRead);


Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

A
196 Beiträge seit 2005
vor 18 Jahren

Original von Programmierhans
um deinen Reader zu verwenden....

ich würds irgendwie so probieren

  
byte[] bytes=new byte[1048576]; //1 Mega  
long lngRead=read.GetBytes(0,0,bytes,0,bytes.Length);  
string strRead=System.Text.Encoding.Default.GetString(bytes,0,(int)lngRead);  
  
  

Dann kommt

 MySQLDriverCS Exception: Operation not supported at MySQLDriverCS.MySQLDataReader.GetBytes(Int32 i, Int64 fieldOffset, Byte[] buffer, Int32 bufferoffset, Int32 length)
 
U
91 Beiträge seit 2004
vor 18 Jahren

Keinen blassen Schimmer ob das in MySQL geht, aber bei Firebird mache ich das so:


string myBlob;			
while( myReader.Read()){
   myBlob = myReader["BLOB"].ToString();
}  

und es funzt problemlos und wie man sieht ganz ohne Streames. Ist aber halt die Lösung für reine TextFelder.


Gruß
Uwe

A
196 Beiträge seit 2005
vor 18 Jahren

Ne das geht bei mir nicht 😦Da wird ja immer das System.Byte[] ausgegeben

Habe die Lösung gefunden 8)

byte[] bytetext = (byte[])(read[0]);
text = System.Text.Encoding.UTF8.GetString(bytetext);