小洛 的个人资料Paul's照片日志列表 工具 帮助

日志


2005/6/3

数据查询--SELECT语句

(刚才查找一个问题的时候看到了这个网页,收藏一下,嘿嘿,MSN Spaces真的是一个不错的东东,可以让你任意收藏,呵呵。)


数据库是为更方便有效地管理信息而存在的人们,希望数据库可以随时提供所需要的数据信息。因此,对用户来说,数据查询是数据库最重要的功能。本章将讲述数据查询的实现方法。

在数据库中,数据查询是通过SELECT 语句来完成的。SELECT 语句可以从数据库中按用户要求检索数据,并将查询结果以表格的形式返回。我们在“Transact-SQL 语言”章节及前面的章节中已经初步接触到了SELECT 语句的一些用法,在本章中将分类讲述其具体用法。

本节讲述SELECT 语句完整的语法结构,这是一个非常冗长、枯燥的过程。读者可以跳过本节,从第二节开始阅读,而将本节作为理解、编写查询语句的语法参考资料。 SELECT 语句完整的语法结构如下:
SELECT statement ::=
<query_expression>
[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [,...n] ]
[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) } [,...n]
[ BY expression [,...n] ] ]
[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ] }
[ OPTION (<query_hint> [,...n]) ]
<query expression> ::=
{ <query specification> | (<query expression>) }
[UNION [ALL] <query specification | (<query expression>) [...n] ]
<query specification> ::=
SELECT [ ALL | DISTINCT ]
[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]
<select_list>
[ INTO new_table ]
[ FROM {<table_source>} [,...n] ]
[ WHERE <search_condition> ]
[ GROUP BY [ALL] group_by_expression [,...n]
[ WITH { CUBE | ROLLUP } ] ]
[ HAVING <search_condition> ]
由于SELECT 语句特别复杂,上述结构还不能完全说明其用法,因此我们将它拆分为若干部分来讲述。

10.1.1 SELECT 子句
SELECT 子句指定需要通过查询返回的表的列,其语法如下:
SELECT [ ALL | DISTINCT ]
[ TOP n [PERCENT] [ WITH TIES] ]
<select_list>
<select_list> ::=
{ *
| { table_name | view_name | table_alias }.*
| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }
[ [AS] column_alias ]
| column_alias = expression
} [,...n]
各参数说明如下:


ALL
指明查询结果中可以显示值相同的列。ALL 是系统默认的。
DISTINCT
指明查询结果中如果有值相同的列,则只显示其中的一列。对DISTINCT 选项来说, Null 值被认为是相同的值。
TOP n [PERCENT]
指定返回查询结果的前n 行数据。如果PERCENT 关键字指定的话,则返回查询结果的前百分之n 行数据。
WITH TIES
此选项只能在使用了ORDER BY 子句后才能使用当指定此项时,除了返回由TOP n (PERCENT) 指定的数据行外,还要返回与TOP n (PERCENT) 返回的最后一行记录中由ORDER BY 子句指定的列的列值相同的数据行。
select_list
select_list 是所要查询的表的列的集合,多个列之间用逗号分开。
* 通配符,返回所有对象的所有列。

table_name | view_name | table_alias.*
限制通配符*的作用范围。凡是带*的项,均返回其中所有的列。
column_name
指定返回的列名
expression
表达式可以为列名、常量、函数或它们的组合。
IDENTITYCOL
返回IDENTITY 列。如果FROM 子句中有多个表含有IDENTITY 列,则在IDENTTYCOL 选项前必须加上表名,如Table1.IDENTITYCOL。
ROWGUIDCOL
返回表的ROWGUIDCOL 列。同IDENTITYCOL 选项相同,当要指定多个ROWGUIDCOL 列时,选项前必须加上表名,如Table1. ROWGUIDCOL。
column_alias
在返回的查询结果中用此别名替代列的原名。column_alias 可用于ORDER BY 子句,但不能用于WHERE GROUP BY 或HAVING 子句如果查询是游标声明命令DECLARE CURSOR 的一部分,则column_alias 还不能用于FOR UPDATE 子句(有关游标的介绍请参见“游标和视图”章节)。

