一、SQL
1、基础sql
查询:
SELECT语句
SELECT语句可以从一个或多个表中选取特定的行和列。因为查询和检索数据是数据库管理中最重要的功能,所以SELECT语句在SQL中是工作量最大的部分。实际上,仅仅是访问数据库来分析数据并生成报表的人可以对其他SQL语句一窍不通。
SELECT语句的结果通常是生成另外一个表。在执行过程中系统根据用户的标准从数据库中选出匹配的行和列,并将结果放到临时的表中。在直接SQL(direct SQL)中,它将结果显示在终端的显示屏上,或者将结果送到打印机或文件中。也可以结合其他SQL语句来将结果放到一个已知名称的表中。
SELECT语句功能强大。虽然表面上看来它只用来完成本文第一部分中提到的关系代数运算“选择”(或称“限制”),但实际上它也可以完成其他两种关系运算—“投影”和“连接”,SELECT语句还可以完成聚合计算并对数据进行排序。
SELECT语句最简单的语法如下:
SELECT columns FROM tables;
当我们以这种形式执行一条SELECT语句时,系统返回由所选择的列以及用户选择的表中所有指定的行组成的一个结果表。这就是实现关系投影运算的一个形式。
假设你想查看雇员工作部门的列表。那下面就是你所需要编写的SQL查询:
select branch_office form employess;
由于我们在SELECT语句中只指定了一个列,所以我们的结果表中也只有一个列。注意结果表中具有重复的行,这是因为有多个雇员在同一部门工作(记住SQL从所选的所有行中将值返回)。要消除结果中的重复行,只要在SELECT语句中加上DISTINCT子句:
SELECT DISTINCT BRANCH_OFFICE FROM EMPLOYEES;
现在已经消除了重复的行,但结果并不是按照顺序排列的。如果你希望以字母表顺序将结果列出又该怎么做呢?只要使用ORDER BY子句就可以按照升序或降序来排列结果:
SELECT DISTINCT BRANCH_OFFICE
FROM EMPLOYEES
ORDER BY BRANCH_OFFICE ASC;
请注意在ORDER BY之后是如何放置列名BRANCH _OFFICE的,这就是我们想要对其进行排序的列。为什么即使是结果表中只有一个列时我们也必须指出列名呢?这是因为我们还能够按照表中其他列进行排序,即使它们并不显示出来。列名BRANCH_ OFFICE之后的关键字ASC表示按照升序排列。如果你希望以降序排列,那么可以用关键字DESC。
同样我们应该指出ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。
假设我们希望得到按部门排序并从工资最高的雇员到工资最低的雇员排列的列表。除了工资括号中的内容,我们还希望看到按照聘用时间从最近聘用的雇员开始列出的列表。以下是你将要用到的语句:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。
将一个很长的表中的所有列名写出来是一件相当麻烦的事,所以SQL允许在选择表中所有的列时使用*号:
SELECT * FROM EMPLOYEES;
下面我们对开始时给出的SELECT语句的语法进行一下更新(竖直线表示一个可选项,允许在其中选择一项。):
SELECT [DISTINCT]
(column [{, columns}])| *
FROM table [ {, table}]
[ORDER BY column [ASC] | DESC
[ {, column [ASC] | DESC }]];
定义选择标准
在我们目前所介绍的SELECT语句中,我们对结果表中的列作出了选择但返回的是表中所有的行。让我们看一下如何对SELECT语句进行限制使得它只返回希望得到的行:
SELECT columns FROM tables [WHERE predicates];
WHERE子句对条件进行了设置,只有满足条件的行才被包括到结果表中。这些条件由断言(predicate)进行指定(断言指出了关于某件事情的一种可能的事实)。如果该断言对于某个给定的行成立,该行将被包括到结果表中,否则该行被忽略。在SQL语句中断言通常通过比较来表示。例如,假如你需要查询所有姓为Jones的职员,则可以使用以下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones';
LAST_NAME = 'Jones'部分就是断言。在执行该语句时,SQL将每一行的LAST_NAME列与“Jones”进行比较。如果某一职员的姓为“Jones”,即断言成立,该职员的信息将被包括到结果表中.
使用最多的六种比较
我们上例中的断言包括一种基于“等值”的比较(LAST_NAME = 'Jones'),但是SQL断言还可以包含其他几种类型的比较。其中最常用的为:
等于 =
不等于 <>
小于 <
大于 >
小于或等于 <=
大于或等于 >=
下面给出了不是基于等值比较的一个例子:
SELECT * FROM EMPLOYEES
WHERE SALARY > 50000;
这一查询将返回年薪高于$50,000.00的职员.
逻辑连接符
有时我们需要定义一条不止一种断言的SELECT语句。举例来说,如果你仅仅想查看Davy Jones的信息的话,表6中的结果将是不正确的。为了进一步定义一个WHERE子句,用户可以使用逻辑连接符AND,OR和NOT。为了只得到职员Davy Jones的记录,用户可以输入如下语句:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' AND FIRST_NAME = 'Davy';
在本例中,我们通过逻辑连接符AND将两个断言连接起来。只有两个断言都满足时整个表达式才会满足。如果用户需要定义一个SELECT语句来使得当其中任何一项成立就满足条件时,可以使用OR连接符:
SELECT * FROM EMPLOYEES
WHERE LAST_NAME = 'Jones' OR LAST_NAME = 'Smith';
有时定义一个断言的最好方法是通过相反的描述来说明。如果你想要查看除了Boston办事处的职员以外的其他所有职员的信息时,你可以进行如下的查询:
SELECT * FROM EMPLOYEES
WHERE NOT(BRANCH_OFFICE = 'Boston');
关键字NOT后面跟着用圆括号括起来的比较表达式。其结果是对结果取否定。如果某一职员所在部门的办事处在Boston,括号内的表达式返回true,但是NOT操作符将该值取反,所以该行将不被选中。
断言可以与其他的断言嵌套使用。为了保证它们以正确的顺序进行求值,可以用括号将它们括起来:
SELECT * FROM EMPLOYEES
WHERE (LAST_NAME = 'Jones'
AND FIRST_NAME = 'Indiana')
OR (LAST_NAME = 'Smith'
AND FIRST_NAME = 'Bessie');
SQL沿用数学上标准的表达式求值的约定—圆括号内的表达式将最先进行求值,其他表达式将从左到右进行求值。
以上对逻辑连接符进行了说明,在对下面的内容进行说明之前,我们再一次对SELECT语句的语法进行更新:
SELECT [DISTINCT]
(column [{, column } ] )| *
FROM table [ { , table} ]
[ORDER BY column [ASC] | [DESC
[{ , column [ASC] | [DESC } ] ]
WHERE predicate [ { logical-connector predicate } ];
NULL和三值逻辑
在SQL中NULL是一个复杂的话题,关于NULL的详细描述更适合于在SQL的高级教程而不是现在的入门教程中进行介绍。但由于NULL需要进行特殊处理,并且你也很可能会遇到它,所以我们还是简略地进行一下说明。
首先,在断言中进行NULL判断时需要特殊的语法。例如,如果用户需要显示所有年薪未知的职员的全部信息,用户可以使用如下SELECT语句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NULL;
相反,如果用户需要所有已知年薪数据的职员的信息,你可以使用以下语句:
SELECT * FROM EMPLOYEES
WHERE SALARY IS NOT NULL;
请注意我们在列名之后使用了关键字IS NULL或IS NOT NULL,而不是标准的比较形式:COLUMN = NULL、COLUMN <> NULL或是逻辑操作符NOT(NULL)。
这种形式相当简单。但当你不明确地测试NULL(而它们确实存在)时,事情会变得很混乱。
例如,回过头来看我们图1中的EM-PLOYEES表,可以看到Indiana Jones的工薪等级或年薪值都是未知的。这两个列都包含NULL。可以想象运行如下的查询:
SELECT * FROM EMPLOYEES
WHERE GRADE <= SALARY;
此时,Indiana Jones应该出现在结果表中。因为NULL都是相等的,所以可以想象它们是能够通过GRADE小于等于SALARY的检查的。这其实是一个毫无疑义的查询,但是并没有关系。SQL允许进行这样的比较,只要两个列都是数字类型的。然而,Indiana Jones并没有出现在查询的结果中,为什么?
正如我们早先提到过的,NULL表示未知的值(而不是象某些人所想象的那样表示一个为NULL的值)。对于SQL来说意味着这个值是未知的,而只要这个值为未知,就不能将其与其他值比较(即使其他值也是NULL)。所以SQL允许除了在true 和false之外还有第三种类型的真值,称之为“非确定”(unknown)值。
如果比较的两边都是NULL,整个断言就被认为是非确定的。将一个非确定断言取反或使用AND或OR与其他断言进行合并之后,其结果仍是非确定的。由于结果表中只包括断言值为“真”的行,所以NULL不可能满足该检查。从而需要使用特殊的操作符IS NULL和IS NOT NULL。
增加:
INSERT INTO table
[(column { ,column})]
VALUES
(columnvalue [{,columnvalue}]);
insert into tableName(字段,字段) values(对应字段对应类型的值)
修改:
update tableName set 字段=对应类型的值 where .....
记得加上条件,小心把表中的所有数据都修改了, 满足WHERE条件的所有行都将被更新
删除:
delete 字段 from tableName where ....
省略where子句将使得操作施加到表中所有的行
2、在程序中,如果需要对一个table的某块部分数据进行操作,那么可以采用
使用临时表的方法:
@1,先判断这个临时表是否已经存在,如果存在就删掉这个临时表:
select object_id('#临时表名'))
@2,再从table中把需要的那些数据都放入临时表中
select * into #临时表名 from tableName where table中字段的条件
@3,按照预先的需求,对临时表中的数据进行操作
update 临时表中的数据
@4,把修改了的数据更新到原来的table中去
insert into tableName select * from #临时表名
@5,当你不需要这个临时表时就可以删除临时表
drop table #临时表名
3、查询是否存在
select 1 from tableName where ......
这样rs.next 里面直接可以置boolean变量为true或false.
4、查询条件
(1)不重复:distinct
不管这个值有多少重复值,使用distinct的查询结果都只显示一次。
select distinct 字段名1,字段名2 from 表格 order by 字段名1 distinct 会对返回的结果集进行排序 所以会大大影响查询效率,大数据集时比较明显
最好和order by 结合使用。可以提高效率
(2)排序order by
ORDER BY子句只将临时表中的结果进行排序;并不影响原来的表。
升序(默认): asc
降序:desc
order by 字段 desc /asc
多列排序:
SELECT BRANCH_OFFICE,FIRST_NAME,
LAST_NAME,SALARY,HIRE_DATE
FROM EMPLOYEES
ORDER BY SALARY DESC,
HIRE_DATE DESC;
这里我们进行了多列的选择和排序。排序的优先级由语句中的列名顺序所决定。SQL将先对列出的第一个列进行排序。如果在第一个列中出现了重复的行时,这些行将被按照第二列进行排序,如果在第二列中又出现了重复的行时,这些行又将被按照第三列进行排序……如此类推。这次查询的结果如表5所示。
(3)分组:group by
分组条件:having
5、case when then
case 字段 when 对应类型的值 then 结果
例如,在角色描述的程序中有这样一个sql:
select mycis_role,description=(case mycis_role when 'M' then 'TIMECARD MANAGER'
when 'H' then 'TIMECARD HR' when 'B' then 'TIMECARD BENEFIT' else '' end) from timecard_matrix where userid=2779
6、不等于空
。。。。where lastname<>null or firstname<>null
7、使用变量
select @start_tc_date=min(tcs.start_date) from tabelName
二、PROCEDURE
存储过程是我从网上摘抄来的,但是忘记是哪个网了,十分抱歉!
1,注释:
-- 单行注释,从这到本行结束为注释, /* … */ 多行注释
2,
建立存储过程
Greate procedure 存储过程名称( @形式参数 类型,。。。可以有多个)
as sql
3,变量
类型: int, smallint, tinyint, decimal,float,real, money ,smallmoney, text ,image, char, varchar。。。。。。
例如:
declare @ID int --申明一个名为@ID的变量,类型为int型
赋值:
set @变量=值
例如:
set @id=1
或者
select @变量=一个语句
例如:
select @id= doc_char from no_ctrl
4、打印出变量的值
只有varchar的才可以打印
5.变量运算(+,-,*,/,……)
以下必要时候省略变量申明
1. Set @ID = (select 1+5) --类似 @ID=1+5
2. Set @ID=(select 1-@ID) --类似 @ID=1-@ID
6.比较操作符
• > (greater than).
• < (less than).
• = (equals).
• <= (less than or equal to).
• >= (greater than or equal to).
• != (not equal to).
• <> (not equal to).
• !< (not less than).
• !> (not greater than).
没什么说的
7.语句块:Begin … end
将多条语句作为一个块,类似{ }
例如:
1. Begin
2. Set @ID1 = (select 1)
3. Set @ID2 = (select 2)
4. End
8.If, if…else…
语法:
IF Boolean_expression
{sql_statement | statement_block}
[ELSE
{sql_statement | statement_block}]
例如:
1. If @id is not null
2. Print ‘@id is not null
3. if @ID = 1
4. begin
5. Set @ID = (select 1 + 1)
6. end
7. else
8. begin
9. set @ID=(select 1+2)
10. end
上面的例子用到了比较操作符,语句块,和IF的语法。
9.执行其他存储过程 EXEC
EXEC 存储过程名 @参数=对应类型的参数值
多个参数之间用,号隔开
例如
EXEC timecard_sum3_report @Beginning_Date=’ 1/01/90 ’, @Ending_Date=’1/01/ 08’
10.事务
语法:
BEGIN TRAN[SACTION] [transaction_name | @tran_name_variable]
例如
1. BEGIN TRAN
2. -- 做某些操作,例如Insert into …
3. if @@error <> 0
4. BEGIN
5. ROLLBACK TRAN
6. END
7. else
8. BEGIN
9. COMMIT TRAN
10. END
11.游标
我们可以在存储过程中用select语句取出每一行数据进行操作,这就需要用到游标。
语法:
DECLARE cursor_name CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR select_statement
[FOR UPDATE [OF column_name [,...n]]]
例如:
1. DECLARE @au_id varchar(11), @au_fname varchar(20) –申明变量
2. --申明一个游标
3. DECLARE authors_cursor CURSOR FOR
4. SELECT au_id, au_fname FROM authors
5. --打开游标
6. OPEN authors_cursor
7. --取出值
8. FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname
9. --循环取出游标的值
10. WHILE @@FETCH_STATUS = 0
11. BEGIN
12. Print @au_id
13. Print @au_fname
14. Print ‘ ’
15. FETCH NEXT FROM authors_cursor
16. INTO @au_id, @au_fname
17. END
18. CLOSE authors_cursor –关闭游标
19. DEALLOCATE authors_cursor --释放游标
我觉得上面的是存储过程常用的一些东东,如果要更深入的了解,更详细的帮助,请参考SQL Server的帮助文档
12、case
case '字段' when (字段= 值1) then 结果
when (字段=值2) then 结果
else 结果
end
case when (表达式1)then 结果
when (表达式1) then 结果
else 结果
end
例如:
case
when statu='O' then 'Open'
when statu='Y' then 'Approved'
when statu ='C' then 'End Approved'
when statu ='N' then 'Rejected'
else statu
end ' statu '
三、修改环境变量
前几天,电脑中毒了,是一种system.exe的病毒,经过两天的清毒拼战,最后我无奈的以牺牲我的系统为代价,才删掉了它。随后而来的便是一堆的麻烦。要重装所有的东西。
1, JDK
我用的是jdk-1_5_0_07-windows-i586-p.exe
点击它,安装JDK
2, 配置环境变量
安装完JDK后,记得一定要配置环境变量!
在“我的电脑”上点击右键,出现图1,如图:
图1
单击“环境变量(N)”后,出现图2, 在下方那个系统变量的框里单击新建,
设置下面变量:
变量名:JAVA_HOME
变量值:c:/bea/jdk142_05 (这个是你的JDK的安装目录,就是你装完JDK后,存放JDK的那个目录)
。。。。。。。。。
配置完这些变量后,如图2:
图2
3, 测试1,2两步的效果是否正常
我们做个测试:
在记事本上写上一段JAVA代码:假设把记事本文件存放到了E盘根目录下。
然后点击开始菜单,点击运行,输入“cmd“。
在弹出的窗口中输入“E:“,然后回车。如图3:
图3
接着输入:“javac hello.java“;
查看可以发现在hello.java文件的目录里多了一个文件,叫做“java.class“。
四 、Web(Weblogic)
下面的文章是从网上摘抄的,但是那个网页似乎有病毒,所以没敢在打开了。
本文以weblogic 8.12 中文版为例,将配合贴图讲解安装、配置过程。
Weblogic安装开始:
1.1 让人敬佩的bea公司:
提到weblogic,不得不说bea公司。也许大家没有留意,bea公司是一个才1995年才创立的企业,可是这个比我们小一两个时代的小年轻,却是历史上最快实现年营业额达到10亿美元的软件公司,现在号称是全球第6大独立软件公司,确实让人很汗~。
1.2 何处有Webogic?
去网上找了一下,weblogic8.12 + sp2 中文版可以在9iv网站上找到下载。
地址是:http://www.9iv.com/down/down.asp?id=855&no=3
1.3 Weblogic安装其实很傻瓜:
1.3.1
总的来说,weblogic安装过程,抓住两个环节就ok:
◎bea主目录:这是weblogic基础工具程序的主目录;
◎产品安装目录:这是weblogic产品的安装目录
1.3.2 点击开始安装后,漫长的解压之后,开始出现安装界面,结合我的情况,设定bea
主目录为d:/bea,其它都取默认值,一路next,BEA_installer会帮你全盘搞定,
完毕后,点击完成结束。
安装完成后,就可以开始着手部署J2EE项目了。
开始部署J2EE web项目
Web项目的部署采用Configuration Wizard工具。依次点击“开始”->“BEA WebLogic Platform
8.1”
->“Configuration Wizard”,启动”BEA WebLogic Configuration Wizard”。
2.1 新建weblogic domain
选择”新建weblogic配置”,
然后”下一步”,在”模板”选择”base weblogic server domain”,
然后”下一步”,没有特别的需要就不修改默认选择,然后”下一步”,在这个界面上输入用户名、密码(如填写用户wangnewton,密码wangnewton)和创建这个服务的描述(请记住这个用户密码它是启动这个服务和进入服务控制台的帐号)
然后”下一步”,选择JDK的版本,然后”下一步”,在这个界面你可以修改创建服务的目录和配置名称,然后按”创建”开始创建。
点击完成结束。
2.2 创建应用目录:创建应用目录有两种方式分别介绍如下
2.2.1
方法一:继续采用Configuration Wizard 创建
这次选择”extend and existing weblogic configuration(扩展weblogic配置)”,
然后“下一步”,选择前面配置的weblogic配置目录mydomain,然后“下一步”,
在”Configuration Extensions”中勾选”DefaultWebApp”,
然后以下取默认值一路”下一步”直到”导入”就OK了。
默认应用目录一般在D:/bea/user_projects/applications/mydomain/DefaultWebApp(注:d:为我PC机上安装weblogic的盘符,读者根据安装目录进行查找)。
测试:启动weblogic服务,然后输入http://localhost:7001就可以看到介绍性页面了。
2.2.2方法二:使用控制台创建应用目录
使用这个方法最好先要有一个可以发布的web应用,比如大家做过的基于tomcat的项目。没有的话至少要有webapp/WEB-INF/web.XML文件,web.xml文件类似于:
webapp
|__WEB-INF/web.xml
web.xml内容一般是:
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://Java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</web-app>
创建好如上的文件结构和web.xml后,启动weblogic服务,完成后在浏览器中输入http://127.0.0.1:7001/console
在登录界面输入你创建weblogic服务时的用户密码(wangnewton)。然后sign in,在下面的页面中选择“Web Application Modules”
点击后进入该界面,点击Deploy a new Web Application Module...
在“Location”下选择你刚才创建的appweb(注意这个目录一定要有WEB-INF目录,并且在WEB-INF目录下一定要有web.xml文件,否则不能够创建应用目录)。选择后,点击”target module”,
返回,可以看到当前weblogic服务中依成功创建的应用目录了。然后再创建一个index.html文档放在appweb目录下,就完成了应用目录的创建。
测试:启动weblogic服务,然后输入http://127.0.0.1:7001/webapp/index.html就可以看到自己设置的页面了。
PS:相对来说,方法二是实际项目中使用最多的一种配置方法。
继续PS:如何设置项目为默认启动路径?
对于刚才创建的应用目录,总要通过http://127.0.0.1:7001/webapp/index.html,能否直接设置成通过http://127.0.0.1:7001/index.html可以访问的方式呢?
方法是在webapp/WEB-INF下新建一个weblogic.xml文件,
webapp
|__WEB-INF/weblogic.xml
weblogic.xml内容一般是:
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<context-root>/</context-root>
</weblogic-web-app>
三、weblogic 连接池的配置
实例背景:SQL-SERVER 2000的数据库 + JDBC3.0
3.1 配置连接池
进入控制台(console) 可以看到该界面 ,然后点击 Connetion Pools
点击后进入该界面,点击configure a new JDBC Conneciton Pool
点击后显示该界面 因为是使用SQL-SERVER 2000 所以选择MS SQL Server
选择后,选择 MicroSoft’s MS SQL Server Driver (type) Version 。。。[倒数第三个^-^]然后点击Continue
按页面要求填入相关信息
此步骤完成后,进入该页面
点击 Test Driver Configuration ,如果是成功显示该页
点击Create and deploy,
3.2 配置数据源
进入控制台,点击date source。。。
点击后显示该页 点击 configure a new JDBC Data Source
点击后进入该页
以下步骤都是默认选择后显示
由此,数据源就配置成功了,记住这里的JNDIName配置为MyJNDI,稍后将会在程序中被使用。
四、weblogic 连接池测试程序
为了方便,采用一个简单JSP程序进行连接池的测试,连接池使用起来不但可以提高系统吞吐量,而且连接程序也是很简单的。一般大家手头上都会有专业的数据库连接组件,把这个组件修改成为weblogic连接池的组件也是很简单的,只需要执行简单几行代码替换就ok了。但作为新手,可以通过这个jsp测试刚才建立的连接池设置。
<%@ page contentType="text/html;charset=GBK" %>
<%@ page import= "java.sql.* " %>
<%@ page import= "javax.sql.* " %>
<%@ page import= "javax.naming.* "%>
<HTML>
<HEAD>
<TITLE> </TITLE>
<META NAME="Generator" CONTENT="EditPlus2.11">
</HEAD>
<BODY>
<%
// 从weblogic 8 文档抄来
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL,"t3://127.0.0.1:7001");
// ht.put(Context.SECURITY_PRINCIPAL, "admin");
// ht.put(Context.SECURITY_CREDENTIALS, "11111111"); Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
ctx = new InitialContext(ht);
DataSource ds = (DataSource)ctx.lookup ("MyJNDI");
conn = ds.getConnection();
stmt = conn.createStatement();
stmt.execute("select * from accounts");
rs = stmt.getResultSet();
while ( rs.next()){
out.println( rs.getString(1)+"___");
out.println( rs.getString(2)+"___");
out.println( rs.getString(3)+"<br>");
}
stmt.close();
stmt=null;
conn.close(); conn=null;
}catch (Exception e) {
out.println("错误 !! ERR !" );
}
finally {
try {
ctx.close();
} catch (Exception e) {
out.println("ctx ERR !" ); }
try {
if (rs != null) rs.close();
} catch (Exception e) {
out.println("rs ERR !" ); }
try {
if (stmt != null) stmt.close();
} catch (Exception e) {
out.println("stmt ERR !" ); }
try {
if (conn != null) conn.close();
} catch (Exception e) {
out.println("conn ERR !" ); } }
%>
</BODY>
</HTML>
窗体底端