Hallo zusammen,
folgendes Projekt möchte ich realisieren: Eine Anwendung läuft mit
ADO / dbGo Komponenten und
SQL 2005 zusammen auf einem Client, der auf den
SQL-Server (Express) zugreift. Teil des Datenaustausches sind auch viele große Binärdateien, diese werden u.a. wegen der 4GB-Grenze nicht als BLOB / varbinary abgespeichert, sondern es werden nur die Pfade und Dateinamen auf dem Server in Tabellen gespeichert.
Der Dateiaustausch sollte ohne Windows-Freigaben auf dem Server auskommen (also ohne einen Share-Ordner) und daher durch
SQL "getunnelt" werden.
Wie kann man so etwas am besten realisieren? Meine Idee war, auf dem Server eine Stored Procedure (SP) zu erstellen, die mit Angabe einer ID eine Datei von seiner lokalen Platte in ein varbinary einliest und das Ergebnis im Client über TADOStoredProc zurückzulesen. SP's können aber anscheinend nur int zurückgeben, daher wäre der Aufbau eher so:
SQL-Code:
CREATE PROCEDURE GetFile
@ID int,
@fstream varbinary(max) = NULL OUT
AS
BEGIN
DECLARE @fname varchar(50);
DECLARE @updatequery varchar(2000);
SELECT @fname = fname FROM FileTable WHERE ID = @ID;
-- diesen weg hier muss man gehen, da OPENROWSET keine variablen erlaubt
SET @updatequery = '
UPDATE FileTable
SET fstream = (SELECT * FROM OPENROWSET(BULK ''' + @fname + ''', SINGLE_BLOB) AS x)
WHERE fname='''+ @fname +''';';
EXEC (@updatequery);
SELECT @fstream = fstream FROM FileTable WHERE ID=@ID;
END
wobei @fstream dann ein InputOutput wäre. In Delphi liefert mir der folgende Code
Delphi-Quellcode:
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.ProcedureName := 'GetFile';
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParamByName('@ID').Value := 1;
//ADOStoredProc1.Parameters.ParamByName('@fstream').Value := null; // <- müsste im Prinzip nicht initialisiert werden?
ADOStoredProc1.ExecProc;
aber die Fehlermeldung "Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben". Was muss man beim Typ ftVarByte noch beachten? Wie kann man anschliessend das Variant-Ergebnis in einen Stream oder Datei sichern?
Wie sähe das ganze andersherum aus, also einen Stream zur
DB übergeben und diesen dort als lokale Datei sichern?
Oder gibt es komplett andere Möglichkeiten soetwas zu realisieren?
Gruß,
Jan