10.1.2 INTO 子句
INTO 子句用于把查询结果存放到一个新建的表中。SELECT...INTO 句式不能与COMPUTE 子句一起使用。其语法如下:
INTO new_table
参数new_table 指定了新建的表的名称。新表的列由SELECT 子句中指定的列构成,新表中的数据行是由WHERE 子句指定的。但如果SELECT 子句中指定了计算列,在新表中对应的列则不是计算列,而是一个实际存储在表中的列,其中的数据由执行SELECT...INTO 语句时计算得出。如果数据库的“Select into/bulk copy” 选项设置为“True/On”,则可以用INTO 子句创建表和临时表,反之,则只能创建临时表。

10.1.3 FROM 子句
FROM 子句指定需要进行数据查询的表。只要SELECT 子句中有要查询的列,就必须使用FROM 子句。其语法如下:
FROM {<table_source>} [,...n]
<table_source> ::=
table_name [ [AS] table_alias ] [ WITH ( <table_hint> [,...n]) ]
| view_name [ [AS] table_alias ]
| rowset_function [ [AS] table_alias ]
| OPENXML
| derived_table [AS] table_alias [ (column_alias [,...n] ) ]
| <joined_table>
<joined_table> ::=
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| <joined_table>
<join_type> ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ <join_hint> ]
JOIN
各参数说明如下:

table_source
指明SELECT 语句要用到的表、视图等数据源。
table_name [ [AS] table_alias ]
指明表名和表的别名。
view_name [ [AS] table_alias ]
指明视图名称和视图的别名。
rowset_function [ [AS] table_alias ]
指明行统计函数和统计列的名称。
OPENXML
提供一个XML 文档的行集合视图。
WITH ( [,...n])
指定一个或多个表提示。通常SQL Server 的查询优化器会自动选取最优执行计划,除非是特别有经验的用户,否则最好不用此选项。关于表提示table_hint 的设,定请参见下一章的“删除数据”部分。
derived_table [AS] table_alias
指定一个子查询,从数据库中返回数据行。
column_alias
指明列的别名,用以替换查询结果中的列名。
joined_table
指定由连接查询生成的查询结果。有关连接与连接查询的介绍参见本章的相关章节。
join_type
指定连接查询操作的类型。
INNER
指定返回两个表中所有匹配的行。如果没有join_type 选项,此选项就为系统默认。
LEFT [OUTER]
返回连接查询左边的表中所有的相应记录,而右表中对应于左表无记录的部分,用NULL 值表示。
RIGHT [OUTER]
返回连接查询右边的表中所有的相应记录,而左表中对应于右表无记录的部分,用NULL 值表示。
FULL [OUTER]
返回连接的两个表中的所有记录。无对应记录的部分用NULL 值表示。
join_hint
指定一个连接提示或运算法则。如果指定了此选项,则INNER LEFT RIGHT 或FULL选项必须明确指定。通常SQL Server 的查询优化器会自动选取最优执行计划,除非是特别有经验的用户,否则最好不用此选项。
join_hint 的语法如下:
<join_hint> ::= { LOOP | HASH | MERGE | REMOTE }
其中LOOP | HASH | MERGE 选项指定查询优化器中的连接是循环、散列或合并的。REMOTE 选项指定连接操作由右边的表完成。当左表的数据行少于右表,才能使用REMOTE 选项。当左表和右表都是本地表时,此选项不必使用。
JOIN
指明特定的表或视图将要被连接。
ON <search_condition>
指定连接的条件。
CROSS JOIN
返回两个表交叉查询的结果。
10.1.4 WHERE 子句
WHERE 子句指定数据检索的条件,以限制返回的数据行。其语法如下:
WHERE <search_condition> | <old_outer_join>
<old_outer_join> ::=
column_name { *= | =* } column_name
各参数说明如下:
search_condition
通过由谓词构成的条件来限制返回的查询结果。
old_outer_join
指定一个外连接。此选项是不标准的,但使用方便。它用“*=” 操作符表示左连接,用“=*” 操作符表示右连接。此选项与在FROM 子句中指定外连接都是可行的方法,但二者只能择其一。

注意:如果在WHERE子句中指定一个值为FALSE的条件,则可以用SELECT...INTO语句来创建一个表名不同,但结构和数据类型均和原表相同的表。

10.1.5 GROUP BY 子句
GROUP BY 子句指定查询结果的分组条件。其语法如下;
GROUP BY [ALL] group_by_expression [,...n]
[ WITH { CUBE | ROLLUP } ]
各参数说明如下:


ALL
返回所有可能的查询结果组合,即使此组合中没有任何满足WHERE 子句的数据。分组的统计列如果不满足查询条件,则将由NULL 值构成其数据。ALL 选项不能与CUBE或ROLLUP 选项同时使用。
GROUP BY ALL is not supported in queries that access remote tables.
group_by_expression
指明分组条件。group_by_expression 通常是一个列名,但不能是列的别名。数据类型为TEXT、 NTEXT、 IMAGE 或BIT 类型的列不能作为分组条件。
CUBE
除了返回由GROUP BY 子句指定的列外,还返回按组统计的行。返回的结果先按分组的第一个条件列排序显示,再按第二个条件列排序显示以此类推。统计行包括了GROUPBY 子句指定的列的各种组合的数据统计。
ROLLUP
与CUBE 不同的是,此选项对GROUP BY 子句中的列顺序敏感,它只返回第一个分组条件指定的列的统计行。改变列的顺序会使返回的结果的行数发生变化。

使用Distinct选项的统计函数,如AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、和SUM(DISTINCT column_name)等,不能在使用CUBE或ROLLUP选项时使用。

10.1.6 HAVING 子句
HAVING 子句指定分组搜索条件。HAVING 子句通常与GROUP BY 子句一起使用。TEXT、 NTEXT 和IMAGE 数据类型不能用于HAVING 子句。其语法如下:
HAVING <search_condition>
HAVING 子句与WHERE 子句很相似,其区别在于其作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。

10.1.7 UNION 操作符
UNION 操作符将两个或两个以上的查询结果合并为一个结果集。它与使用连接查询合并两个表的列是不同的。使用UNION 操作符合并查询结果需要遵循两个基本规则:

列的数目和顺序在所有查询中必须是一致的;
数据类型必须兼容。
其语法如下:
<query specification> | (<query expression>)
UNION [ALL]
<query specification | (<query expression>)
[UNION [ALL] <query specification | (<query expression>) [...n] ]
各参数说明如下:
<query_specification> | (<query_expression>)
指明查询的详细说明或查询表达式。
UNION
合并操作符。
ALL
合并所有数据行到结果中,包括值重复的数据行。如果不指定此选项,则重复的数据行只显示一行。

10.1.8 ORDER BY 子句
ORDER BY 子句指定查询结果的排序方式。其语法如下:
ORDER BY {order_by_expression [ ASC | DESC ] } [,...n]
各参数说明如下:

order_by_expression
指定排序的规则。order_by_expression 可以是表或视图的列的名称或别名。如果SELECT 语句中没有使用DISTINCT 选项或UNION 操作符。那么ORDER BY 子句中可以包含select list 中没有出现的列名。或别名ORDER BY 子句中也不能使用TEXT、 NTEXT 和 IMAGE 数据类型。
ASC
指明查询结果按升序排列。这是系统默认值。
DESC
指明查询结果按降序排列。
注意:Null值被作为最小的值。

10.1.9 COMPUTE 子句
COMPUTE 子句在查询结果的末尾生成一个汇总数据行。其语法如下:
COMPUTE
{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP |VAR | VARP | SUM }
(expression) } [,...n]
[ BY expression [,...n] ]
各参数说明如下:
    AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM()以上参数与对应的函数有相同的含义。这些函数均会忽略NULL 值,且DISTINCT选项不能在此使用。
    expression
    指定需要统计的列的名称。此列必须包含于SELECT 列表中,且不能用别名。COMPUTE子句中也不能使用TEXT、 NTEXT 和IMAGE 数据类型。
    BY expression
    在查询结果中生成分类统计的行。如果使用此选,项则必须同时使用ORDER BY 子句。expression 是对应的ORDER BY 子句中的order_by_expression 的子集或全集。
    注意:在SELECT子句中使用统计函数,会覆盖COMPUTE子句中的相应选项。在SELECTINTO语句中不能使用COMPUTE子句。

