복붙노트

[SQL] SQL 매개 변수를 사용하여 (이미지 일명) 삽입 / 업데이트 TBlobfield

SQL

SQL 매개 변수를 사용하여 (이미지 일명) 삽입 / 업데이트 TBlobfield

나는 SQL을 사용하여 데이터베이스에 저장하는 이미지를 원하지만 일에 그것을 얻을 것 캔트 :

qry.SQL.Clear;
qry.Sql.Add('update tbl set pic = :blobVal where id = :idVal');   
qry.Parameters.ParamByName('idVal')._?:=1;

.PARAM은 가지고 있지만 .PARAM이 TADOquery와 호환되지 않습니다처럼 또한 .Parameters 더 .asinteger이 없습니다 - 나는 시도 해결하기 위해 :

a_TParameter:=qry.Parameters.CreateParameter('blobval',ftBlob,pdinput,SizeOf(TBlobField),Null);
a_TParam.Assign(a_TParameter);
a_TParam.asblob:=a_Tblob;
qry.ExecSql; 

이 또한 나던 일 :

qry.SQL.Clear;
qry.Sql.Add('update tbl set pic = :blobVal where id = 1')
qry.Parameters.ParamByName('blobVal').LoadFromStream(img as a_TFileStream,ftGraphic);//ftblob 
//or 
qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg',ftgrafic);//ftblob
qry.ExecSql;

해결법

  1. ==============================

    1.뭔가를해야합니다

    뭔가를해야합니다

    qry.Parameters.Clear; 
    qry.Parameters.AddParameter.Name := 'blobVal';
    qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob);
    // or load from stream: 
    // qry.Parameters.ParamByName('blobVal').LoadFromStream(MyStream, ftBlob);
    qry.Parameters.AddParameter.Name := 'idVal';
    qry.Parameters.ParamByName('idVal').Value := 1;
    qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal';    
    qry.ExecSQL;
    

    DB를에서 BLOB의 뒷면을 읽으려면 :

    qry.SQL.Text := 'select id, pic from tbl where id = 1';
    qry.Open;
    TBlobField(qry.FieldByName('pic')).SaveToFile('c:\sample_2.jpg');
    
  2. ==============================

    2.나는 나사로하지 델파이를 사용하고 있지만, 나는 그것의 일반적으로 동일한 구문을 것 같아요. 그렇다면, 여기 kobiks 제안에 약간의 개선이다 :

    나는 나사로하지 델파이를 사용하고 있지만, 나는 그것의 일반적으로 동일한 구문을 것 같아요. 그렇다면, 여기 kobiks 제안에 약간의 개선이다 :

    SQL.Text이 매개 변수에 할당 값을 시도하기 전에 지정된 경우 매개 변수가 자동으로 추가됩니다. 이 같이 :

    qry.Parameters.Clear; 
    
    qry.SQL.Text := 'update tbl set pic = :blobVal where id = :idVal';    
    qry.Parameters.ParamByName('blobVal').LoadFromFile('c:\sample.jpg', ftBlob);
    qry.Parameters.ParamByName('idVal').Value := 1;
    qry.ExecSQL;
    
  3. ==============================

    3.나는이 질문에 대한 답으로 쓴 델파이는 SQL 데이터베이스에 BLOB으로 포장 된 레코드를 저장 이는 현재 기술 때문에 아마도 잘못, 중복으로 플래그가 주석에 설명 된대로 OP에서 사용하는 올바른 것으로 보인다. 그래서, 문제의 원인은 다른 곳에 거짓말 수 있습니다.

    나는이 질문에 대한 답으로 쓴 델파이는 SQL 데이터베이스에 BLOB으로 포장 된 레코드를 저장 이는 현재 기술 때문에 아마도 잘못, 중복으로 플래그가 주석에 설명 된대로 OP에서 사용하는 올바른 것으로 보인다. 그래서, 문제의 원인은 다른 곳에 거짓말 수 있습니다.

    복제 플래그가 제거됩니다 경우에, 나는 거기에이 대답을 다시 게시합니다.

    다음 코드는 아래와 같이 정의는 SQL Server 테이블에 나를 위해 잘 작동합니다.

    후속 픽처의 부호화시에 참조 화상의 데이터는 테이블에 저장하고 올바르게이 rec2로 다시 읽습니다.

    (* MS Sql Server DDL
    CREATE TABLE [blobs] (
      [id] [int] NOT NULL ,
      [blob] [image] NULL ,
      CONSTRAINT [PK_blobs] PRIMARY KEY  CLUSTERED
      (
        [id]
      )  ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    *)
    
    TForm1 = class(TForm)
      ADOConnection1: TADOConnection;
      qBlobInsert: TADOQuery;
      qBlobRead: TADOQuery;
      Button1: TButton;
      procedure Button1Click(Sender: TObject);
     [...]
    
    
    type
      TMyRecord = packed record
        FontName: string[30];
        FontSize: word;
        FontColor: integer;
        FontStyle: word;
        Attachement: string[255];
        URL: string[255];
      end;
    
    const
      scInsert = 'insert into blobs(id, blob) values(:id, :blob)';
      scSelect = 'select * from blobs where id = %d';
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      TestInsert;
    end;
    
    procedure TForm1.TestInsert;
    var
      Rec1,
      Rec2 : TMyRecord;
      MS : TMemoryStream;
    begin
      FillChar(Rec1, SizeOf(Rec1), #0);
      FillChar(Rec2, SizeOf(Rec2), #0);
    
      Rec1.FontName := 'AName';
      Rec1.URL := 'AUrl';
    
      MS := TMemoryStream.Create;
      try
        // Save Rec1 using an INSERT statement
    
        MS.Write(Rec1, SizeOf(Rec1));
        MS.Seek(0, soFromBeginning);
        qBlobInsert.Parameters[0].Value := 1;
        qBlobInsert.Parameters[1].LoadFromStream(MS, ftBlob);
        qBlobInsert.SQL.Text := scInsert;
        qBlobInsert.ExecSQL;
    
    
        // Read saved data back into Rec2
    
        qBlobRead.SQL.Text := Format(scSelect, [1]);
        qBlobRead.Open;
        MS.Clear;
        TBlobField(qBlobRead.FieldByName('blob')).SaveToStream(MS);
        MS.Seek(0, soFromBeginning);
        MS.Read(Rec2, MS.Size - 1);
        Caption := Rec2.FontName + ':' + Rec2.URL;
      finally
        MS.Free;
      end;
    end;
    

    DFM에서 추출

    object qBlobInsert: TADOQuery
      Connection = ADOConnection1
      Parameters = <
        item
          Name = 'id'
          DataType = ftInteger
          Value = Null
        end
        item
          Name = 'blob'
          DataType = ftBlob
          Value = Null
        end>
      Left = 56
      Top = 32
    end
    
  4. from https://stackoverflow.com/questions/19115821/insert-update-tblobfield-aka-image-using-sql-parameters by cc-by-sa and MIT license