2013-07-20 3 views
1

в моем проекте я использую mysql.pas иметь дело с базой данных MySql, поэтому я эту таблицу структуру:Delphi Загрузка Blob из 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 заголовка файла, позвольте мне объяснить: Audi_Car изображение сохраняется как Png изображение , но когда я загрузить его образ я всегда получаю это так:

enter image description here

Поэтому, пожалуйста, как можно это исправить? есть ли ошибка в моем запросе Sql?

P.S: Я создаю TrgStream в другом месте.

И вот моя процедура LoadCarImage:

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

большое спасибо

+0

Как вы знаете, что "сохранить рутинные работы очень хорошо"? Вы можете извлечь содержимое столбца другим способом и проверить его, чтобы убедиться, что он правильно сохранен в базе данных? Если он поврежден или поврежден во время сохранения, он не может быть правильно прочитан. Кроме того, где вы сохраняете содержимое потока? Ваш код не показывает эту информацию. –

+0

@ Ken White большое спасибо, за ваш 1-й вопрос. Да, хотя об этом я и использовал MySQLWorkbench, чтобы протестировать его, так что загрузите файл png в поле Blob (так что сохранение выполняется вручную). Для вашего второго вопроса я отредактирую свою тему и добавлю процедуру загрузки – Sdean

+0

Я отредактировал мою тему, чтобы добавить процедуру LoadCarImage. – Sdean

ответ

3

вы не должны использовать

Repeat ... until 

CarName не является уникальным. Поэтому, если в вашей таблице больше одного Audi, вы создаете также недопустимый файл изображения.

Попробуйте с

Delphi5

EDIT:

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

WriteBuffer принимает первый указатель и записи содержимого всей Роу.
В файле .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]); 
    [...] 
+0

@ moskito-x, много спасибо, что это работает, Просто я хочу знать: почему мой код не дал того же результата? большое спасибо еще раз – Sdean

+0

@ user1998327: Пожалуйста, ознакомьтесь с моим обновленным ответом. –

+0

большое спасибо, я получаю это – Sdean

Смежные вопросы