AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Blobs lesen .NET

Ein Thema von vsti · begonnen am 11. Mär 2005 · letzter Beitrag vom 11. Mär 2005
Antwort Antwort
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#1

Blobs lesen .NET

  Alt 11. Mär 2005, 13:13
Datenbank: Interbase • Version: 6 • Zugriff über: WinForms, BdpDataAdapter, DataSet
Moin Moin,

wie ist es möglich in .NET ein Blob Feld auszulesen?

mit
DataSet1.Tables['TABLE1'].Rows[0].Item['COLUMN1'].tostring kann man problemlos einen string auslesen.
Wie sieht es aber aus wenn COLUMN1 nun ein BLOB- Feld ist?

HIER ist ein Beispiel für C#. Aber wenn ich dann dem Bytes-Array Daten zuweisen soll gehts unter Delphi nicht mehr.

hier ist ein Teil meines vereinfachten Codes:

Delphi-Quellcode:
procedure TWinForm.Pruef;
var aAr: TBytes;
    fs: FileStream;
begin
  aAr := DataSet1.Tables['TABLE1'].Rows[ 0 ].item['COLUMN'] as TBytes; //<-- diese Umwandlung gefällt ihm nicht
  fs := FileStream.Create('c:\bytes.txt', FileMode.OpenOrCreate, FileAccess.Write);
  fs.write( aAr,0,length(aAr));
end;
Lösungsansätze würden evtl. schon genügen.
Thorsten
  Mit Zitat antworten Zitat
csa

Registriert seit: 22. Feb 2005
Ort: Wiesbaden
14 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Blobs lesen .NET

  Alt 11. Mär 2005, 13:50
Hallo,

ich habe da eine D7-Funktion für Character-LOBs, die kann man auf .NET und BLOBs umbauen:

Delphi-Quellcode:
function ReadText(const aField: ADOInt.Field): string;
var
  Chunk: OleVariant;
begin
  Result := '';
  if (aField.ActualSize = 0) then
  begin
  // leer
  end
  else
  begin
    Chunk := aField.GetChunk(ChunkSize);
    while not VarIsNull(Chunk) do
    begin
      Result := Result + Chunk;
      Chunk := aField.GetChunk(ChunkSize);
    end;
  end;
end;
Die Konstante ChunkSize bestimmt, wie viele Bytes auf einmal gelesen werden, bei Oracle Max. 65536. Bei Access oder MS SQL reicht bei Text-Feldern übrigens ein "Result := aField.Value", die Funktion wird für Oracle CLOBs benötigt.

Gruß
Christoph
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Blobs lesen .NET

  Alt 11. Mär 2005, 14:26
Warum baust du das Beispiel nicht mit C# eben nach?
Pack es in ne Assembly und link sie mit Delphi ein.
  Mit Zitat antworten Zitat
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#4

Re: Blobs lesen .NET

  Alt 11. Mär 2005, 16:03
@Generalissimo
das eigentliche Projekt ist viel umfangreicher, daher geht das mit C# nich mal eben. Und wie man sowas in ne assembly packt weiß ich auch nicht ^^

@csa
auf den ersten blick kann ich da noch nicht viel mit anfangen. ich guck mir das mal an und hoffe das das auch relativ einfach in .NET funktioniert.

aber so wie das mit C# geht muss das doch auch mit Delphi gehen, warscheinlich hab ich nur nen kleinen bescheuerten Fehler...

Edit: also die Funktion von oben geht wohl nicht, da diese ganze OLE Krams bei .NET nicht dabei ist...
Thorsten
  Mit Zitat antworten Zitat
Generalissimo

Registriert seit: 28. Aug 2003
187 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Blobs lesen .NET

  Alt 11. Mär 2005, 16:21
Zitat von vsti:
@Generalissimo
wie man sowas in ne assembly packt weiß ich auch nicht ^^
1. Klassenbibliothek anlegen
2. Klasse BlobDataHandling anlegen
3. Funktion GetBlobData definieren

Code:
public bool GetBlobData(string sFileName)
{
SqlConnection con = new SqlConnection("Server=Darkover;uid=<username>;pwd=<strong password>;database=northwind");
SqlDataAdapter da = new SqlDataAdapter("Select * From MyImages", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
DataSet ds = new DataSet("MyImages");

byte[] MyData= new byte[0];

da.Fill(ds, "MyImages");
DataRow myRow;
myRow=ds.Tables["MyImages"].Rows[0];

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

FileStream fs = new FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Write);
fs.Write(MyData, 0,ArraySize);
fs.Close();
}
4. Funktion SetBlobData(string sFileName) definieren

Code:
public bool SetBlobData(string sFileName)
{
SqlConnection con = new SqlConnection("Server=Darkover;uid=<username>;pwd=<strong password>;database=northwind");
SqlDataAdapter da = new SqlDataAdapter("Select * From MyImages", con);
SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
DataSet ds = new DataSet("MyImages");

da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
FileStream fs = new FileStream(sFileName,FileMode.OpenOrCreate, FileAccess.Read);

byte[] MyData= new byte[fs.Length];
fs.Read(MyData, 0, System.Convert.ToInt32(fs.Length));

fs.Close();

da.Fill(ds,"MyImages");

DataRow myRow;
myRow=ds.Tables["MyImages"].NewRow();

myRow["Description"] = "This would be description text";
myRow["imgField"] = MyData;
ds.Tables["MyImages"].Rows.Add(myRow);
da.Update(ds, "MyImages");

con.Close();

}
5 Kompilieren (#Develop ist zur Erstellung super) und als Reference das ganze in Delphi erfasen

Natürlich müssten noch paar Dinge angepasst werden. So müssten Feldnamen angepasst werden. Eventuell auch auf CommandBuilder verzichten, da es sich ja um ein größeres Projekt handelt.
  Mit Zitat antworten Zitat
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#6

Re: Blobs lesen .NET

  Alt 11. Mär 2005, 16:26
Ok, könnte funktionieren. Pass ich gleich morgen früh an und probier es dann aus.
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz