在水晶报告XI R2中显示存储在ntext列中的图像

时间:2015-12-16 12:24:49

标签: sql-server crystal-reports visual-foxpro crystal-reports-xi

我必须从较旧的程序中获取数据库,并将Visual Fox Pro中生成的报告生成Crystal Reports。 似乎该程序以某种编码方式将图像存储到ntext数据类型列中。我所知道的是,Visual Fox Pro将此ntext字段转换为Image。 我可以在Crystal Reports环境中显示此图像吗? 我试过把字段放到报告中,但它只显示编码的文本而不是图像。 我还插入了一个ole对象并使用数据库字段设置图片位置公式,并且没有显示任何内容。 感谢您的回复,最好的问候。

1 个答案:

答案 0 :(得分:0)

如果您的意思是这是一个VFP数据库,那么VFP中没有ntext数据类型。可能你想说“一般”数据类型?没有VFP开发人员真正想要使用的数据类型(不幸的是它存在并且一些开发人员使用它)。该字段存储OleObject的数据或其链接。如果您不能使用某些foxpro代码将这些代码转换为磁盘上的文件,那么我担心您会无助(并且没有可靠的代码可以100%成功)。以下是一个将BMP文件保存到外部BMP的示例代码:

** Assuming there is a table 'myTable' with general field 'GenField'
** that stored BMPs in it
** Save to relative folder mybmps
Clear All
Use myTable
Scan
  SaveBMPs('myTable', 'Genfld', Recno(), "mybmps\"+Ltrim(Str(Recno())))
Endscan

Function SaveBMPs
Lparameters tcTable, tcField, tnRecNo, tcOutFileName
* tcTable - Tablename containing BMP gen field
* tcField - Gen field name
* tnRecNo - recno no extract
* tcOutFileName - path and fielname of output filename except .BMP extension (no check)
Local handle, handleout, lcTable
lcTable = "T"+Sys(2015)
Select &tcField From (m.tcTable) ;
  where Recno() = m.tnRecNo ;
  into Table (m.lcTable)
Use
handle=Fopen(m.lcTable+".fpt")
handleout=Fcreate(m.tcOutFileName)
lnSize = Fseek(m.handle, 0, 2) && Seek to eof and get size
Fseek(m.handle,599)           && Go to start of gen file
If ( m.lnSize - 599 ) % 2 = 0  && Might it be a duplicate ? Let's check
  lcFirst = Fread(m.handle, (m.lnSize - 599)/2) && Read first part to lcFirst
  lcSecond = Fread(m.handle, m.lnSize) && Read rest to lcSecond
&& lnSize is totlen
&& but fread() would stop at feof()
  Fwrite(m.handleout, m.lcFirst, m.lnSize) && Again lnSize is bigger but
&& correct size would be written
  If m.lcFirst # m.lcSecond      && It was not a duplicate, so write lcSecond too
    Fwrite(m.handleout, m.lcSecond, m.lnSize)
  Endif
Else
  Fwrite(m.handleout, ;
    fread(m.handle,m.lnSize), ;
    m.lnSize)                 && Since now we have a size at hand.
&& So let's do readwrite in one pass
Endif
Fclose(m.handle)
Fclose(m.handleout)
Erase (m.lcTable+".*")