10.1.10 FOR BROWSE 子句
FOR BROWSE 子句用于读取另外的用户正在进行添加、删除或更新记录的表。其语法如下:
FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ]
}
各参数说明如下:
BROWSE
BROWSE 选项指明当查看在使用DB-Library 的客户机应用程序中的数据时,可以更新数据。
使用此子句时对所操作的表有一些限制:
表必须包含一个timestamp 类型的时间标识列;
表必须有一个惟一索引。
注意:
在SELECT语句中:FOR BROWSE子句必须是SELECT语句的最后子句;FOR BROWSE子句不能与UNION操作符同时使用;FOR BROWSE子句不能与表提示HOLDLOCK选项同时使用。

XML
XML 选项指明查询结果以XML 文档模式返回XML。 模式分为RAW、 AUTO、 EXPLICIT 三种。
RAW
将查询结果每一行转换为以一个普通标识符作为元素标识XML 文档。
AUTO
以简单嵌套的XML 树方式返回查询结果。
EXPLICIT
指定查询结果的XML 树的形式被明确定义的。
XMLDATA
返回概要信息。它是附加在文档上返回的。
ELEMENTS
指明列将以子元素的方式返回。
BINARY base 64
指定查询返回的以base64 格式编码的二进制数据。
10.1.11 OPTION 子句
OPTION 子句用于指定在整个查询过程中的查询提示(Query Hint)。通常,用户不必使用OPTION 子句,因为查询优化器会自动选择一个最佳的查询计划。OPTION 子句必须由最外层的主查询来指定。各查询提示之间应使用逗号隔开。其语法如下:
OPTION (<query_hint> [,...n] )
<query_hint> ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| FAST number_rows
| FORCE ORDER
| MAXDOP number
| ROBUST PLAN
| KEEP PLAN
| KEEPFIXED PLAN
| EXPAND VIEWS
}
各参数说明如下:
{HASH | ORDER} GROUP
指定在GROUP BY 或COMPUTE 子句中指定的查询使用散列法或排序法。所谓散列法是指为存储和检索数据项或数据,把搜索关键字转换为一个地址的一种方法。该方法常作为数据集内的记录的一种算法,可以使记录分组均匀,减少搜索时间。
{MERGE | HASH | CONCAT} UNION
指定所有的UNION 操作符采用合并(Merge)、散列(Hash) 或连接(Concatenate)的方法执行操作。如果指定了多个UNION 提示,查询优化器会挑选一个最佳的提示方案。
{LOOP | MERGE | HASH |} JOIN
指定查询过程中的所有连接操作采取循环连接(Loop Join)、合并连接(Merge Join)或散列连接(Hash Join) 的方法。如果指定了多个JOIN 提示,查询优化器会挑选一个最佳的提示方案。
FAST number_rows
指定查询优化只用于迅速返回前number_rows 行数据,在number_rows 行以后的数据采用原查询方法。
FORCE ORDER
指定在查询语法中说明的连接顺序在查询优化的过程中保持不变。
MAXDOP number
忽略由Sp_configure 设定的针对查询的最大并行线程数目。
ROBUST PLAN
强制查询优化器尝试使用最大行容量的计划。
KEEP PLAN
强制查询优化器放松重新编译查询的阈值。指定此选项可以让一个表被多次更新而不必频繁地重新编译查询。
KEEPFIXED PLAN
强制查询优化器不重新编译查询。这样只有当表的概要改变或执行Sp_recompile 存储过程时,才会重新编译查询。
EXPAND VIEWS
扩展索引化视图(当一个视图的名称在查询文本中被视图定义替换时称这个视图被扩展了),并且查询优化器不再将索引化视图作为查询的某部分的替代品。如果视图使用了WITH (NOEXPAND) 说明,则不能被扩展。
注意:SELECT语句中各子句的排列次序是很重要的,子句必须依相应的次序来使用。
      当用SELECT命令读取TEXT和IMAGE类型数据时,一次所能读取的数据受限于@@TE-XTSIZE全局变量的值。
      可以用SET TEXTSIZE命令来更改它。@@TEXTSIZE的初始值为4K,最大为231-1(2,147,483,647)个字节。
 

2005/4/7

在Windows 2000下安装ViewCVS

先决条件
CVSNT 2.0.x
Python 2.3
Python Win32 Extensions

