Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism Blobs lesen .NET (https://www.delphipraxis.net/41972-blobs-lesen-net.html)

vsti 11. Mär 2005 12:13

Datenbank: Interbase • Version: 6 • Zugriff über: WinForms, BdpDataAdapter, DataSet

Blobs lesen .NET
 
Moin Moin,

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

mit
Delphi-Quellcode:
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.

csa 11. Mär 2005 12:50

Re: Blobs lesen .NET
 
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

Generalissimo 11. Mär 2005 13:26

Re: Blobs lesen .NET
 
Warum baust du das Beispiel nicht mit C# eben nach?
Pack es in ne Assembly und link sie mit Delphi ein.

vsti 11. Mär 2005 15:03

Re: Blobs lesen .NET
 
@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...

Generalissimo 11. Mär 2005 15:21

Re: Blobs lesen .NET
 
Zitat:

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.

vsti 11. Mär 2005 15:26

Re: Blobs lesen .NET
 
Ok, könnte funktionieren. Pass ich gleich morgen früh an und probier es dann aus. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 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