1

私のプロジェクトでは、mysql.pas を使用して MySql データベースを処理するため、このテーブル構造を使用しています。

Table Name :CarsTbl
ID  int 10
CarName varchar 100
Car_Img longblob 0

このテーブルを使用して、各車をその名前と写真とともに保存します。保存ルーチンは非常にうまく機能します。

しかし、問題は、次の手順を使用する Car_Img を取得するときです。

procedure GetCarImage(const MyCarName:String;TrgStream:TMemoryStream);
var
  query_string: String;
  rCount: Integer;
  mySQL_Res: PMYSQL_RES;
  LibH: PMYSQL;
  Row: PMYSQL_ROW;
  iLen:PMYSQL_LENGTHS;
begin
   mySQL_Res := nil;
   Try
    Try
   query_string := 'SELECT CarName,Car_Img FROM CarsTbl WHERE CarName="'+MyCarName+'"';
   mysql_real_query(LibH, PAnsiChar(query_string), Length(query_string));
    mySQL_Res := mysql_store_result(LibH);
    Try
    rCount := mysql_num_rows(mySQL_Res);
        If rCount > 0 Then Begin
          Repeat
            Row := mysql_fetch_row(mySQL_Res);
            iLen:= mysql_fetch_lengths(mySQL_Res);
            If Row <> nil Then Begin
            TrgStream.position :=0;
            //Row^[1] ==== Car_Img Blob Field
            TrgStream.WriteBuffer(Row^[1],iLen[1]);
            End;
          Until Row = nil;
          end;
      Finally
        mysql_free_result(mySQL_Res);
        mySQL_Res := nil;
        Row := nil;
      End;
    Finally
      mysql_close(LibH);
    End;

  Finally
    LibH := nil;
  End;
end;

私は車の画像を取得しますが、Malformed file Header を使用して説明させてください: Audi_Car 画像は Png 画像として保存されますが、その画像を読み込むと、常に次のようになります:

ここに画像の説明を入力

どうすればこれを修正できますか?私のSqlクエリにエラーはありますか?

PS: TrgStream を別の場所に作成します。

そして、ここに私の LoadCarImage プロシージャがあります:

Procedure LoadCarImage();
var
CarStrm:TMemoryStream;
begin
CarStrm:=TMemoryStream.Create;
Try
GetCarImage('Audi',CarStrm);
CarStrm.SaveToFile('audi.png');
finally
    CarStrm.Free;
    end;
end;

どうもありがとう

4

2 に答える 2

3

使用しないでください

  Repeat ...  until

CarNameは一意ではありません。したがって、テーブルに複数ある場合はAudi、無効な画像ファイルも作成されます。

で試してみてください

Delphi5

編集:


TrgStream.WriteBuffer(Row^[1],iLen[1]);

WriteBuffer は最初のポインタを取り、Row 全体の内容を書き込みます。
あなたの .png ファイルには、

ID00CarName00Car_Img 

9Wî00f­î00Audi00‰PNG.......

私は、何が得られるかを確認するためだけに、配列を経由する長い道のりを好みます。

これでテストが完了しました。現在のストリームの書き込みにエラーは見つかりませんでした。 これ
の代わりに使用します
TrgStream.WriteBuffer(Row^[1],iLen[1]);

TrgStream.WriteBuffer(Row^[1]^,iLen[1]);

procedure GetCarImage(const MyCarName:String;TrgStream:TMemoryStream);
var
  [...]


begin
  [...]

    query_string := 'SELECT CarName,Car_Img FROM cars WHERE CarName="Audi"';
    mysql_real_query(LibH, PAnsiChar(query_string), Length(query_string));
    mySQL_Res := mysql_store_result(LibH);
    Try
    rCount := mysql_num_rows(mySQL_Res);
        If rCount > 0 Then Begin

            Row := mysql_fetch_row(mySQL_Res);
            iLen:= mysql_fetch_lengths(mySQL_Res);
            If Row <> nil Then Begin
            TrgStream.position :=0;
            //Row^[1] ==== Car_Img Blob Field
            TrgStream.WriteBuffer(Row^[1]^,iLen[1]);
    [...]
于 2013-07-20T03:51:58.917 に答える
0

私はまったく同じ問題を抱えていました。mysql glob フィールドから emf (画像メタファイル) を読みたかったのです。そして、私はそれをこのように解決しました。

var
  text_t1:string;
  Stream: TStream;

begin
  text_t1:='';
  text_t1:=' select emf_glob from table ';
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(text_t1);
  ADOQuery1.Open;
  ADOQuery1.first;

  Stream:= TMemoryStream.Create;
  Stream := ADOQuery1.CreateBlobStream(ADOQuery1.FieldByName('emf_glob'), bmRead); 
  Stream.Position:=0;
  DBImage1.Picture.LoadFromStream(Stream);
  Stream.Free;
于 2021-02-03T08:24:32.387 に答える