1、安装
从http://russ.hn.org/viewcvs/下载ViewCVS的最新版本viewcvs-1.0-dev-r6.zip,解压后运行脚本viewcvs-install
python.exe viewcvs-install
输入安装目录,例如C:viewcvs

如果需要图形化显示cvs树,可以从http://www.akhphd.au.dk/~bertho/cvsgraph/下载CvsGraph
给源码关键字加上颜色标记,可以从http://gnuwin32.sourceforge.net/packages.html下载Enscript(需要sed,libiconv,libintl支持)
下载后都解压至一目录,例如C:GnuWin32,将此目录加PATH环境变量中

2、配置
修改viewcvs.conf
cvs_roots指定CVS仓库的根,如cvs_roots = cvs: E:cvs-repositoryCVSROOT
cvsnt_exe_path指定cvsnt的位置 cvsnt_exe_path = C:Program Filescvsntcvs.exe
address指定管理员的email
languages修改成zh-cn, en-us支持中文

启用enscript
use_enscript = 1
enscript_path = C:GnuWin32

启用cvsgraph
use_cvsgraph = 1
cvsgraph_path = C:GnuWin32

3、运行
i. 执行安装目录下的standalone.py脚本以standalone的方式运行viewcvs

ii.结合apache
以普通CGI方式运行
修改httpd.conf
添加
ScriptAlias /viewcvs "C:/viewcvs/www/cgi/viewcvs.cgi"
重启apache,访问http://localhost/viewcvs

借助mod_python模块
安装Mod_python,下载地址http://httpd.apache.org/modules/python-download.cgi
修改httpd.conf
添加
LoadModule python_module modules/mod_python.so]

Alias /viewcvs/ "C:/viewcvs/www/mod_python/"

<Directory "C:/viewcvs/www/mod_python">
Options Indexes MultiViews
AllowOverride Options FileInfo
Order allow,deny
Allow from all
</Directory>
重启apache,访问http://localhost/viewcvs/viewcvs.py

[Useful links]
CVSNT 2.0.38 | http://www.cvsnt.com/downloads/
ViewCVS 1.0-dev for Windows Release 6 | http://russ.hn.org/viewcvs/
Python 2.3.4 | http://www.python.org/2.3.4/
Python Win32 Extensions | http://starship.python.net/crew/mhammond/win32/Downloads.html
Apache 2.0 | http://httpd.apache.org/download.cgi
Mod_python | http://httpd.apache.org/modules/python-download.cgi
CvsGraph | http://www.akhphd.au.dk/~bertho/cvsgraph/
Enscript,sed,libiconv,libintl | http://gnuwin32.sourceforge.net/packages.html

Python Win32 Extensions:http://starship.python.net/crew/mhammond/

如果需要图形化显示cvs树,可以从http://www.akhphd.au.dk/~bertho/cvsgraph/下载CvsGraph
给源码关键字加上颜色标记,可以从http://gnuwin32.sourceforge.net/packages.html下载Enscript(需要sed,libiconv,libintl支持)

2005/4/1

4/1号会议记录,可不是愚人的哦,我们才不过那么无聊的节日,HOHO....

时间:2:30 pm
人员 开发组全体,jack

关于report部分

1.Online Report的AfterRun在什么时候做(点选?/打印?)

2.报表的管理功能(shutdown,restart,getQueueCount等,方便系统管理员)

3.把要做报表分类
    每个类型做一个报表模板
    定义设计报表的规则(表头等)
    估算各类报表实现的难度,时间……
    报表分别来自哪些table,实现一些简单的SQL

4.报表状况区应该在什么环节/模块中,是否归类到ReprotQueue中,还是在AP中

5.Report实现cluster的进度不明朗

6.台北目前的一些报表管理经验
    Delete(logic)  

1.User自己删除
2.System定期删除 目前设定7天,应该可管理/每个小时执行一次


    File备份          系统管理员负责备份,程序不涉及
    Move(history)  备份到历史表中,(10/12天的数据)/每周执行一次

final:预计两周可以拿出一些sample code。可以run起来

关于DataExchange的部分

做了一些拆分bag的代码实现。
下周出Design的文档,用于review

争取五月中下旬开始与联华测试,六月到七月开始密集测试(限定一些门店和供货商每天都通过DataExchange传数据),得到的数据用来进行内部的开发测试。

