SQL 명령을 사용하여 데이터베이스에 이미지를 저장하고 싶습니다. TBlobField.LoadFromFile
등을 사용하는 다른 방법을 알고 있지만 데이터베이스를 업데이트하기 위해이 작업을 수행해야하는 이유가 있습니다.SQL을 사용하여 TBlobField의 값을 스트링
내가 어떻게해야하는지에 대한 제안/조언
나는 (지금 멀리 책상에서)이 시도한 적이 있지만, 매개 변수가 작동 할
SQL 명령을 사용하여 데이터베이스에 이미지를 저장하고 싶습니다. TBlobField.LoadFromFile
등을 사용하는 다른 방법을 알고 있지만 데이터베이스를 업데이트하기 위해이 작업을 수행해야하는 이유가 있습니다.SQL을 사용하여 TBlobField의 값을 스트링
내가 어떻게해야하는지에 대한 제안/조언
나는 (지금 멀리 책상에서)이 시도한 적이 있지만, 매개 변수가 작동 할
하기 Sandeep? 예를 들면 :
Query.Sql.Clear;
Query.Sql.Add('update myTable set myField = :blobVal where myId = :idVal');
Query.ParamByName('idVal').AsInteger := SomeId;
Query.ParamByName('blobVal').LoadFromFile(....
//or
Query.ParamByName('blobVal').LoadFromStream(....
Query.ExecSql;
이것은 내가 제대로 이해한다면, 당신은 대신 SQL-발전 시스템의 일종을 가지고 당신은 SQL (보다는 .Edit 등 방법)을 사용하여 여전히 BLOB 데이터
을 삽입 할 수 있습니다 데이터 세트를 사용하고 BLOB 필드에 대한 INSERT 또는 UPDATE를 올바르게 수행하도록 SQL을 생성하는 방법을 알고 싶습니다.
이미지를 문자열로 직렬화하는 방법이 필요합니다. 예를 들어 : 그 준비가되면
function ImageToString(image: TImage): string;
var
stream: TStringStream;
begin
stream := TStringStream.Create;
try
image.SaveToStream(stream);
result := image.DataString;
finally
stream.Free;
end;
end;
는 set IMAGE_FIELD = $IMAGE$
처럼, 당신의 SQL에 뭔가를 토큰을 넣고, 다음 이미지의 캐릭터 라인 표현으로 $IMAGE$
토큰을 대체 할 StringReplace와를 사용합니다.
또는 Graza가 제안한 매개 변수를 사용하여 작업중인 시스템에서 매개 변수를 지원할 수 있습니다.
이 시도 :
Query.Sql.Clear;
Query.Sql.Add('update myTable set myField = :blobVal where myId = :idVal');
Query.ParamByName('idVal').AsInteger := SomeId;
Query.Params.CreateParam(ftBlob,'blobVal',ptInput).LoadFromFile('c:\path.png',ftGraphic);
Query.ExecSql;
jpg := TJPEGImage.Create;
jpg.Assign(Image1.Picture.Graphic);
strm := TMemoryStream.Create;
strm.Position:= 0;
jpg.SaveToStream(strm);
IBSQL1.Close;
IBSQL1.SQL.Clear;
IBSQL1.SQL.Add('INSERT INTO ENTRY(FORMNUM, JPG) VALUES(');
IBSQL1.SQL.Add( quotedstr(edtFormNum.Text));
IBSQL1.SQL.Add(', :JPG');
IBSQL1.SQL.Add(')');
IBSQL1.Params.ByName('JPG').LoadFromStream(strm);
IBSQL1.ExecQuery;
strm.Free;
jpg.Free;
난 당신이 제안하지만, 이미지를 위해 만든 문자열을 좋아하지 않는 SQL 명령은, 그것의 일부 시세 및 다른 문자를 가지고 일을했습니다. 나는 파일을 사용하여 똑같은 것을 시도해 봤지만 정상적으로 작동한다. –
오, 예, StringReplace에서 QuotedStr()을 사용해야합니다. 또는 전체 BLOB 문자열을 16 진수로 변환하고 앞에 "0x"를 붙이는 루틴을 통해 실행하십시오. (모든 DBMS에서 작동하지 않을 수 있습니다. –