database - 使用 Delphi 2010 从 BLOB 加载时出现 Jpeg 错误 #51,在 Delphi 2006 中正常

标签 database delphi image delphi-2010 delphi-2006

我有一个用 Delphi 2006 开发的旧应用程序,我现在需要对其进行一些更改。

在这个应用程序中,我从 MsSQL“图像”字段加载图像 但是当我用 delphi 2010 编译时出现错误: “引发异常类 EJPEG,消息为‘JPEG 错误 #51’。”

从数据库中获取图像的代码:

aStream := TMemoryStream.Create;
Try
If LoadFromBlob(FieldByName('Picture'), aStream) then
begin
    Pic:=TJpegImage.Create;

    try
        Try
            Pic.LoadFromStream(aStream);
            Picture.Assign(Pic); // <------ JPEG Error #51 here w D2010
        Except
            //something went wrong loading
            HandleImageError();    
        End;

    finally
     Pic.Free;
    end;

end;
Finally
    aStream.Free;
End;

// ............

function LoadFromBlob(const AField: TField; const Stream: TStream): boolean;
var
    ResultStr: string;
    PResultStr: PChar;
begin
    Result := false;
    if (Assigned(AField)) and (Assigned(Stream)) then begin
        try
            ResultStr := AField.Value;
            If ResultStr <> '' then
            begin
                PResultStr := PChar(ResultStr);
                Stream.Write(PResultStr^, Length(ResultStr));
                Stream.Seek(0,0);
                Result := true;
            end;
        except
        end;
    end;
end;

用 Google 搜索了一下,发现错误 #51 的意思是:JERR_NO_QUANT_TABLE,不管它是什么意思。

当我用 Delphi 2006 编译时,相同的代码可以正常工作,没有错误,那么 D2010 是怎么回事?

最佳答案

在 D2010 中,Char 从 Ansi 更改为 Unicode,这意味着它占用两个字节而不是一个字节。 将 LoadFromBlob 中的变量更改为 AnsiString 和 PAnsiChar,它应该可以工作。

更新:您最好访问 Field.AsAnsiString,而不是 Field.Value(变体);变体访问可能包括引入错误的隐式 Unicode->Ansi 转换。

关于database - 使用 Delphi 2010 从 BLOB 加载时出现 Jpeg 错误 #51,在 Delphi 2006 中正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3618252/

相关文章:

database - 没有中间表的多对多 - 这可能吗?

database - 将查询计数存储在 vb 变量中

sql - Delphi 更新连接查询

javascript - 防止在 HighDPI 显示器上缩放图像

python - 不使用反斜杠时,cv2 imread不返回任何内容

mysql - 用于跟踪实验数据的数据库设计

database - 使用什么数据库,安装时如何安装?

delphi - 提示形式和焦点

delphi - 查找来自 csrss.exe 的应用程序错误

ios - YPDrawSignatureView,在 iOS 应用程序中捕获/保存签名