![]() |
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:
kann man problemlos einen string auslesen.
DataSet1.Tables['TABLE1'].Rows[0].Item['COLUMN1'].tostring
Wie sieht es aber aus wenn COLUMN1 nun ein BLOB- Feld ist? ![]() hier ist ein Teil meines vereinfachten Codes:
Delphi-Quellcode:
Lösungsansätze würden evtl. schon genügen.
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; |
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:
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.
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; Gruß Christoph |
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. |
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... |
Re: Blobs lesen .NET
Zitat:
2. Klasse BlobDataHandling anlegen 3. Funktion GetBlobData definieren
Code:
4. Funktion SetBlobData(string sFileName) definieren
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(); }
Code:
5 Kompilieren (#Develop ist zur Erstellung super) und als Reference das ganze in Delphi erfasen
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(); } 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. |
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 20:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz