水晶报表使用push模式(2)

1.考虑如何存储设计所需的数据模型?
实际上我们可以认为,每张基表就是粒度最细的数据模型,只是某些字段是代码性质,不适合于最终用户去使用而已。
所以我们建立基表的时候是否可以考虑把列的友好名称保存,以便我们建立数据模型的时候引用。
实际上这些数据可以认为是整个系统的元数据之一,包括界面、数据模型等需要的地方都可以引用。
保存在哪里?
第一,使用系统的机制,保存在系统表中;
第二,也可以自己设计表来保存。当然若是前者的话,在企业管理器中也可以查看到,方便数据库管理员使用。

有了基表数据后,我们就可以通过基表来建立我们的数据模型了。
通常我们可以构建一个视图,其列信息可从基表中获得。
我们可以通过sysdepends获取其依赖的表、视图以及其相应的列,从而可通过sysproperties获取其列的信息。
示例如下:
select distinct d.id,c.name,p.value from sysdepends as d inner join sysobjects as o on d.depid=o.id
inner join syscolumns as c on d.depid=c.id and d.depnumber=c.colid
left join sysproperties   p on p.id=c.id and   p.smallid=c.colid
where d.id =object_id(@ModelName)
2.如何获取数据
借用ado.net中的概念,考虑在源数据和数据模型间有一个适配器,这个适配器用于从源数组织数据,从而形成符合数据模型结构的数据。
实际中适配器通常就是一段查询语句,该语句基于数据模型生成。当然,也可能是一个存储过程,用于生成来源复杂、计算复杂的数据。
3.如何过滤数据
仔细考虑,我们可以发现过滤的条件不超乎数据模型所约定的范围。所以,我们可以根据数据模型来设置过滤的条件。因为数据模型中包括
了字段名、数据类型等,所以我们很方便根据这些内容形成查询语句。示例如下:
StringBuilder sb=new StringBuilder("select * from "+DataModel);
sb.Append(" ");
sb.Append("Where");
sb.Append(" ");
sb.Append(columnName);
sb.Append(" ");
sb.Append(operator);
sb.Append(" ");
sb.Append("@" + columnName);
sb.Append(" ");
同样,根据这些设置的过滤条件及值,我们也很方便形成SqlParameter,从而通过SqlDataAdapter获取数据。
对于存储过程,我们的过滤条件不会超过存储过程中所包含的参数。当然存储过程本身的参数受数据模型本身的限制。
我们可以通过SqlCommandBuilder.DeriveParameters(cmd)获取其包含的参数,从而形成过滤条件的设置信息。         

原文地址:https://www.cnblogs.com/chump/p/2367480.html