AP部分

做了一些Login,Menu,SQL的测试,和Sky的Framework整合。

在服务器的压力方面考虑一些,在软件的层面上尽量减少服务器压力。

也做一些模板,让新加入的人可以快速进入。


综合

70fileserver上开了一个设计的folder,设计的内容和模板都在里面
开发完成后Deploy尽量交给SE部门去做。
五月份搭建测试环境,和联华测试
六月中旬完成开发
七月中旬完成内部测试
八月到九月 30个供货商开始正式使用
12月底前,计划会有2500家供货商加入进来。

2005/3/23

CrystalClear问题跟踪

报表需要继续确认的问题:
cluster的构架,两次测试都未果,目前怀疑网络问题,等待台湾confirm,如果那边没有问题,准备构架独立的局域网测试。
等待上周提交过去的报表(字段数目未定的情况)解决方案
等待isFailedReport这个method不支持cluster的解释,台湾再和德国confirm
steven明天会把继承ReportViewBean的applet的sample code发过来,然后通过这个sample code考虑online报表的安全性问题。目前的问题,不知道在applet新建的class怎么样在<%%>中调用

需要注意的问题:
-Xms256m -Xmx512m是最基本的内存分配,如果太小的话,碰到大报表就会死锁。还没有测出每CPU最大thread极限

 

---------addition----------

cluster环境台湾搭建也有问题,正在和德国厂商沟通

上周提交过去的报表台湾的工程师确认无法做到。peggy确认只做7天和14天两种周期,而不是天数任意。如果将来需要继续确认之前的方法,就要提交到德国公司,但是经过内部讨论,认为违反了crystalclear的基本设计原则,所以不抱太大希望。

isFailedReport方法确认过,无法在cluster环境中使用,也就是说无法判断cluster中其他node的报表的failed/ok的状态。目前说在6.1的版本中增加判断cluster的功能,正在要求其在6.0的正式版本中就提供。

仍待解决:extend自ReportViewBean的sample code还没有发过来,所以还未研究。

报表上的东西可以松一口气了

在线报表和排程报表大致上都有了明确的方向,目前只是需要和GIEA的steven确认两个问题就好了,压力没有那么大了。

记录一下问题:

1,Online:怎样隐藏参数?似乎应该用ReportViewBean的API...

2,batch:method:Cache.isFailedReport(ReportCacheKey) is not implemented for the ClusterCache.什么意思?那么在做cluster的时候会有什么问题和影响?

期望的功能:

可以订制Applet中export的项。

发现的bug:

在MicroSoft VM中print的部分会有错误。

翻页的时候有的时候会丢失一部分数据,不过刷新后就正常显示

2005/1/28

How do we configure cluster report on two computers?

How do we configure cluster report on two computers?

To configure the i-net Crystal-Clear cluster on two computers you only need to:

install i-net Crystal-Clear Plus on both computers that you will use as cluster nodes.

after that start the i-net Crystal-Clear configuration tool (e.g. double click on CrystalClear.jar) on each of these computers (cluster nodes) and specify the same i-net Crystal-Clear Plus license key in the field "License Key"

enable the cluster in the dialog "Cache / Cluster Properties" of the configuration tool
save the settings and start i-net Crystal-Clear on both computers.

Now you can send report requests to both i-net Crystal-Clear cluster nodes and each cluster node will ask the other cluster nodes in the i-net Crystal-Clear cluster if the requested report is in the cache of the cluster node. If not, then one cluster node will execute the report.

We recommend to use either harddisk cache or database cache (see dialog "Cache / Cluster Properties" of the configuration tool) instead of the memory cache on all cluster nodes.

Crystal-Clear的负载平衡

What is the i-net Crystal-Clear cluster?

A cluster is a network of multiple computers. Each computer of this "cluster network" is a cluster node. A cluster with Load Balancing has more power as a single computer.

In the i-net Crystal-Clear cluster a cluster node is a computer on that i-net Crystal-Clear is running with the same i-net Crystal-Clear Plus license key as on the other cluster nodes (computers) and on that the property "Cluster" is enabled (see configuration tool).

If you have installed i-net Crystal-Clear on two computers, you have entered the same i-net Crystal-Clear Plus license key and you have enabled the property "Cluster" on both then you have a cluster with two cluster nodes (two i-net Crystal-Clear engines that can render the reports).

