将大型firebird数据文件表加载到DataSet中

时间:2012-04-21 14:05:44

标签: database firebird interbase

我有一个Firbird 1.0数据文件加权aprox 25 GB我正在使用它。它有一个表,其中存储了文档和doc的图片作为blob。所以,我问是否有可能使用fib数据集打开这样的大数据文件,我首先尝试在运行时打开数据集=没有成功,因为网格是空的,所以另一个尝试是在设计模式中将其设置为活动,它也无法打开,因为它的活动属性设置为true但没有在网格中获取数据!

你有什么想让它发挥作用吗?我是否必须设置任何blob cashe选项? 或者根本不可能?

现在我正在使用我的笔记本电脑(Win 7 x64 4GB Ram)进行开发,之后它将被部署到我的服务器机器上!

我已经修好了!

另一个问题是关于使用流将blob数据加载到TImage组件

我这样做但是它会弹出一次访问冲突

这是我可以查看的代码

    DM->stImage->Active=true;
    try {
        TMemoryStream *ms=new TMemoryStream();
        TStream *ps=DM->stImage->CreateBlobStream(DM->stImage->FieldByName("PHOTO") ,bmRead);
        ms->Position=0;
        ms->CopyFrom(ps,ps->Size);
        ms->SaveToFile("c:\\1.jpg");
//      imgPass->Picture->LoadFromStream(ms);
        imgPass->Picture->Graphic->LoadFromStream(ps);
        delete ms;
        delete ps;
    }
    catch (Exception &e) {
        ShowMessage(e.ToString());
    }

它可以保存它,但imgPass->Picture->Graphic->LoadFromStream(ps);不起作用! 可能有什么问题?

1 个答案:

答案 0 :(得分:0)

要避开AV,您需要重置在“CopyFrom”功能调用期间向前移动的流位置。

因此,您的代码应该看起来像(只有相关的行):

ms->CopyFrom(ps,ps->Size);
ms->SaveToFile("c:\\1.jpg");
ps->Position = 0; //<<<<<<<<<< here we reset the stream position
imgPass->Picture->Graphic->LoadFromStream(ps);
//imgPass->Picture->Bitmap->LoadFromStream(ps); // <<< if a bitmap and not JPEG

希望这会对你有所帮助。

P.S。:这个问题应该标记为C ++(或C ++ Builder),因为它不仅仅是一个数据库主题。