想让水晶报表的某一列显示图片,数据库中保存的是路径,怎么搞
 如题,就这么多分了
------解决方案--------------------版权声明:欢迎转载,但请注明出处 www.cnblogs.com/alone      
 环境描述:   
   SqlServer 2000、Crystal Report(水晶报表)XI 以下版本    
 引语   
   水晶报表以其强大的功能占距了强大的开发市场,其打印出的报表美观、大方,深得用户喜爱,然而其某些功能上不免有些瑕疵。例如,当数据库中只存放了图片的路径时,当你在设计报表时,没有提供将其打印成图片的功能,可能水晶报表公司也看到了广大使用者的需要,在新近的Crystal Report XI中添加了对此的支持,请参见:http://www.businessobjects.com/products/reporting/crystalreports/formatting.asp,Dynamic image location标题下有详细的Flash功能演示,我就不详细说明了。但Crystal Report XI以下并未提供该功能,用户只能在数据库中使用image字段保存图片、使用第三方的工具或在程序中处理,然而这三种方式都有不足:    
   1、建立image字段会使数据库文件变得更大,影响了数据库执行效率,而且在特定的情况下,不能使用image字段保存图片,比如用户希望在更新图片时只需将新的图片文件替换掉旧图片时,这个方法就不好用了;    
   2、使用第三方的工具,参见http://www.crystalkeen.com/tools/cviewimage.htm,以COM组件的方式从数据库中存储的图片路径中提取实际的图片,内嵌于结果集中,提供给Crystal Report。这个方法也有很多不足,比如:不能支持复杂的数据查询;    
   3、在程序中处理,VB的代码,我没有深入的研究,大概的原理就是循环表中的picture对象,在程序中更改其源位置,这样,在报表生成之前图片就被替换掉了,这种方法当然不用说了,要Coding了,有兴趣的朋友可以研究一下,交流交流。会不会有限制还不清楚,更主要的问题,如果用户只想通过数据库来提供数据源,这个当然不能满足需求了。   
   参见:[Crystal Report 8]http://support.businessobjects.com/library/kbase/articles/c2014707.asp    
      [Crystal Report 9]http://support.businessobjects.com/communityCS/FilesAndUpdates/cr9_vb_rdc_loadpic.exe.asp      
 详细文章请参见:http://www.cnblogs.com/alone/articles/130201.html   
------解决方案--------------------http://www.cnblogs.com/babyt/archive/2005/08/15/142789.html     
 这个比较经典 
------解决方案--------------------综上所述,Crystal report XI以下版本对图片的支持是开发人员头痛的事,怎样能够才能方便的使Crystal report支持动态根据数据库路径图片显示呢?本人做了以下研究,下面给出一个简单的应用,希望抛砖引玉,有朋友能将其完善。     
 解决方案     
   众所周知,如果数据库中存在一个image字段,在Crystal Report设计报表时使用它是很方便,只需将该字段拖曳到相应的位置,报表在运行时将会从数据库中动态加载图片。如果数据库中并未建立image字段,而是建立了一个字段imgsrc用以保存图片的路径,就不能使用拖曳的方法,怎么解决图片的动态加载呢?通过分析Crystal Report访问image字段和Crystal Report支持从存储过程获取数据源的机制,可以得出以下思路:        
   编写存储过程,从图片存储的表获取图片的路径,通过使用临时表技术创建一个含image字段的临时表,并使用bcp实用工具加图片导入临时表中,最近通过与临时表关联查询,获得一个包含image字段的数据集。这样,在Crystal Report只需将报表的数据源连接到该存储过程中,在设计时就可直接从该数据集中将image字段拖曳到设计界面了。         
   下面是实现该存储过程的具体代码,其中的导入图片参考修改了CSDN:邹建 的代码:         
 if exists (select * from dbo.sysobjects where id = object_id(N '[dbo].[sp_dynaRptImg] ') and OBJECTPROPERTY(id, N 'IsProcedure ') = 1)   
 drop procedure [dbo].[sp_dynaRptImg]   
 GO      
 create      proc sp_dynaRptImg   
 AS   
 declare @fname_in     varchar(1000)   --bcp处理应答文件名   
          ,@fsize      varchar(20)     --要处理的文件的大小   
          ,@m_tbname   varchar(50)     --临时表名   
          ,@sql        varchar(8000)   
          ,@fname      varchar(1000)   --目录+文件名,处理过程中要使用/覆盖:@filename+_temp   
 declare @servename    varchar(30)   
          ,@username   varchar(30)    
          ,@password   varchar(30)   
      SET @servename = @@servername   
      set @username   =  'sa '   
      set @password = 'sa '   
 --则取得导入文件的大小   
 create table #pic (img image)   
 insert #pic select 0x394872      
 create table #pictt(pic varchar(2000),src image)   
 insert into #pictt select  'c:\a.jpg ',0x394872 --以下4行为插入演示数据   
 insert into #pictt select  'c:\b.jpg ',0x394872   
 insert into #pictt select  'c:\b.jpg ',0x394872   
 insert into #pictt select  'c:\b.jpg ',0x394872   
 insert into #pictt select  'c:\a.jpg ',0x394872      
 declare cur_1 cursor for select pic from #pictt   
    open cur_1   
    fetch cur_1 into @fname   
    while @@fetch_status = 0   
    begin   
          create table #tb(可选名 varchar(20),大小 int   
                    ,创建日期 varchar(10),创建时间 varchar(20)