给报表增加数据库的用户/模式

Can I specify the owner/schema of the table at run-time?

If you receive a "table or view not found" exception because the owner of
the table is not included in the sql statement generated by i-net
Crystal-Clear or you want to run the query for a different owner than the
one for which the report was designed, please append

  &schema=<owner>

at the end of the request URL. For example http://...&schema=SCOTT.
Please note the upper-case letters.

Another possibility is to set the owner (and/or other database properties)
in the method checkProperties on the servlet/server application side. For
more information please refer to the checkProperties API documentation and
to the checkProperties samples in the servlet and standalone samples that
you can find the in the sample folder of the documentation.

让Crystal-Clear使用App的connection pool

Can I use a database connection from the application server's connection
pool (datasources) with the servlet?

Since i-net Crystal-Clear version 4.0 it is possible to use a connection
from the application server's connection pool if you set up a JNDI name for
it. The following example shows this for the popular Apache/Tomcat servlet
engine:

Assuming you want to connect to the MS SqlServer database (pdssql.dll) and
use the Tomcat 4.x servlet engine to obtain the connection. We further
assume that you have installed the servlet installation of i-net
Crystal-Clear into the context /crystal and you want to use our JDBC driver
i-net UNA. You can visit the server.xml (located in
$TOMCAT_HOME/conf/server.xml) and add the following:

<Context path="/crystal" docBase="crystal" debug="0" reloadable="true"
crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger" prefix
="localhost_crystal_log." suffix=".txt" timestamp="true"/>
<Environment name="maxExemptions" type="java.lang.Integer" value="15"/>
<Parameter name="context.param.name" value="context.param.value" override
="false"/>

<Resource name="jdbc/pdssql.dll" auth="SERVLET"   type
="javax.sql.DataSource"/>
<ResourceParams name="jdbc/pdssql.dll">
<parameter><name>user</name><value>sa</value></parameter>
<parameter><name>password</name><value></value></parameter>
<parameter><name>driverClassName</name>
<value>com.inet.tds.TdsDriver</value></parameter>
<parameter><name>driverName</name>
<value>jdbc:inetdae7:YOUR-HOST?database=YOUR-DB</value></parameter>
</ResourceParams>

</Context>

Your JDBC driver should go into the classpath of the Tomcat servlet engine;
for example you can extract the classes located in the driver .jar file
into the directory $TOMCAT_HOME/classes (if that directory does not exist,
just create it). Or you can edit the catalina.bat (or catalina.sh on Unix)
startup script to include the driver .jar file into tomcat's global
classpath.

If you have another application server, the procedure is equivalent.

If the connection failed or the name jdbc/pdssql.dll is not bound, then
i-net Crystal-Clear will continue as usual and will use a connection from
our i-net Crystal-Clear connection pool (please see the settings in your
crystalclear.properties for details).

关于Crystal-Clear关闭缓存机制的相关信息

How can i disable the report cache to get always the current data in the report?

If a report is requested with the same report URL as before then the engine will load the report from cache (if it is included in the cache) instead of re-executing it.
If the value of the property "ReloadOnNewRequest" is true (default: false) then the engine will execute the report for each report request.
Also it is possible to use a dummy parameter, e.g. with a random number as value, in the report URL.

在Crystal-Clear中使用ResultSet的方法,唉,Crystal-Clear的资料也太少了

How do I provide data for my report when I don't want to fetch data from a database.

Via engine.setData(...), where the data can either be an object array or a result-set.
There are two possibilities, you can either set the data from within the checkProperties(Engine engine, ...) call-back or you can write your own database class to provide the data.

The essential steps to write your own database class are:

create (invent) a dll name; for example foo.dll
create a class from a file Foo.java (see the sample (DataWithoutJDBC.java in the jdbc folder of the documentation zip file) and compile that with javac -classpath . DataWithoutJdbc.java
Visit crystalclear.properties and connect foo.dll to your Foo.class by adding the following lines (foo.dll maps to symbol FOO which defines the class property Foo (without .class extension):
foo.dll=FOO
FOO.class=Foo
run your report with http://...my.rpt&dll=foo.dll. It will use the data you provide.