第一篇:JDBC连接数据库经验总结
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。
一、连接各种数据库方式速查表
下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。
1、Oracle8/8i/9i数据库(thin模式)
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();String url=“jdbc:oracle:thin:@localhost:1521:orcl”;//orcl为数据库的SID String user=“test”;String password=“test”;Connection conn= DriverManager.getConnection(url,user,password);
2、DB2数据库
Class.forName(“com.ibm.db2.jdbc.app.DB2Driver ”).newInstance();String url=“jdbc:db2://localhost:5000/sample”;//sample为你的数据库名 String user=“admin”;String password=“";Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000数据库
Class.forName(”com.microsoft.jdbc.sqlserver.SQLServerDriver“).newInstance();String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb“;//mydb为数据库 String user=”sa“;String password=”“;Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase数据库
Class.forName(”com.sybase.jdbc.SybDriver“).newInstance();String url =” jdbc:sybase:Tds:localhost:5007/myDB“;//myDB为你的数据库名
Properties sysProps = System.getProperties();SysProps.put(”user“,”userid“);SysProps.put(”password“,”user_password“);Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix数据库
Class.forName(”com.informix.jdbc.IfxDriver“).newInstance();String url = ”jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword“;//myDB为数据库名 Connection conn= DriverManager.getConnection(url);
6、MySQL数据库
Class.forName(”org.gjt.mm.mysql.Driver“).newInstance();String url =”jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1“ //myDB为数据库名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL数据库
Class.forName(”org.postgresql.Driver“).newInstance();String url =”jdbc:postgresql://localhost/myDB“ //myDB为数据库名 String user=”myuser“;String password=”mypassword“;Connection conn= DriverManager.getConnection(url,user,password);
8、access数据库直连用ODBC的
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);String url=”jdbc:odbc:Driver={MicroSoft Access Driver(*.mdb)};DBQ=“+application.getRealPath(”/Data/ReportDemo.mdb“);Connection conn = DriverManager.getConnection(url,”“,”“);Statement stmtNew=conn.createStatement();
二、JDBC连接MySql方式
下面是使用JDBC连接MySql的一个小的教程
1、查找驱动程序
MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。
2、动态指定classpath 如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。
3、加载驱动程序
try{ Class.forName(com.mysql.jdbc.Driver);System.out.println(Success loading Mysql Driver!);}catch(Exception e){ System.out.println(Error loading Mysql Driver!);e.printStackTrace();}
4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧
1、在客户端软件开发中使用Thin驱动程序
在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。
2、关闭自动提交功能,提高系统性能
在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态SQL或有时间限制的命令中使用Statement对象
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。
此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。
4、利用helper函数对动态SQL命令进行格式化
在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。
5、利用PreparedStatement对象提高数据库的总体效率
在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。
6、在成批处理重复的插入或更新操作中使用PreparedStatement对象
如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():
PreparedStatement pstmt3D null;try {((OraclePreparedStatement)pstmt).setExecuteBatch(30);...pstmt.executeUpdate();}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。
7、使用Oracle locator方法插入、更新大对象(LOB)
Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。
8、使用SQL92语法调用存储过程
在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。
9、使用Object SQL将对象模式转移到数据库中
既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。
10、利用SQL完成数据库内的操作
我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。
如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。11 JNDI
try{
InitialContext ctx=new InitialContext();Object o = ctx.lookup(”java:comp/env/hibernate“);out.print(”class="+o.getClass().getName());DataSource ds=(javax.sql.DataSource)o;}catch(NamingException e){
e.printSatckTrace;}
第二篇:JDBC方式连接数据库心得体会
1、在新建好的数据库中建立一张名字为UserTable的数据表,定义好各个字段的数据类型和主键。表的设计结构如下:(仅作测试使用)UserTable:
其中UserId为主键。
2、在表中写入适当的数据以供测试使用。
3、配置数据源,使得java应用程序能够通过该数据源来访问数据库的内容。具体操作:打开控制面板---系统和安全---管理工具---数据源ODBC 窗口如下:
选择用户DSN或者系统DSN 并单击【添加】(注意:用户DSN只对当前用户有效。如需对多个用户使用,请选择系统DSN)
选择合适的数据源驱动程序。在这里选择SQL SERVER.单击【完成】进入到下一步。
在【名称】中输入合适的名称尽量用英文,方便在jdbd-odbc中使用。输入正确的数据库验证信息之后,便可以成功的配置数据源。
至此,数据源配置业已基本完成。
接下来将介绍如何在代码中连接数据库进行操作。
4、打开Myeclipse开发环境。新建一个“学生成绩管理系统”—然后新建一个自定义的包(也可不建立,习惯问题)。我建立一个名为com.dcy的包。然后在该包中新建一个class文件。把如下代码贴进来。用来测试是否连接成功。
package com.dcy;
import java.sql.*;
public class ConnectionTest {
} public ConnectionTest(){ //构造函数 } public static void Query(){
try {
} while(ret.next())
{
} System.out.println(ret.getString(1));} catch(ClassNotFoundException e){
} String url=“jdbc:odbc:StuManager”;String sql=“select * from UserTable”;Connection con=DriverManager.getConnection(url,“sa”,“sa”);Statement state=con.createStatement();ResultSet ret=state.executeQuery(sql);// TODO Auto-generated catch block e.printStackTrace();try { Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);} catch(SQLException e){ // TODO Auto-generated catch block e.printStackTrace();}
public static void main(String [] args){ } Query();运行程序的时候会出现以下错误。原因是确实第三方的jar包。这时需要导入微软的sqljdbc.jar包 选择工程---属性—java build path---libraries---add external jars 如下图
导入sqljdbc.jar 然后再工程中引用改包即可。
至此,就能对数据库进行操作了。
第三篇:关于JDBC数据分页跨数据库小结
关于JDBC数据分页跨数据库小结
一、关于数据连接connection如何区分数据库类型
// 获取数据生产商名称
String databaseProductName = conn.getMetaData().getDatabaseProductName();// 获取数据库版本号
String productVersion = conn.getMetaData().getDatabaseProductVersion();
测试结果:
Oracle // // //
databaseProductName :Oracle
productVersion :Oracle Database 10g Enterprise Edition Release 10.2.0.1.01)* page.getPageSize();int endRow = startRow + page.getPageSize();String osql = “select * from(select t.*,rownum as rn from(”
+ sql+ “)t where rownum<=” + endRow + “)where rn>” + startRow;
} return osql;
三、MYSQL数据库分页方案采用 limit 关键字
1.SQL语句:
select trty.* from(select * from table)trty limit startrow ,endrow
2.生成分页SQL代码:
/**
* MySql数据库分页专用
* @param sql
* @param page
* @return String
* @see 未测试
*/
private static String wrapPage4MySql(String sql, Page page){
int startRow =(page.getPageNo()1)* page.getPageSize();int endRow = page.getPageNo()* page.getPageSize();Statement statement = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = statement.executeQuery(sql);
// 查询范围超过,返回空rows rs.last();int rownum = rs.getRow();if((startRow+1)> rownum){ }
// 判断分页总数是否超过实际数量 int startnum = startRow + 1;int endnum = endRow + 1;if(rownum < endnum){ } // 定位到当前页
rs.absolute(startnum);while(startnum <= endnum){ rows.add(buildOneRow(rs));startnum++;endnum = rownum;return rows;
} } return rows;
五、Microsoft SQL Server数据库分页方案探索
1.方案一 采用top关键字
SQL语句:
SELECT TOP 10 * FROM TestTable WHERE ID NOT IN
(SELECT TOP 20 id FROM TestTable ORDER BY ID)ORDER BY ID
2.方案二 用top关键字
SELECT TOP 10 * FROM TestTable WHERE ID >
(SELECT MAX(id)FROM(SELECT TOP 20 id FROM TestTable ORDER BY id)AS T)ORDER BY ID
3.方案一和二本质一样,但是方案二的效率比较高。对于复杂的SQL不能采用此中分页方式,除非有逻辑严谨的拆解SQL语句的程序。
4.方案三采用存储过程分页,在JAVA程序中调用存储过程。
1)存储过程代码如下
IF NOT EXISTS(SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]')AND OBJECTPROPERTY(id,N'IsProcedure')= 1)BEGIN
EXEC dbo.sp_executesql @statement = N'create procedure [dbo].[Pr_QueryByPage]
@sqlstr nvarchar(4000),--查询sql @currentpage int,--第页记录条数 @pagesize int--每页显示记录
as
set nocount on
declare @P1 int,--P1是游标的ID @rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize)as TotalPage,@rowcount as [RowCount]
set @currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off ' END GO
2)代码调用
/**
List
*
* @param conn
* @param sql
* @param page
* @return
* @throws Exception
* @see 测试通过
*/
private static List
// 设置存储过程参数
cs.setString(1, sql);cs.setInt(2, pageno);cs.setInt(3, pagsize);cs.execute();boolean hasResultSet = cs.execute();if(hasResultSet){
} return rows;} ResultSet rs = null;/** 跳过第一个结果集 */ rs = cs.getResultSet();/** 第二个结果集为查询分页数据 */ if(cs.getMoreResults()){
} rs = cs.getResultSet();while(rs.next()){ } rows.add(buildOneRow(rs));// 调用存储过程分页
CallableStatement cs = conn.prepareCall(“{call Pr_QueryByPage(?,?,?)}”);int pageno = page.getPageNo();int pagsize = page.getPageSize();5.关于SQLSERVER2005分页方案的选择
1)2005分页方案可以采用存储过程,和2000的方案兼容。2)2005第二种分页方案采用RowNumber()函数可以实现。
SQL实例:
SELECT * FROM(SELECT
ROW_NUMBER()OVER(ORDER BY Namec)AS RowNumber, FROM
dbo.mem_member)_myResults WHERE
RowNumber between 10000 and 10020 缺点:此种方案关键函数 ROW_NUMBER()必须进行order by排序。如果采用此种方案必须拆分SQL语句。
第四篇:java连接sqlserver2005数据库心得体会
sqlserver数据库:java连接sqlserver2005数据库心得体会
首先得下载驱动程序到微软网站下载Microsoft SQL Server 2005 JDBC Driver 1.2
解压Microsoft SQL Server 2005 jdbc driver1.2.exe,把sqljdbc_1.1复制到%ProgramFiles%(如果系统在C盘则为C:Program Files)。
设置 Classpath
JDBC 驱动程序并未包含在 Java SDK 中。因此,如果要使用该驱动程序,必须将 classpath 设置为包含 sqljdbc.jar 文件。如果 classpath 缺少 sqljdbc.jar 项,应用程序将引发“找不到类”的常见异常。
sqljdbc.jar 文件的安装位置如下:
<安装目录>sqljdbc_<版本><语言>sqljdbc.jar
下面是用于 Windows 应用程序的 CLASSPATH 语句实例:
CLASSPATH =.;%ProgramFiles%sqljdbc_1.2chssqljdbc.jar
设置SQL Server服务器
我使用的是SQL Server 2005标准版SP2,这些都默认即可,一般不用配置。如果需要配置端口请看下面。
1、“开始”→“程序”→“Microsoft SQL Server 2005”→“配置工具”→“SQL Server 配置管理器”→“SQL Server 2005 网络配置”→“MSSQLSERVER 的协议”
2、如果“TCP/IP”没有启用,右键单击选择“启动”。
3、双击“TCP/IP”进入属性设置,在“IP 地址”里,可以配置“IPAll”中的“TCP 端口”,默认为1433。
4、重新启动SQL Server或者重启计算机。
建议重启电脑。
在Eclipse中测试
1、打开Eclipse,“文件”→“新建”→“项目”→“Java 项目”,项目名为Test
2、在Eclipse中,选择“窗口”→“首选项...”→“Java”→“已安装的 JRE”,选择已安装的 JRE,点击“编辑”→“添加外部”,选择%ProgramFiles%sqljdbc_1.1chssqljdbc.jar
3、在Test项目的“JRE 系统库”中可以看见sqljdbc.jar,如果没有可以右键单击项目Test→“构建路径”→“配置构建路径...”→“Java 构建路径”→“库”→“添加外部 JAR...”,选择%ProgramFiles%sqljdbc_1.1chssqljdbc.jar
4、编写Java代码,如下:
import java.sql.*;
public class Test {
public static void main(String[] srg){
String driverName = “com.microsoft.sqlserver.jdbc.SQLServerDriver”;//加载JDBC驱动
String dbURL = “jdbc:sqlserver://localhost:1433;DatabaseName=test”;//连接服务器和数据库test
String userName = “sa”;//默认用户名
String userPwd = “123456”;//安装sql server 2005时的密码
Connection dbConn;
try {
Class.forName(driverName);
dbConn = DriverManager.getConnection(dbURL, userName, userPwd);
System.out.println(“Connection Successful!”);//如果连接成功 控制台输出Connection Successful!
} catch(Exception e){
e.printStackTrace();
}
}
}
第五篇:ORACLE数据库开发经验总结
ORACLE数据库开发经验总结
----ORACLE数据库作为大型数据库管理系统,近年来一直占有世界上高端数据库的最大 份额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成 为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台,前端选 择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作为开发工具,采用了目前流行的
CLIENT/SERVER模式。本人在ORACLE系统的开发中,就ORACLE的整套开发工具提出一些自
己的体会,供同行参考。
----一.ORACLE SQL PLUS 使用技巧:----①查找重复记录:
SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。----删除重复记录:
DELETE FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID)FROM EM5 _PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO);----执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。----② 快速编译所有视图
----当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因 为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快 速编译。
SQL >SPOOL ON.SQL SQL >SELECT ‘ALTER VIEW ‘||TNAME||’
COMPILE;’ FROM TAB;SQL >SPOOL OFF 然后执行ON.SQL即可。
SQL >@ON.SQL 当然,授权和创建同义词也可以快速进行,如:
SQL >SELECT ‘GRANT SELECT ON ’ ||TNAME||’ TO USERNAME;’ FROM TAB;SQL >SELECT ‘CREATE SYNONYM
‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;③ 用外联接提高表连接的查询速度
在作表连接(常用于视图)时,常使用以下方法来查询数据: SELECT PAY_NO, PROJECT_NAME FROM A WHERE A.PAY_NO NOT IN(SELECT PAY_ NO FROM B WHERE VALUE >=120000);----但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因 为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外
联接后,可以缩短到1分左右的时间: SELECT PAY_NO,PROJECT_NAME FROM A,B WHERE A.PAY_NO=B.PAY_NO(+)AND B.PAY_NO IS NULL AND B.VALUE >=12000;----④ 怎样读写文本型操作系统文件
----在PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下: DECALRE FILE_HANDLE UTL_FILE.FILE_TYPE;BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(‘C:’,’TEST.TXT’,’A’);
UTL_FILE.PUT_LINE(FILE_HANDLE,’ HELLO,IT’S A TEST TXT FILE’);UTL_FILE.FCLOSE(FILE_HANDLE);END;----相关UTL_FILE数据库包详细信息可以参见相关资料。----⑤ 怎样在数据库触发器中使用列的新值与旧值
----在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改 前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_ NO,:NEW.DEPT_NO。
----二.ORACLE DEVELOPER 2000使用技巧:
----① 改变FORM(FMX模块)运行时的Runform4.5的题头:
----DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows
/ NT 你可以改为自己定义的标题,----1.在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE----2.在此触发器中写如下代码:
set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT SYSTEM 欢迎使用');----② 如何隐藏菜单中的window选项:
----在创建自己的菜单时,最后选项总有window项,下面介绍如何去掉它,----1.创建一个Menu
----2.在Menu中建立一个Item,命名为WINDOW。----3.设置该Item属性如下:----
Menu Item Type:Magic Command Type:Null Magic Item:Window Lable:为空
----③ 怎样创建动态下拉列表List
----Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的,但那
只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手 去编个小程序。下面详细介绍怎样去做:----有块EBOP_CABLE_ACCOUNT,下有SPECIFICATION数据项,当一进入该模块时,就将
SPECIFICATION项在数据库中存储的值动态显示出来,先在Form4.5中建立一个PRCEDURE,命名为DYN_LIST: PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)FROM EBOP_CABLE_ACCOUNT;CNT NUMBER;i NUMBER;TNAME EBOP_CABLE_ ACCOUNT.SPECIFICATION%TYPE;BEGIN
CLEAR_LIST('EBOP_CABLE_ ACCOUNT.SPECIFICATION');SELECT COUNT(DISTINCT
(SPECIFICATION))INTO CNT FROM EBOP _CABLE_ACCOUNT;open C1;FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;ADD_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',i,TNAME,TNAME);END LOOP;DELETE_LIST_ELEMENT('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);CLOSE C1;END;然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行: DYN_LIST;----这样一进入该FMX,就会动态刷新该列表。除此之外,SPECIFICATION数据项改为列 表项。
----④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面:----如上图所示,PRN代码及设备代码在画布1(CONTENT型)上,其它数据项在画布2(ST ACK型)上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或 敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录 时用。主要制作顺序为:先建立两个画布,画布1(CONTENT型),画布2(STACK型),然后
建立块,选画布时用画布1,这样所有项都显示在画布1上,然后选中除PRN代码及设备代 码之外的所有数据项,选TOOLS菜单下的PROPERTIES选项,将这些数据项的CANVAS属性选
为画布2(STACK型),然后调整整体位置就可以了。----⑤ 如何在FORM的受限触发子中提交保存数据
----在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDA
TE,DELETE等操作并想立即存盘时,就需要COMMIT WORK语句了。首先在服务器端建立D B_SQL_COMMIT这个过程(采用ORACLE7.3数据库),PROCEDURE DB_SQL_COMMIT IS source_cursor integer;ignore integer;V7 NUMBER :=2;BEGIN
source_cursor:=dbms_sql.open_cursor;dbms_sql.parse(source_cursor,'COMMIT WORK',V7);ignore:=dbms_sql.execute(source_cursor);DBMS_SQL.CLOSE_CURSOR(source_cursor);END;----然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了,当然你可以根据自己
需要将该过程加入参数,这样通过参数可以得到执行DML语句的权限。----⑥ 如何在FORM中实现某数据项自动按记录序号加一操作
----设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE-REC
ORD,加入如下代码:
:VO_ID:=:System.Trigger_Record;----这样每当生成新记录时VO_ID就会自动加一了。
----⑦ 如何在一个FORM中调用另一个FORM,或在一个块中调用另一个块时显示特定的 记录有时用户会要求在调用另一个FORM时,只显示相关的记录,举例如下,在一个FORM 的块中有一个按钮,在按钮触发子中加入如下代码: DECLARE PM PARAMLIST;BEGIN
PM:=GET_PARAMETER_LIST('PM');IF NOT ID_NULL(PM)THEN
DESTROY_PARAMETER_LIST('PM');END IF;PM:=CREATE_PARAMETER_LIST('PM');......................ADD_PARAMETER(PM,'THE_WHERE', TEXT_PARAMETER,'EM_NAME=''EM4'' AND EM_PROJECT_NAME=''支架预制''');OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);END;
----其中EM_NAME,EM_PROJECT_NAME为本FORM某块的数据项,PAYMENT为要调用的FORM 模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中,建立一 参数THE_WHERE,CHAR型,长1000,然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-F ORM-INSTANCE,在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN SET_BLOCK_PROPERTY('PAYMENT', DEFAULT_WHERE,:PARAMETER.THE_WHERE);END IF;----其中PAYMENT为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据 了。
----⑧ 在FORM中当有主从块时,连续输入记录如何避免被不断的提示保存:
----每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录,FORM就会提示你是否要保存记录,而你并不希望FORM提示,让它自动保存,此时你可 以到Program Units中找到过程PROCEDURE Clear_All_Master_Details,然后在这个过程 中找到语句
Clear_Block(ASK_COMMIT);----将其改为Clear_Block(DO_COMMIT);就可以了。----⑨ 在Report开始时选择排序项:
----在报表开始的Parameter Form中选择报表按哪个数据项排序,----1.先在USER PARAMETER 中创建SORT参数,为字符型,长20。
----2.初始值选’责任方’,然后将这四个值输入到DATA SELECTION中,形成列表。----3.然后处理QUERY中的SQL语句: select CHARGER,FCO_NO,EM_NAME,FCO _NO,DESCRIPTION, FCR_POINT from FCR_MAIN ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号', FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)----⑩ 在Developer 2000中如何读写操作系统文件
----在用Developer 2000的开发工具开发应用程序时,经常碰到需要读写外部文件的问
题,可以用ORACLE 带的包TEXT_IO来完成这项需求。例如: DECLARE
IN_FILE TEXT_IO.FILE_TYPE;OUT_FILE TEXT_IO.FILE_TYPE;LINE_BUFER VARCHAR2(80);/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/
BEGIN
IN_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST1.TXT’,’r’);OUT_FILE:=TEXT_IO.FOPEN(‘C:TEMPTEST2.TXT’,’w+’);
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);TEXT_IO.PUT(LINE_BUFER);TEXT_IO.NEW_LINE;TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);END LOOP;EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);TEXT_IO.FCLOSE(IN_FILE);TEXT_IO.FCLOSE(OUT_FILE);END;----三.数据库管理
----① 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TAB
LE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DR OP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。----② 数据库文件的移动方法
----当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强):
----1.使用SERVER MANAGER关闭实例.SVRMGR > connect internal;SVRMGR > shutdown;SVRMGR >exit;----2.使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6).在UNIX中用 mv命令可以把文件移动到新的位置,#mv /ora13/orarun/document.dbf /ora12/orarun----3.装载数据库并用alter database命令来改变数据库中的文件名.SVRMGR > connect internal;SVRMGR > startup mount RUN73;SVRMGR > alter database rename file
> ‘/ ora13/orarun/document.dbf’
> ‘/ ora12/orarun/document.dbf’;----4.启动实例.SVRMGR > alter database open;----ORACLE数据库开发经验总结