java.util.Properties props = new java.util.Properties();props.setProperty("password","mypassword");props.setProperty("user","myusername");props.put("v$session.osuser", System.getProperty("user.name").toString());props.put("v$session.machine", InetAddress.getLocalHost().getCanonicalHostName());props.put("v$session.program", "My Program Name");DriverManager.registerDriver (new oracle.jdbc.OracleDriver());Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@myhostname:1521:mysid", props);
SQL>select username,osuser,program,machinefrom v$sessionwhere username = ‘ROB‘; USERNAME OSUSER PROGRAM MACHINE--------- ----------- ------------------ -----------ROB rmerkw My Program Name machine
At application level you can use the following methods to set client_info, module and action in v$session:
dbms_application_info.set_client_infodbms_application_info.set_moduledbms_application_info.set_action
Oracle 记录下jdbc thin client module名称
标签:bms nic manager java tostring machine eth 记录 methods
小编还为您整理了以下内容,可能对您也有帮助:
jdbc:oracle:thin:@<server>[:<1521>]:<database_name>怎么填写?主要问服务器名称和端口怎么查?
@<server> 中server 填 oracle 服务器的IP。
1521 默认端口一般不用改 database_name 是指oracle的实例名。
oracle 安装目录下 类似如下路径:oracle\proct\10.2.0\db_1\NETWORK\ADMIN 下有个文件 tnsnames.ora 打开 可以看到 “orcl = ”此ORCL即表示实例名(你的电脑可能不是这个)
JDBC连接Linux下的Oracle
如何配置使JAVA可以通过Oracle JDBC Drivers连接到数据库:1.安装JAVA JDK.
2. 修改PATH环境变量,使其指向JDK的bin目录
3. 设置CLASSPATH环境变量,使其指向正确的JDK的lib及oracle的JDBC接口。
4. 运行"java –version" ,验证java的版本。
下面是用JAVA 通过JDBC连接 Oracle的步骤
希望对你有帮助
(1)装载并注册数据库的JDBC驱动程序
载入JDBC驱动:
Class.forName("oracle.jdbc.driver.OracleDriver");
注册JDBC驱动:
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
(2)建立与数据库的连接
要建立与数据库的连接,首先要创建指定数据库的URL。连接数据库的URL对象,利用DriverManager 的getConnection方法建立的。数据库URL对象与网络资源的统一资源定位类似,其构成格式如下:
jdbc:subProtocol:subName://hostname:port;DatabaseName=ⅹⅹⅹ
其中:
jdbc表示当前通过Java的数据库连接进行数据库访问;
subProtocol表示通过某种驱动程序支持的数据库连接机制;
subName表示在当前连接机制下的具体名称;
hostname表示主机名;
port表示相应的连接端口;
DatabaseName表示要连接的数据库的名称。
这里以与Oracle数据库的连接为例:
连接Oracle 8/8i/9i数据库(用thin模式)
url = jdbc:oracle:thin:@hostip:1521:oracleSID;
注意:hostip指主机的ip地址,oracleSID指数据库的SID。
再者确定连接数据库的用户名与密码,即user和password 的值:
user = “ⅹⅹⅹ “;
password = “ⅹⅹⅹ“;
最后使用如下语句:
Connection con=java.sql.DriverManager.getConnection(url,user,password);
(3)创建Statement对象
例如:
Statement stmt = con.createStatement();
(4)调用并执行SQL语句
例如:
String sql = “select a,b,c from table1";//table1为你所要查询的表名,a,b,c为所要查询的字段
ResultSet rs = stmt.executeQuery(sql);
(5)访问ResultSet中的记录集并从中取出记录
例如:
rs.next( );
rs.absolute(4);
String col1=rs.getString(1);
……..
(6)依次关闭ResultSet、Statement和Connection对象
例如:
rs.close();
stmt.close();
con.close();
0x004020c0指令引用的0x0000000内存不能为read
0X000000该内存不能为read的解决方法
出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。
一:先说说硬件:
一般来说,电脑硬件是很不容易坏的。内存出现问题的可能性并不大(除非你的内存真的是杂牌的一塌徒地),主要方面是:1。内存条坏了(二手内存情况居多)、2。使用了有质量问题的内存,3。内存插在主板上的金手指部分灰尘太多。4。使用不同品牌不同容量的内存,从而出现不兼容的情况。5。超频带来的散热问题。你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。
二、如果都没有,那就从软件方面排除故障了。
先说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在缓冲区,需要操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“光标”。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值“0”已不表示新启用的光标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的“健壮性”。若应用程序没有检查这个错误,它就会按照“思维惯性”认为这个值是给它分配的可用光标,继续在之后的执行中使用这块内存。真正的0地址内存区储存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的内存不能为“read”错误,并指出被引用的内存地址为“0x00000000“。内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中“安装”的病毒程序),更改了大量的系统参数和系统档案之后。
在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的光标已经失效了。有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图“违法”的程序唯一的下场就是被操作终止执行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效光标不一定总是0,因此错误提示中的内存地址也不一定为“0x00000000”,而是其它随机数字。
首先建议:
1、 检查系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。
2、 更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统档案、修正系统参数。有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。
3、 尽量使用最新正式版本的应用程序、Beta版、试用版都会有BUG。
4、 删除然后重新创建 Winnt\System32\Wbem\Repository 文件夹中的文件:在桌面上右击我的电脑,然后单击管理。 在"服务和应用程序"下,单击服务,然后关闭并停止 Windows Management Instrumentation 服务。 删除 Winnt\System32\Wbem\Repository 文件夹中的所有文件。(在删除前请创建这些文件的备份副本。) 打开"服务和应用程序",单击服务,然后打开并启动 Windows Management Instrumentation 服务。当服务重新启动时,将基于以下注册表项中所提供的信息重新创建这些文件: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WBEM\CIMOM\Autorecover MOFs
下面搜集几个例子给大家分析:
例一:IE浏览器出现“0x0a8ba9ef”指令引用的“0x03713644” 内存,或者“0x70dcf39f”指令引用的“0x00000000”内存。该内存不能为“read”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。解决方法:
1、 开始-运行窗口,输入“regsvr32 actxprxy.dll”回车,接着会出现一个信息对话 框“DllRegisterServer in actxprxy.dll succeeded”,确定。再依次运行以下命令。(这个方法有人说没必要,但重新注册一下那些.dll对系统也没有坏处,反正多方下手,能解决问题就行。)
regsvr32 shdocvw.dll
regsvr32 oleaut32.dll
regsvr32 actxprxy.dll
regsvr32 mshtml.dll
regsvr32 msjava.dll
regsvr32 browseui.dll
regsvr32 urlmon.dll
2、 修复或升级IE浏览器,同时打上系统补丁。看过其中一个修复方法是,把系统还原到系统初始的状态下。建议将IE升级到了6.0。
例二:有些应用程序错误: “0x7cd64998” 指令参考的 “0x14c96730” 内存。该内存不能为 “read”。解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到Windows\Prefetch文件夹。一旦建立了映像,应用软件的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用软件启动的信息。建议将虚拟内存撤换,删除Windows\Prefetch目录下所有*.PF文件,让windows重新收集程序的物理地址。
例三:在XP下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内存。该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。
例四:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。
例五:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“0x060692f6”(每次变化)指令引用的“0xff000011”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。
例六:双击一个游戏的快捷方式,“0x77f5cd0”指令引用“0xffffffff”内 存,该内存不能为“read” ,并且提示Client.dat程序错误。解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。
例七:一个朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”指令引用的“0x00303033”内存,该内存不能为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。 解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。
该内存不能为read或written的解决方案关键词: 该内存不能为"read" 该内存不能为"written"
从网上搜索来的几篇相关文章.
【文章一】
使用Windows操作系统的人有时会遇到这样的错误信息:
「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用程序被关闭。
如果去请教一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是Windows不稳定造成的。本文就来简单分析这种错误的一般原因。
一、应用程序没有检查内存分配失败
程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是「动态内存分配」,内存地址也就是编程中的「光标」。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值「0」已不表示新启用的游标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的「健壮性」。若应用程序没有检查这个错误,它就会按照「思维惯性」认为这个值是给它分配的可用游标,继续在之后的执行中使用这块内存。真正的0地址内存区储存的是计算机系统中最重要的「中断描述符表」,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的「写内存」错误,并指出被引用的内存地址为「0x00000000」。内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中「安装」的病毒程序),更改了大量的系统参数和系统档案之后。
二、应用程序由于自身BUG引用了不正常的内存光标
在使用动态分配的应用程序中,有时会有这样的情况出现:程序试突读写一块「应该可用」的内存,但不知为什么,这个预料中可用的光标已经失效了。有可能是「忘记了」向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而「没有留意」等等。注销了的内存被系统回收,其访问权已经不属于该应用程序,因此读写操作也同样会触发系统的保护机制,企图「违法」的程序唯一的下场就是被操作终止执行,回收全部资源。计算机世界的法律还是要比人类有效和严厉得多啊!像这样的情况都属于程序自身的BUG,你往往可在特定的操作顺序下重现错误。无效光标不一定总是0,因此错误提示中的内存地址也不一定为「0x00000000」,而是其它随机数字。如果系统经常有所提到的错误提示,下面的建议可能会有说明 :
1.检视系统中是否有木马或病毒。这类程序为了控制系统往往不负责任地修改系统,
从而导致操作系统异常。平常应加强信息安全意识,对来源不明的可执行程序绝不好奇。
2.更新操作系统,让操作系统的安装程序重新拷贝正确版本的系统档案、修正系统参数。
有时候操作系统本身也会有BUG,要注意安装官方发行的升级程序。
3.试用新版本的应用程序。
Mode:
将虚拟内存撤换
答案:
目前为止是肯定的,也就是如在下次冷天到来时亦没再发生,就代表这是主因
追加:
如果你用 Ghost 恢复 OS 后建议 删除WINDOWS\PREFETCH目录下所有*.PF文件因为需让windows重新收集程序的物理地址
有些应用程序错误 "0x7cd64998" 指令参考的 "0x14c96730" 内存。该内存不能为 "read"推论是此原因
源由:
Win XP的「预读取」技术
这种最佳化技术也被用到了应用软件上,系统对每一个应用软件的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟「内存映像」,并把这些信息储存到WINDOWSPREFETCH数据夹。一旦建立了映像,应用软件的装入速度大大提高。XP的预读取数据储存了最近8次系统启动或应用软件启动的信息。
后叙:
目前此方法亦是独步网络的(其码自己针对此问题查了许久),也是常见问题,原本几乎每天睡前关闭软件时一些程序都会发生...read...
现在就没发生了。
【文章二】
运行某些程序的时候,有时会出现内存错误的提示(0x后面内容有可能不一样),然后该程序就关闭。
“0x????????”指令引用的“0x????????”内存。该内存不能为“read”。
“0x????????”指令引用的“0x????????”内存,该内存不能为“written”。
不知你出现过类似这样的故障吗?
一般出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件,这就有多方面的问题了。
下面先说说硬件:
一般来说,内存出现问题的可能性并不大,主要方面是:内存条坏了、内存质量有问题,还有就是2个不同牌子不同容量的内存混插,也比较容易出现不兼容的情况,同时还要注意散热问题,特别是超频后。你可以使用MemTest 这个软件来检测一下内存,它可以彻底的检测出内存的稳定度。
假如你是双内存,而且是不同品牌的内存条混插或者买了二手内存时,出现这个问题,这时,你就要检查是不是内存出问题了或者和其它硬件不兼容。
如果都没有,那就从软件方面排除故障了。
先简单说说原理:内存有个存放数据的地方叫缓冲区,当程序把数据放在其一位置时,因为没有足够空间,就会发生溢出现象。举个例子:一个桶子只能将一斤的水,当你放入两斤的水进入时,就会溢出来。而系统则是在屏幕上表现出来。这个问题,经常出现在windows2000和XP系统上,Windows 2000/XP对硬件的要求是很苛刻的,一旦遇到资源死锁、溢出或者类似Windows 98里的非法操作,系统为保持稳定,就会出现上述情况。另外也可能是硬件设备之间的兼容性不好造成的。
下面我从几个例子给大家分析:
例一:打开IE浏览器或者没过几分钟就会出现"0x70dcf39f"指令引用的"0x00000000"内存。该内存不能为“read”。要终止程序,请单击“确定”的信息框,单击“确定”后,又出现“发生内部错误,您正在使用的其中一个窗口即将关闭”的信息框,关闭该提示信息后,IE浏览器也被关闭。 解决方法:修复或升级IE浏览器,同时打上补丁。看过其中一个修复方法是,Win2000自升级,也就是Win2000升级到Win2000,其实这种方法也就是把系统还原到系统初始的状态下。比如你的IE升级到了6.0,自升级后,会被IE5.0代替。
例二:在windows xp下双击光盘里面的“AutoRun.exe”文件,显示“0x77f745cc”指令引用的“0x00000078”内存。该内存不能为“written”,要终止程序,请单击“确定”,而在Windows 98里运行却正常。 解决方法:这可能是系统的兼容性问题,winXP的系统,右键“AutoRun.exe”文件,属性,兼容性,把“用兼容模式运行这个程序”项选择上,并选择“Windows 98/Me”。win2000如果打了SP的补丁后,只要开始,运行,输入:regsvr32 c:\winnt\apppatch\slayerui.dll。右键,属性,也会出现兼容性的选项。
例三:RealOne Gold关闭时出现错误,以前一直使用正常,最近却在每次关闭时出现“0xffffffff”指令引用的“0xffffffff”内存。该内存不能为“read” 的提示。 解决方法:当使用的输入法为微软拼音输入法2003,并且隐藏语言栏时(不隐藏时没问题)关闭RealOne就会出现这个问题,因此在关闭RealOne之前可以显示语言栏或者将任意其他输入法作为当前输入法来解决这个问题。
例四:我的豪杰超级解霸自从上网后就不能播放了,每次都提示“0x060692f6”(每次变化)指令引用的“0xff000011”内存不能为“read”,终止程序请按确定。 解决方法:试试重装豪杰超级解霸,如果重装后还会,到官方网站下载相应版本的补丁试试。还不行,只好换就用别的播放器试试了。
例五:双击一个游戏的快捷方式,“0x77f5cd0”指令引用“0xffffffff”内 存,该内存不能为“read” ,并且提示Client.dat程序错误。 解决方法:重装显卡的最新驱动程序,然后下载并且安装DirectX9.0。
例六:一个朋友发信息过来,我的电脑便出现了错误信息:“0x772b548f”指令引用的“0x00303033”内存,该内存不能为“written”,然后QQ自动下线,而再打开QQ,发现了他发过来的十几条的信息。 解决方法:这是对方利用QQ的BUG,发送特殊的代码,做QQ出错,只要打上补丁或升级到最新版本,就没事了。
【原因 解决方法】
1 内存条坏了 更换内存条
2 双内存不兼容 使用同品牌的内存或只要一条内存
3 内存质量问题 更换内存条
4 散热问题 加强机箱内部的散热
5 内存和主板没插好或其他硬件不兼容 重插内存或换个插槽
6 硬件有问题 更换硬盘
7 驱动问题 重装驱动,如果是新系统,应先安装主板驱动
8 软件损坏 重装软件
9 软件有BUG 打补丁或更新到最新版本
10 软件和系统不兼容 给软件打上补丁或是试试系统的兼容模式
11 软件和软件之间有冲突 如果最近安装了什么新软件,卸载了试试
12 软件要使用其他相关的软件有问题 重装相关软件,比如播放某一格式的文件时出错,可能是这个文件的解码器有问题
13 病毒问题 杀毒
14 杀毒软件与系统或软件相冲突 由于杀毒软件是进入底层监控系统的,可能与一些软件相冲突,卸载试试
15 系统本身有问题 有时候操作系统本身也会有BUG,要注意安装官方发行的更新程序,象SP的补丁,最好打上.如果还不行,重装系统,或更换其他版本的系统。
〔又一说〕
在控制面板的添加/删除程序中看看你是否安装了微软NET.Framework,如果已经安装了,可以考虑卸载它,当然如果你以后在其它程序需要NET.Framework时候,可以再重新安装。
另外,如果你用的是ATI显卡并且你用的是SP2的补丁(一些ATI的显卡驱动需要在NET.Framework正常工作的环境下)。这种情况你可以找一款不需要NET.Framework支持的ATI显卡驱动。
如果以上两种方法并不能完全解决问题,你试着用一下“IE修复”软件,并可以查查是否有病毒之类的。
〔微软NET.Framework升级到1.1版应该没问题了〕
〔还有一说〕
方法一:
微软新闻组的朋友指点:开始--运行:regsvr32 jscript.dll
开始--运行:regsvr32 vbscript.dll
不过没解决---但提供了路子-----一次运行注册所有dll
搜索查找到方法如下:
运行 输入cmd 回车在命令提示符下输入
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
这个命令老兄你慢慢输 输入正确的话会看到飞快地滚屏 否则……否则失败就是没这效果。回车后慢慢等(需要点时间1-2分钟) 都运行完再打开看
方法二:
这是个典型问题~~~~~引起这个问题的原因很多。一般来讲就是给系统打上补丁和更换内存、给内存换个插槽这3种方法来解决。[系统补丁只要到Microsoft Update网站在线更新就可以了]
造成这种问题的原因很多,不能单纯的下结论,尽量做到以下几点可能对你有帮助:
1。确保使用的是未修改过的软件(非汉化、破解版)
2。使用改软件时尽量不要运行其他软件。(这是个临时文件,可能某些软件也在使用临时文件夹,所以产生干扰)
3。把那些什么桌面工具,内存整理工具通通关掉(你至少有2个类似的工具在运行)”
处理方法:
运行regedit进入注册表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks下,应该只有一个正常的键值"{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 将其他的删除。
〔我个人的最后解决和看法〕
我今天尝试了多种办法,最后我发现问题出在微软的NET.Framework上面。我升级了这个软件,并打齐了补丁,短暂平安后,有出现“内存不能为read”的情况。后来我受上面文章的启发,卸载了微软的NET.Framework1.0和1.1,世界太平了。
另外:如果是打开“我的电脑”、“我的文档”等的时候出现上述情况,还有一种可能,就是你的右键菜单太臃肿了,此时只要清理右键菜单问题就解决了。
--------------------------------------------------------------------------------
〔试验的结果〕
上面的方法,最管用、最彻底的方法是这个:
运行 输入cmd 回车在命令提示符下输入
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
【技巧】如果怕输入错误的话,可以复制这条指令,然后在命令提示框点击左上角的c:\,使用下面的“编辑-粘贴”功能就不容易输错了。在飞速滚屏完全静止之后,别着急启动其他程序,先耐心等一会儿,因为此时dll们还在找位置。直到你的指示灯不闪了再做别的。
jdbc连接oracle数据库问题
存在不少问题..
String strCon = "jdbc:oracle:this:@localhost:1521: JspSamples"; //连接字
/*url写错了,这样:jdbc:oracle:thin:@localhost:1521: JspSamples(如1楼所说是thin不是this)*/
Connection conn = DriverManager.getConnection(strCon,"system","system"); //连接数据库
Statement stmt = conn.createStatement(); //初始化查询
String sql = "create database JspSamples"; //创建数据库
/*---> 上面这句不存在java语法问题,但是该sql对Oracle来说是执行不了的,自己再去了解一下Oracle吧*/
int ret = stmt.executeUpdate(sql); //执行创建数据库
String sql = "use JspSamples"; //选择数据库
/*---> 重复定义变量sql,把String去掉,且与上面那句存在相同问题(oracle不认识 use..,这不是oracle的语法)*/
int ret = stmt.executeUpdate(sql); //执行选择数据库
String sql = " CREATE TABLE customers(" + //创建表
/*---> 同上,把String去掉*/
" Id int(6) unsigned NOT NULL auto_increment," +
" Name varchar(20) default NULL," +
" addTime timestamp NULL default NULL," +
" Tel varchar(15) default NULL," +
" Email varchar(20) default NULL," +
" PRIMARY KEY (Id)" +
" )";
int ret = stmt.executeUpdate(sql); //执行创建表
jdbc连接oracle数据库问题
存在不少问题..
String strCon = "jdbc:oracle:this:@localhost:1521: JspSamples"; //连接字
/*url写错了,这样:jdbc:oracle:thin:@localhost:1521: JspSamples(如1楼所说是thin不是this)*/
Connection conn = DriverManager.getConnection(strCon,"system","system"); //连接数据库
Statement stmt = conn.createStatement(); //初始化查询
String sql = "create database JspSamples"; //创建数据库
/*---> 上面这句不存在java语法问题,但是该sql对Oracle来说是执行不了的,自己再去了解一下Oracle吧*/
int ret = stmt.executeUpdate(sql); //执行创建数据库
String sql = "use JspSamples"; //选择数据库
/*---> 重复定义变量sql,把String去掉,且与上面那句存在相同问题(oracle不认识 use..,这不是oracle的语法)*/
int ret = stmt.executeUpdate(sql); //执行选择数据库
String sql = " CREATE TABLE customers(" + //创建表
/*---> 同上,把String去掉*/
" Id int(6) unsigned NOT NULL auto_increment," +
" Name varchar(20) default NULL," +
" addTime timestamp NULL default NULL," +
" Tel varchar(15) default NULL," +
" Email varchar(20) default NULL," +
" PRIMARY KEY (Id)" +
" )";
int ret = stmt.executeUpdate(sql); //执行创建表
Oracle:报错jdbc:oracle:thin:@IP地址:端口:实例名, errorCode 28001, state 99999
cmd命令行输入:
修改Oracle密码期限为无限:
Oracle:报错jdbc:oracle:thin:@IP地址:端口:实例名, errorCode 28001, state 99999
cmd命令行输入:
修改Oracle密码期限为无限:
求一C语言程序设计作业,工资管理系统
/**由于时间关系,模糊查询只写了姓名查找***/
/***模糊查询可能建链表有问题,还有填写工资单也可能有一点问题**/
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 8
#define T 60 /****addlist有问题******************************************************************************************/
#define LEFT 0x4b00 /*左*/
#define RIGHT 0x4d00 /*右*/
#define DOWN 0x5000 /*下*/
#define UP 0x4800 /*上*/
#define SPACE 0x3920 /*空格*/
#define ESC 0x011b /* ESC键*/
#define ENTER 0x1c0d /*回车键*/
#define Backspace 0xe08 /*擦除键*/
#define ALT_B 12288 /*组合键ALT_B */
#define ALT_M 12800/*组合键ALT_M */
#define ALT_H 8960/*组合键ALT_H */
#define N 10
#define M 20
int clst,tvst; /*清洁费&&闭路电视费*/
int or=1;/*-1做了更改,1未做更改*/
char zhws[N][M],zhchs[N][M],departs[N][M]; /*存储职务名&&技术职称名&&部门名*/
char months[][5]={"0","Jan","Feb","Mar","Apr","May","Jun","July","Arg","Sep","Oct","Nov","Dec"};/*月份名,1月对应1*/
char sexs[][7]={"male","female"};
int zhwsp[N],zhchsp[N]; /*职务工资&&职称(基本)工资*/
FILE *fp;
typedef struct _paylist
{
int cardnum; /*工资卡号*/
char name[M];
int month; /*月份,进行选择*/
int jbsalary; /*基本工资*/
int zhwsalary; /*职务工资*/
int addition; /*补助*/
int ysalary; /*应发工资*/
int praise; /*特别奖励*/
int tax; /*税金*/
int water; /*水费*/
int elec; /*电费*/
int clean; /*清洁费*/
int tv; /*电视费*/
int salary; /*实发工资*/
struct _paylist *left,*right;
} PAYLIST;
typedef struct _worker
{
char name[M];
int sex; /*0男1女*/
char idnum[M]; /*身份证号*/
int cardnum; /*工资卡号*/
int age;
int wkage; /*工龄*/
int depart; /*选择,部门*/
int zhw; /*选择,职务*/
int zhch; /*选择,职称*/
long zhchnum; /*职称编号*/
long homeph; /*家庭电话*/
char mobile[M]; /*手机*/
int paymons; /*已经记录n个月的工资单*/
struct _worker *front,*down;
PAYLIST *right;
} WORKER;
typedef struct _depart
{
int name; /*选择,部门名*/
char path[M]; /*存储路径名*/
int wknum; /*该部门职工人数*/
struct _depart *left,*right;
WORKER *down;
} DEPART;
typedef struct _tjw
{
WORKER *wp;
struct _tjw *next;
}TJW;
DEPART *headd,*dep;
WORKER *zhp,*wwp;/*起指向作用,不要随便更改; 起流动作用*********/
TJW *head1; /**头指针**/
void load(void); /*从文件中导入部门,职工及工资单信息*/
void start(void); /*读取基本数据*/
void readdep(DEPART **pp,FILE *fp); /*从文件中读取部门信息*/
void writedep(DEPART *p,FILE *fp); /*逐个将部门信息写入文件*/
void shchx(WORKER *wp); /*详细输出*/
void readw(WORKER **wp,FILE *fp); /*从文件中读取职工信息*/
PAYLIST * whtailp(WORKER *wp); /*查找职工------链尾,返回链尾*/
void xianshw(void); /************显示第n个部门的职工信息********/
PAYLIST * insertp(WORKER *wp,PAYLIST *p,PAYLIST *tail); /*插入新职工,返回链尾*/
void addnew(DEPART *dep); /*增加新职工*/
PAYLIST * whtailp(WORKER *wp); /*查找职工------链尾,返回链尾*/
void changeshuju(void); /*更改基本工资等固定信息*/
PAYLIST * rulup(WORKER *wp); /*录入工资单信息*/
void addlist(WORKER *zhp); /*增加新职工*/
void Dzhg(void); /*****确定某一个具体职工****/
void xiansh2(DEPART *dep);
void insertdep(void); /****添加新的部门***/
void addzh(void); /***添加职务和职称***/
void savedep(void); /*保存部门信息*/
void savew(void); /*保存职工信息和工资信息***/
void day1(void); /***直接打印职工信息**/
void day2(void); /****将统计结果打印出来**/
void delall(DEPART *dep); /**删除整个部门**/
void delone(DEPART *dep,WORKER *p); /*删除一个职工及其工资信息*/
void changew(WORKER *p); /*修改职工基本信息*/
WORKER * search1(); /*通过身分证号查询*/
void search3(void); /*通过姓名查询*/
void mhsearch(); /*模糊查询*/
WORKER * search0(); /*通过职称编号查询*/
void jqsearch(void); /*精确查询*/
void Ashuijin(); /*统计税金总额及排出前十名**/
void changep(WORKER *p); /*修改工资单信息*/
WORKER * search2(); /*通过工资卡号查找*/
int key;/*按键变量*/
int textx,texty;/*光标坐标,x行,y列*/
struct menustruct/*菜单用的结构体*/
{
char name[10];/*主菜单名*/
char str[10][20];/*选项*/
int n;/*选项数*/
}ml[R];/*使用了R个,可根据需要增删*/
char save[4096],savee[4096];/*保存文本区域空间*/
/*char sav1[4096];*/
char c[4096];/*清屏专用空间*/
int i,j;/*常用变量*/
void Menu();/*初始化界面*/
void Selectitem();/*定义菜单*/
void DrawSelectitem();/*显示主菜单*/
void BlackText(int x,int y,char *z);/*选中菜单*/
void RedText(int x,int y,char *z);/*正常菜单*/
void Run();/*具体操作过程*/
void DrawMl(int n);/*显示下拉菜单*/
void MoveMl(int n,int x);/*菜单选项的控制*/
void Enter(int m,int n);/*菜单选项的具体功能*/
void ClrScr();/*自定义清屏函数*/
void DingWei(void);
void DrawFrame(int left,int up,int right,int down,int textcolor,int backgroundcolor);/*画边框*/
/***主函数****/
void loadmenu(void)
{
Menu();/*初始化界面*/
Run();/*具体操作过程*/
}
/*初始化界面*/
void Menu()
{ int a;
system("cls"); /*调用系统的清屏命令*/
textbackground(GREEN);/*将背景设置为蓝色*/
window(1,1,25,80);
clrscr();
textx=3;/*光标初始化位置*/
texty=2;
gotoxy(1,2);
printf("%c",218);/*画左上角*/
for(i=0;i<78;i++)
printf("%c",196); /*画水平直线*/
printf("%c",191);/*画右上角*/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
printf("%c",179); /*画垂直线*/
gotoxy(80,i);
printf("%c",179);
}
printf("%c",192); /*画左下角*/
for(i=0;i<78;i++)
printf("%c",196);
printf("%c",217); /*画右下角*/
gotoxy(1,1);
textcolor(7); /*设置灰色*/
for(i=0;i<80;i++)
cprintf("%c",219);/*用符号实现画主菜单的灰色背景区*/
for(a=3;a<=23;a++)
{gotoxy(T,a);cprintf("%c",179);} /********************************************************************/
DingWei();
Selectitem(); /*调用选项函数*/
DrawSelectitem(); /*画选项*/
gettext(2,3,78,23,c); /*保存当前文本区域*/
}
/*定义菜单*/
void Selectitem()
{
strcpy(ml[0].name,"FILE");/*下面的具体选项补空格是为了各菜单黑色背景相同*/ /**************************************************************************/
strcpy(ml[0].str[0],"Load ");/*导入某一部门职工信息*/
strcpy(ml[0].str[1],"Shemi ");/*设置密码*/
strcpy(ml[0].str[2],"Gaimi ");/*修改密码*/
strcpy(ml[0].str[3],"Print ");/*打印*/
strcpy(ml[0].str[4],"Save ");/*保存*/
strcpy(ml[0].str[5],"Exit ");/*退出系统*/
ml[0].n=6; /*保存菜单的项数*/
strcpy(ml[1].name,"INSERT");
strcpy(ml[1].str[0],"Newers ");/*插入新职工*/
strcpy(ml[1].str[1],"Paylist ");/*填写工资单*/
strcpy(ml[1].str[2],"Depart ");/*新增部门*/
strcpy(ml[1].str[3],"Zhchs "); /*新增职称*/
strcpy(ml[1].str[4],"Zhws "); /*新增职务*/
ml[1].n=5;
strcpy(ml[2].name,"EDIT");/*编辑修改*/
strcpy(ml[2].str[0],"Imfor "); /*职工信息*/
strcpy(ml[2].str[1],"Paylist "); /*工资单*/
strcpy(ml[2].str[2],"Tongshu ");/*修改基本工资等固定数据*/
ml[2].n=3;
strcpy(ml[3].name,"SEARCH"); /*查询*/
strcpy(ml[3].str[0],"Jingque "); /*精确查询*/
strcpy(ml[3].str[1],"Mohu "); /*模糊查询*/
ml[3].n=2;
strcpy(ml[4].name,"TONGJI"); /*统计*/
strcpy(ml[4].str[0],"Paixu "); /*排序*/
strcpy(ml[4].str[1],"Agongzi "); /*各类工资总额*/
strcpy(ml[4].str[2],"Ashuijin "); /*税金总额(月/年) */
strcpy(ml[4].str[3],"Gzhjigz "); /*各工种总数及平均工资*/
ml[4].n=4;
strcpy(ml[5].name,"DEL");
strcpy(ml[5].str[0],"One ");
strcpy(ml[5].str[1],"All ");
ml[5].n=2;
strcpy(ml[6].name,"HELP");
strcpy(ml[6].str[0],"About ");
ml[6].n=1;
}
/*显示主单名*/
void DrawSelectitem()
{
for(i=0;i<R;i++)
RedText(i,1,ml[i].name); /*显示主菜单名,且首字母为红色*/
}
/*正常显示菜单*/
void RedText(int x,int y,char *z)
{
textbackground(7); /*设置背景颜色为浅灰色*/
gotoxy(3+x*10,y);
for(j=0;z[j];j++)
{
if(j==0)
textcolor(RED);/*第一个字母显示红色*/
else
textcolor(BLACK); /*设置黑色*/
cprintf("%c",z[j]); /*输出菜单名*/
}
}
/*显示选中菜单*/
void BlackText(int x,int y,char *z)
{
textbackground(0); /*设置背景颜色为黑色*/
textcolor(15); /*设置文本颜色为白色*/
gotoxy(3+10*x,y);/*定位坐标*/
cputs(z); /*输出菜单名字符串*/
}
/*按键操作过程*/
void Run()
{ gettext(1,1,80,25,savee);
while(1)
{
gotoxy(texty,textx);
key=bioskey(0);/*接收按键*/
switch(key)
{
case ALT_B:
case ESC: DrawMl(0);break; /*显示下拉菜单1*/
case ALT_M: DrawMl(1);break;/*显示下拉菜单2*/
case ALT_H: DrawMl(2);/*显示下拉菜单3*/
case UP: /*上光标键的操作控制*/
{
if(textx==3)
textx=23;
textx--;
gotoxy(texty,textx);
}break;
case DOWN: /*下光标键的操作控制*/
{
if(textx==23)
textx=3;
textx++;
gotoxy(texty,textx);
}break;
case LEFT: /*左光标键的操作控制*/
{
if(texty==2)
texty=T-1;
texty--;
gotoxy(texty,textx);
}break;
case Backspace: /*擦除键的设置*/
{
if(texty==2&&textx==3)
continue;
else
{
if(texty!=2)
texty--; /*擦除键的细节问题,先擦去东西,然后光标还要往后退一格*/
else
if(texty==2)
{
texty=78;
textx--;
}
gotoxy(texty,textx);
printf(" ");
gotoxy(texty,textx);
}
}break;/*end case 0xe08*/
case RIGHT: /*右光标键的操作控制*/
{
if(texty==T-1)
texty=2;
texty++;
gotoxy(texty,textx);
}break;
case SPACE: /*空格键的操作*/
{
if(texty==79)
continue;
else
{
gotoxy(texty,textx); /*空格的细节操作*/
printf(" ");
texty++;
gotoxy(texty,textx);
}
}break;
case ENTER: /*回车的控制操作*/
{
if(textx==23)
continue;
textx++;
texty=2;
gotoxy(texty,textx);
}break;
default : /*非控制键的结果*/
{
if(texty==79&&textx==23)/*到达最后就不再输出*/
continue;
else
if(texty==79&&textx!=23) /*到行的最后*/
{
textx++;
texty=2;
}
gotoxy(texty,textx);/*输出结果*/
printf("%c",key);
if(texty==79) /*如果texty==79就不执行*/
continue;
else /*如果没到行尾就继续执行,使光标向前移动一位*/
texty++;
}
}
}/*大循环的大括号*/
}
/*画边框函数*/
void DrawFrame(int l,int u,int r,int d,int tcolor,int bcolor)
{
textbackground(bcolor); /*背景颜色*/
textcolor(bcolor); /*文本颜色*/
for(i=l;i<=r;i++) /*输出背景区域*/
{
for(j=u;j<=d;j++)
{
gotoxy(i,j);
printf("%c",219); /*输出背景字符*/
}
}
textcolor(tcolor);/*边框颜色*/
for(i=u+1;i<d;i++) /*在背景区域内输出边框线*/
{
gotoxy(l,i);
cprintf("%c",179); /*垂直线*/
gotoxy(r,i);
cprintf("%c",179);
}
for(i=l+1;i<r;i++)
{
gotoxy(i,u);
cprintf("%c",196); /*水平线*/
gotoxy(i,d);
cprintf("%c",196);
}
gotoxy(l,u);
cprintf("%c",218);/*左上角*/
gotoxy(r,u);
cprintf("%c",191);/*右上角*/
gotoxy(l,d);
cprintf("%c",192);/*左下角*/
gotoxy(r,d);
cprintf("%c",217); /*右下角*/
/* gettext(l+1,u+1,r-1,d-1,save1);*//*保存边框内区域*/
}
/*显示具体下拉选择项目*/
void DrawMl(int n)
{
gettext(1,1,80,25,save);/*保存被掩盖的地方*/
BlackText(n,1,ml[n].name);/*反选显示主菜单*/
DrawFrame(3+10*n-1,2,3+10*n+9,3+ml[n].n,0,7);/*下拉菜单的边框*/
for(i=3;i<3+ml[n].n;i++)/*输出所选菜单各选项*/
{
if(i==3)
BlackText(n,i,ml[n].str[i-3]);/*默认选中第一项*/
else
RedText(n,i,ml[n].str[i-3]);/*其余各项首字符红色显示*/
}
gotoxy(79,1);
MoveMl(n,3);/*菜单选项的控制*/
}
/*菜单选项的控制,n决定水平项,x决定下拉的选项*/
void MoveMl(int n,int x)
{
int flag=1;
while(flag)
{
gotoxy(79,1);
key=bioskey(0);/*接收按键*/
gotoxy(79,1);
switch(key)
{
case ESC:/*退出循环*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
flag=0;
break;
case LEFT:/*移到左边的选项*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
if(n==0)/*往左移动越界的话移到最后一个选项*/ /*II***************************************************************注意改******************************/
DrawMl(6);
else
DrawMl(n-1);
flag=0;
break;
case RIGHT:/*移动右边的选项*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
if(n==6)/*往右移动越界的话移到第一个选项*/ /*********************注意改**********************/
DrawMl(0);
else
DrawMl(n+1);
flag=0;
break;
case UP:/*具体选项往上移动*/
RedText(n,x,ml[n].str[x-3]);/*输出红色字体*/
if(x==3)/*移到最上面再按上键,就移到最下面*/
x=3+ml[n].n-1;
else
x--;/*移动到新的要显示的内容*/
BlackText(n,x,ml[n].str[x-3]);/*输出黑色字体*/
flag=1;
break;
case DOWN:/*具体选项往下移动*/
RedText(n,x,ml[n].str[x-3]);
if(x==(3+ml[n].n-1))/*移动到最底下再按下键就移到最上面*/
x=3;
else
x++;/*移动到新的要显示的内容*/
BlackText(n,x,ml[n].str[x-3]);
flag=1;
break;
case ENTER:
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
Enter(n,x-3);/*菜单选项的具体功能*/
flag=0;
break;
}
gotoxy(79,1);
}
}
/*菜单选项的具体功能*/
void Enter(int m,int n) /*m主菜单;n子菜单*/
{
switch(m)
{
case 0:switch(n)
{
case 0:xianshw();break;
case 1:break;
case 2:break;
case 3:day1();break;
case 4:savedep();savew();printf("Save successfully!!");
puttext(1,1,80,25,save);break;
case 5:exit(0);break;
} break;/*退出系统*/
case 1: switch(n)
{
case 0:addnew(dep);puttext(1,1,80,25,save); /***********************************后面还要在接一个关闭窗口函数*****/
break;
case 1: addlist(zhp); puttext(1,1,80,25,save); break; /*填写工资单*/
case 2:insertdep(); break;/****添加新的部门***/
case 3:
case 4:addzh(); puttext(1,1,80,25,save); /*添加新的职务和职称***/
}break;
case 2:switch(n)
{
case 0:changew(zhp);break;
case 1:changep(zhp);puttext(1,1,80,25,save);break;
case 2:clrscr();changeshuju();puttext(1,1,80,25,save); break;
}break;
case 3:switch(n)
{
case 0:jqsearch();break;
case 1:mhsearch();break;
}break;
case 4:switch(n)
{
case 0:
case 1:
case 2:
case 3:Ashuijin();puttext(1,1,80,25,save);break;
}break;
case 5:switch(n)
{
case 0:delone(dep,zhp); break;
case 1:delall(dep);break;
}break;
case 6:switch(n)
{
case 0:break;
}break;
}/*结束外switch*/
}
void DingWei(void)
{int a=3;
gotoxy(T+1,a);cprintf("name:");
gotoxy(T+1,a+1);cprintf("sex:");
gotoxy(T+1,a+2);cprintf("id:");
gotoxy(T+1,a+3);cprintf("cd:");
gotoxy(T+1,a+4);cprintf("ag:");
gotoxy(T+1,a+5);cprintf("wg:");
gotoxy(T+1,a+6);cprintf("dp:");
gotoxy(T+1,a+7);cprintf("zw:");
gotoxy(T+1,a+8);cprintf("zc:");
gotoxy(T+1,a+9);cprintf("zcn:");
gotoxy(T+1,a+10);cprintf("hp:");
gotoxy(T+1,a+11);cprintf("mb:");
gotoxy(T+1,a+13);cprintf("paylist of:");
gotoxy(T+1,a+14);cprintf("jb:");gotoxy(T+10,a+14);cprintf("pr:");
gotoxy(T+1,a+15);cprintf("wp:");gotoxy(T+10,a+15);cprintf("tax:");
gotoxy(T+1,a+16);cprintf("ad:");gotoxy(T+10,a+16);cprintf("wt:");
gotoxy(T+1,a+17);cprintf("ys:");gotoxy(T+10,a+17);cprintf("el:");
gotoxy(T+1,a+18);cprintf("cn:");gotoxy(T+10,a+18);cprintf("tv:");
gotoxy(T+1,a+19);cprintf("sy:");
}
void start(void) /*读取基本数据*/
{
FILE *fp; int i,j;
DEPART *p,*tail;
if((fp=fopen("d:\\sal\\zong.dat","r"))==NULL)
{
printf("Cannot open the file d:\\sal\\zong.dat");
exit(-1);
}
fscanf(fp,"%d%d",&clst,&tvst);
fscanf(fp,"%d",&j);
for(i=0;i<N&&i<j;i++)
fscanf(fp,"%s",departs[i]);
if(i<N)for(i=j;i<N;i++)departs[i][0]='\0';
fscanf(fp,"%d",&j);
for(i=0;i<N&&i<j;i++)
fscanf(fp,"%s",zhchs[i]);
if(i<N)for(i=j;i<N;i++)zhchs[i][0]='\0';
fscanf(fp,"%d",&j);
for(i=0;i<N&&i<j;i++)
fscanf(fp,"%s",zhws[i]);
if(i<N)for(i=j;i<N;i++)zhws[i][0]='\0';
for(i=0;i<N;i++)
fscanf(fp,"%d",&zhchsp[i]);
for(i=0;i<N;i++)
fscanf(fp,"%d",&zhwsp[i]);
if((p=malloc(sizeof(DEPART)))==NULL)
{
printf("Nei Cun Bu Zu!");exit(-1);
}
readdep(&p,fp); /*从文件中读取部门信息*/
headd=p;
headd->left=NULL;
headd->right=NULL;
headd->down=NULL;
if((p=malloc(sizeof(DEPART)))==NULL)
{
printf("Nei Cun Bu Zu!");exit(-1);
}
readdep(&p,fp);
tail=p;
tail->right=NULL;
tail->left=headd;
tail->down=NULL;
headd->right=tail;
while(!feof(fp))
{
if((p=malloc(sizeof(DEPART)))==NULL)
{
printf("Nei Cun Bu Zu!");exit(-1);
}
readdep(&p,fp);
tail->right=p;
p->left=tail;
tail=p;
tail->right=NULL;
tail->down=NULL;
}
fclose(fp);
return;
}
void savedep(void) /*保存部门信息*/
{
FILE *fp;int i;
DEPART *p;
if((fp=fopen("d:\\sal\\zong.dat","w+"))==NULL)
{
printf("Cannot open the file d:\\sal\\zong.dat");
exit(-1);
}
fprintf(fp,"%10d%10d",clst,tvst);
for(i=0;i<N&&departs[i][0]!=NULL;i++);
fprintf(fp," %d ",i);
for(i=0;i<N;i++)
fprintf(fp," %s ",departs[i]); putchar('\n');
for(i=0;i<N&&zhchs[i][0]!=NULL;i++);
fprintf(fp," %d ",i);
for(i=0;i<N;i++)
fprintf(fp," %s ",zhchs[i]); putchar('\n');
for(i=0;i<N&&zhws[i][0]!=NULL;i++);
fprintf(fp," %d ",i);
for(i=0;i<N;i++)
fprintf(fp," %s ",zhws[i]); putchar('\n');
for(i=0;i<N;i++)
fprintf(fp," %d ",zhchsp[i]); putchar('\n');
for(i=0;i<N;i++)
fprintf(fp," %d ",zhwsp[i]); putchar('\n');
for(p=headd;p->right!=NULL;p=p->right)
{writedep(p,fp); putchar('\n'); }
fclose(fp);
return;
}
void changeshuju(void) /*更改基本工资等固定信息*/
{
int i;
char ch;
textbackground(GREEN);textcolor(15);clrscr();
printf("\nThe clean cost:%7d",clst);
printf("\nThe tv cost:%7d",tvst);
printf("\nIs there anything to be changed?(y/n):");
scanf("%1s",&ch);
if(ch=='y'||ch=='Y')
{
printf("\nThe clean cost:");
scanf("%d",&clst);
printf("\nthe tv cost:");
scanf("%d",&tvst);
}
pri
求一C语言程序设计作业,工资管理系统
/**由于时间关系,模糊查询只写了姓名查找***/
/***模糊查询可能建链表有问题,还有填写工资单也可能有一点问题**/
#include <dos.h>
#include <bios.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 8
#define T 60 /****addlist有问题******************************************************************************************/
#define LEFT 0x4b00 /*左*/
#define RIGHT 0x4d00 /*右*/
#define DOWN 0x5000 /*下*/
#define UP 0x4800 /*上*/
#define SPACE 0x3920 /*空格*/
#define ESC 0x011b /* ESC键*/
#define ENTER 0x1c0d /*回车键*/
#define Backspace 0xe08 /*擦除键*/
#define ALT_B 12288 /*组合键ALT_B */
#define ALT_M 12800/*组合键ALT_M */
#define ALT_H 8960/*组合键ALT_H */
#define N 10
#define M 20
int clst,tvst; /*清洁费&&闭路电视费*/
int or=1;/*-1做了更改,1未做更改*/
char zhws[N][M],zhchs[N][M],departs[N][M]; /*存储职务名&&技术职称名&&部门名*/
char months[][5]={"0","Jan","Feb","Mar","Apr","May","Jun","July","Arg","Sep","Oct","Nov","Dec"};/*月份名,1月对应1*/
char sexs[][7]={"male","female"};
int zhwsp[N],zhchsp[N]; /*职务工资&&职称(基本)工资*/
FILE *fp;
typedef struct _paylist
{
int cardnum; /*工资卡号*/
char name[M];
int month; /*月份,进行选择*/
int jbsalary; /*基本工资*/
int zhwsalary; /*职务工资*/
int addition; /*补助*/
int ysalary; /*应发工资*/
int praise; /*特别奖励*/
int tax; /*税金*/
int water; /*水费*/
int elec; /*电费*/
int clean; /*清洁费*/
int tv; /*电视费*/
int salary; /*实发工资*/
struct _paylist *left,*right;
} PAYLIST;
typedef struct _worker
{
char name[M];
int sex; /*0男1女*/
char idnum[M]; /*身份证号*/
int cardnum; /*工资卡号*/
int age;
int wkage; /*工龄*/
int depart; /*选择,部门*/
int zhw; /*选择,职务*/
int zhch; /*选择,职称*/
long zhchnum; /*职称编号*/
long homeph; /*家庭电话*/
char mobile[M]; /*手机*/
int paymons; /*已经记录n个月的工资单*/
struct _worker *front,*down;
PAYLIST *right;
} WORKER;
typedef struct _depart
{
int name; /*选择,部门名*/
char path[M]; /*存储路径名*/
int wknum; /*该部门职工人数*/
struct _depart *left,*right;
WORKER *down;
} DEPART;
typedef struct _tjw
{
WORKER *wp;
struct _tjw *next;
}TJW;
DEPART *headd,*dep;
WORKER *zhp,*wwp;/*起指向作用,不要随便更改; 起流动作用*********/
TJW *head1; /**头指针**/
void load(void); /*从文件中导入部门,职工及工资单信息*/
void start(void); /*读取基本数据*/
void readdep(DEPART **pp,FILE *fp); /*从文件中读取部门信息*/
void writedep(DEPART *p,FILE *fp); /*逐个将部门信息写入文件*/
void shchx(WORKER *wp); /*详细输出*/
void readw(WORKER **wp,FILE *fp); /*从文件中读取职工信息*/
PAYLIST * whtailp(WORKER *wp); /*查找职工------链尾,返回链尾*/
void xianshw(void); /************显示第n个部门的职工信息********/
PAYLIST * insertp(WORKER *wp,PAYLIST *p,PAYLIST *tail); /*插入新职工,返回链尾*/
void addnew(DEPART *dep); /*增加新职工*/
PAYLIST * whtailp(WORKER *wp); /*查找职工------链尾,返回链尾*/
void changeshuju(void); /*更改基本工资等固定信息*/
PAYLIST * rulup(WORKER *wp); /*录入工资单信息*/
void addlist(WORKER *zhp); /*增加新职工*/
void Dzhg(void); /*****确定某一个具体职工****/
void xiansh2(DEPART *dep);
void insertdep(void); /****添加新的部门***/
void addzh(void); /***添加职务和职称***/
void savedep(void); /*保存部门信息*/
void savew(void); /*保存职工信息和工资信息***/
void day1(void); /***直接打印职工信息**/
void day2(void); /****将统计结果打印出来**/
void delall(DEPART *dep); /**删除整个部门**/
void delone(DEPART *dep,WORKER *p); /*删除一个职工及其工资信息*/
void changew(WORKER *p); /*修改职工基本信息*/
WORKER * search1(); /*通过身分证号查询*/
void search3(void); /*通过姓名查询*/
void mhsearch(); /*模糊查询*/
WORKER * search0(); /*通过职称编号查询*/
void jqsearch(void); /*精确查询*/
void Ashuijin(); /*统计税金总额及排出前十名**/
void changep(WORKER *p); /*修改工资单信息*/
WORKER * search2(); /*通过工资卡号查找*/
int key;/*按键变量*/
int textx,texty;/*光标坐标,x行,y列*/
struct menustruct/*菜单用的结构体*/
{
char name[10];/*主菜单名*/
char str[10][20];/*选项*/
int n;/*选项数*/
}ml[R];/*使用了R个,可根据需要增删*/
char save[4096],savee[4096];/*保存文本区域空间*/
/*char sav1[4096];*/
char c[4096];/*清屏专用空间*/
int i,j;/*常用变量*/
void Menu();/*初始化界面*/
void Selectitem();/*定义菜单*/
void DrawSelectitem();/*显示主菜单*/
void BlackText(int x,int y,char *z);/*选中菜单*/
void RedText(int x,int y,char *z);/*正常菜单*/
void Run();/*具体操作过程*/
void DrawMl(int n);/*显示下拉菜单*/
void MoveMl(int n,int x);/*菜单选项的控制*/
void Enter(int m,int n);/*菜单选项的具体功能*/
void ClrScr();/*自定义清屏函数*/
void DingWei(void);
void DrawFrame(int left,int up,int right,int down,int textcolor,int backgroundcolor);/*画边框*/
/***主函数****/
void loadmenu(void)
{
Menu();/*初始化界面*/
Run();/*具体操作过程*/
}
/*初始化界面*/
void Menu()
{ int a;
system("cls"); /*调用系统的清屏命令*/
textbackground(GREEN);/*将背景设置为蓝色*/
window(1,1,25,80);
clrscr();
textx=3;/*光标初始化位置*/
texty=2;
gotoxy(1,2);
printf("%c",218);/*画左上角*/
for(i=0;i<78;i++)
printf("%c",196); /*画水平直线*/
printf("%c",191);/*画右上角*/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
printf("%c",179); /*画垂直线*/
gotoxy(80,i);
printf("%c",179);
}
printf("%c",192); /*画左下角*/
for(i=0;i<78;i++)
printf("%c",196);
printf("%c",217); /*画右下角*/
gotoxy(1,1);
textcolor(7); /*设置灰色*/
for(i=0;i<80;i++)
cprintf("%c",219);/*用符号实现画主菜单的灰色背景区*/
for(a=3;a<=23;a++)
{gotoxy(T,a);cprintf("%c",179);} /********************************************************************/
DingWei();
Selectitem(); /*调用选项函数*/
DrawSelectitem(); /*画选项*/
gettext(2,3,78,23,c); /*保存当前文本区域*/
}
/*定义菜单*/
void Selectitem()
{
strcpy(ml[0].name,"FILE");/*下面的具体选项补空格是为了各菜单黑色背景相同*/ /**************************************************************************/
strcpy(ml[0].str[0],"Load ");/*导入某一部门职工信息*/
strcpy(ml[0].str[1],"Shemi ");/*设置密码*/
strcpy(ml[0].str[2],"Gaimi ");/*修改密码*/
strcpy(ml[0].str[3],"Print ");/*打印*/
strcpy(ml[0].str[4],"Save ");/*保存*/
strcpy(ml[0].str[5],"Exit ");/*退出系统*/
ml[0].n=6; /*保存菜单的项数*/
strcpy(ml[1].name,"INSERT");
strcpy(ml[1].str[0],"Newers ");/*插入新职工*/
strcpy(ml[1].str[1],"Paylist ");/*填写工资单*/
strcpy(ml[1].str[2],"Depart ");/*新增部门*/
strcpy(ml[1].str[3],"Zhchs "); /*新增职称*/
strcpy(ml[1].str[4],"Zhws "); /*新增职务*/
ml[1].n=5;
strcpy(ml[2].name,"EDIT");/*编辑修改*/
strcpy(ml[2].str[0],"Imfor "); /*职工信息*/
strcpy(ml[2].str[1],"Paylist "); /*工资单*/
strcpy(ml[2].str[2],"Tongshu ");/*修改基本工资等固定数据*/
ml[2].n=3;
strcpy(ml[3].name,"SEARCH"); /*查询*/
strcpy(ml[3].str[0],"Jingque "); /*精确查询*/
strcpy(ml[3].str[1],"Mohu "); /*模糊查询*/
ml[3].n=2;
strcpy(ml[4].name,"TONGJI"); /*统计*/
strcpy(ml[4].str[0],"Paixu "); /*排序*/
strcpy(ml[4].str[1],"Agongzi "); /*各类工资总额*/
strcpy(ml[4].str[2],"Ashuijin "); /*税金总额(月/年) */
strcpy(ml[4].str[3],"Gzhjigz "); /*各工种总数及平均工资*/
ml[4].n=4;
strcpy(ml[5].name,"DEL");
strcpy(ml[5].str[0],"One ");
strcpy(ml[5].str[1],"All ");
ml[5].n=2;
strcpy(ml[6].name,"HELP");
strcpy(ml[6].str[0],"About ");
ml[6].n=1;
}
/*显示主单名*/
void DrawSelectitem()
{
for(i=0;i<R;i++)
RedText(i,1,ml[i].name); /*显示主菜单名,且首字母为红色*/
}
/*正常显示菜单*/
void RedText(int x,int y,char *z)
{
textbackground(7); /*设置背景颜色为浅灰色*/
gotoxy(3+x*10,y);
for(j=0;z[j];j++)
{
if(j==0)
textcolor(RED);/*第一个字母显示红色*/
else
textcolor(BLACK); /*设置黑色*/
cprintf("%c",z[j]); /*输出菜单名*/
}
}
/*显示选中菜单*/
void BlackText(int x,int y,char *z)
{
textbackground(0); /*设置背景颜色为黑色*/
textcolor(15); /*设置文本颜色为白色*/
gotoxy(3+10*x,y);/*定位坐标*/
cputs(z); /*输出菜单名字符串*/
}
/*按键操作过程*/
void Run()
{ gettext(1,1,80,25,savee);
while(1)
{
gotoxy(texty,textx);
key=bioskey(0);/*接收按键*/
switch(key)
{
case ALT_B:
case ESC: DrawMl(0);break; /*显示下拉菜单1*/
case ALT_M: DrawMl(1);break;/*显示下拉菜单2*/
case ALT_H: DrawMl(2);/*显示下拉菜单3*/
case UP: /*上光标键的操作控制*/
{
if(textx==3)
textx=23;
textx--;
gotoxy(texty,textx);
}break;
case DOWN: /*下光标键的操作控制*/
{
if(textx==23)
textx=3;
textx++;
gotoxy(texty,textx);
}break;
case LEFT: /*左光标键的操作控制*/
{
if(texty==2)
texty=T-1;
texty--;
gotoxy(texty,textx);
}break;
case Backspace: /*擦除键的设置*/
{
if(texty==2&&textx==3)
continue;
else
{
if(texty!=2)
texty--; /*擦除键的细节问题,先擦去东西,然后光标还要往后退一格*/
else
if(texty==2)
{
texty=78;
textx--;
}
gotoxy(texty,textx);
printf(" ");
gotoxy(texty,textx);
}
}break;/*end case 0xe08*/
case RIGHT: /*右光标键的操作控制*/
{
if(texty==T-1)
texty=2;
texty++;
gotoxy(texty,textx);
}break;
case SPACE: /*空格键的操作*/
{
if(texty==79)
continue;
else
{
gotoxy(texty,textx); /*空格的细节操作*/
printf(" ");
texty++;
gotoxy(texty,textx);
}
}break;
case ENTER: /*回车的控制操作*/
{
if(textx==23)
continue;
textx++;
texty=2;
gotoxy(texty,textx);
}break;
default : /*非控制键的结果*/
{
if(texty==79&&textx==23)/*到达最后就不再输出*/
continue;
else
if(texty==79&&textx!=23) /*到行的最后*/
{
textx++;
texty=2;
}
gotoxy(texty,textx);/*输出结果*/
printf("%c",key);
if(texty==79) /*如果texty==79就不执行*/
continue;
else /*如果没到行尾就继续执行,使光标向前移动一位*/
texty++;
}
}
}/*大循环的大括号*/
}
/*画边框函数*/
void DrawFrame(int l,int u,int r,int d,int tcolor,int bcolor)
{
textbackground(bcolor); /*背景颜色*/
textcolor(bcolor); /*文本颜色*/
for(i=l;i<=r;i++) /*输出背景区域*/
{
for(j=u;j<=d;j++)
{
gotoxy(i,j);
printf("%c",219); /*输出背景字符*/
}
}
textcolor(tcolor);/*边框颜色*/
for(i=u+1;i<d;i++) /*在背景区域内输出边框线*/
{
gotoxy(l,i);
cprintf("%c",179); /*垂直线*/
gotoxy(r,i);
cprintf("%c",179);
}
for(i=l+1;i<r;i++)
{
gotoxy(i,u);
cprintf("%c",196); /*水平线*/
gotoxy(i,d);
cprintf("%c",196);
}
gotoxy(l,u);
cprintf("%c",218);/*左上角*/
gotoxy(r,u);
cprintf("%c",191);/*右上角*/
gotoxy(l,d);
cprintf("%c",192);/*左下角*/
gotoxy(r,d);
cprintf("%c",217); /*右下角*/
/* gettext(l+1,u+1,r-1,d-1,save1);*//*保存边框内区域*/
}
/*显示具体下拉选择项目*/
void DrawMl(int n)
{
gettext(1,1,80,25,save);/*保存被掩盖的地方*/
BlackText(n,1,ml[n].name);/*反选显示主菜单*/
DrawFrame(3+10*n-1,2,3+10*n+9,3+ml[n].n,0,7);/*下拉菜单的边框*/
for(i=3;i<3+ml[n].n;i++)/*输出所选菜单各选项*/
{
if(i==3)
BlackText(n,i,ml[n].str[i-3]);/*默认选中第一项*/
else
RedText(n,i,ml[n].str[i-3]);/*其余各项首字符红色显示*/
}
gotoxy(79,1);
MoveMl(n,3);/*菜单选项的控制*/
}
/*菜单选项的控制,n决定水平项,x决定下拉的选项*/
void MoveMl(int n,int x)
{
int flag=1;
while(flag)
{
gotoxy(79,1);
key=bioskey(0);/*接收按键*/
gotoxy(79,1);
switch(key)
{
case ESC:/*退出循环*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
flag=0;
break;
case LEFT:/*移到左边的选项*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
if(n==0)/*往左移动越界的话移到最后一个选项*/ /*II***************************************************************注意改******************************/
DrawMl(6);
else
DrawMl(n-1);
flag=0;
break;
case RIGHT:/*移动右边的选项*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
if(n==6)/*往右移动越界的话移到第一个选项*/ /*********************注意改**********************/
DrawMl(0);
else
DrawMl(n+1);
flag=0;
break;
case UP:/*具体选项往上移动*/
RedText(n,x,ml[n].str[x-3]);/*输出红色字体*/
if(x==3)/*移到最上面再按上键,就移到最下面*/
x=3+ml[n].n-1;
else
x--;/*移动到新的要显示的内容*/
BlackText(n,x,ml[n].str[x-3]);/*输出黑色字体*/
flag=1;
break;
case DOWN:/*具体选项往下移动*/
RedText(n,x,ml[n].str[x-3]);
if(x==(3+ml[n].n-1))/*移动到最底下再按下键就移到最上面*/
x=3;
else
x++;/*移动到新的要显示的内容*/
BlackText(n,x,ml[n].str[x-3]);
flag=1;
break;
case ENTER:
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
Enter(n,x-3);/*菜单选项的具体功能*/
flag=0;
break;
}
gotoxy(79,1);
}
}
/*菜单选项的具体功能*/
void Enter(int m,int n) /*m主菜单;n子菜单*/
{
switch(m)
{
case 0:switch(n)
{
case 0:xianshw();break;
case 1:break;
case 2:break;
case 3:day1();break;
case 4:savedep();savew();printf("Save successfully!!");
puttext(1,1,80,25,save);break;
case 5:exit(0);break;
} break;/*退出系统*/
case 1: switch(n)
{
case 0:addnew(dep);puttext(1,1,80,25,save); /***********************************后面还要在接一个关闭窗口函数*****/
break;
case 1: addlist(zhp); puttext(1,1,80,25,save); break; /*填写工资单*/
case 2:insertdep(); break;/****添加新的部门***/
case 3:
case 4:addzh(); puttext(1,1,80,25,save); /*添加新的职务和职称***/
}break;
case 2:switch(n)
{
case 0:changew(zhp);break;
case 1:changep(zhp);puttext(1,1,80,25,save);break;
case 2:clrscr();changeshuju();puttext(1,1,80,25,save); break;
}break;
case 3:switch(n)
{
case 0:jqsearch();break;
case 1:mhsearch();break;
}break;
case 4:switch(n)
{
case 0:
case 1:
case 2:
case 3:Ashuijin();puttext(1,1,80,25,save);break;
}break;
case 5:switch(n)
{
case 0:delone(dep,zhp); break;
case 1:delall(dep);break;
}break;
case 6:switch(n)
{
case 0:break;
}break;
}/*结束外switch*/
}
void DingWei(void)
{int a=3;
gotoxy(T+1,a);cprintf("name:");
gotoxy(T+1,a+1);cprintf("sex:");
gotoxy(T+1,a+2);cprintf("id:");
gotoxy(T+1,a+3);cprintf("cd:");
gotoxy(T+1,a+4);cprintf("ag:");
gotoxy(T+1,a+5);cprintf("wg:");
gotoxy(T+1,a+6);cprintf("dp:");
gotoxy(T+1,a+7);cprintf("zw:");
gotoxy(T+1,a+8);cprintf("zc:");
gotoxy(T+1,a+9);cprintf("zcn:");
gotoxy(T+1,a+10);cprintf("hp:");
gotoxy(T+1,a+11);cprintf("mb:");
gotoxy(T+1,a+13);cprintf("paylist of:");
gotoxy(T+1,a+14);cprintf("jb:");gotoxy(T+10,a+14);cprintf("pr:");
gotoxy(T+1,a+15);cprintf("wp:");gotoxy(T+10,a+15);cprintf("tax:");
gotoxy(T+1,a+16);cprintf("ad:");gotoxy(T+10,a+16);cprintf("wt:");
gotoxy(T+1,a+17);cprintf("ys:");gotoxy(T+10,a+17);cprintf("el:");
gotoxy(T+1,a+18);cprintf("cn:");gotoxy(T+10,a+18);cprintf("tv:");
gotoxy(T+1,a+19);cprintf("sy:");
}
void start(void) /*读取基本数据*/
{
FILE *fp; int i,j;
DEPART *p,*tail;
if((fp=fopen("d:\\sal\\zong.dat","r"))==NULL)
{
printf("Cannot open the file d:\\sal\\zong.dat");
exit(-1);
}
fscanf(fp,"%d%d",&clst,&tvst);
fscanf(fp,"%d",&j);
for(i=0;i<N&&i<j;i++)
fscanf(fp,"%s",departs[i]);
if(i<N)for(i=j;i<N;i++)departs[i][0]='\0';
fscanf(fp,"%d",&j);
for(i=0;i<N&&i<j;i++)
fscanf(fp,"%s",zhchs[i]);
if(i<N)for(i=j;i<N;i++)zhchs[i][0]='\0';
fscanf(fp,"%d",&j);
for(i=0;i<N&&i<j;i++)
fscanf(fp,"%s",zhws[i]);
if(i<N)for(i=j;i<N;i++)zhws[i][0]='\0';
for(i=0;i<N;i++)
fscanf(fp,"%d",&zhchsp[i]);
for(i=0;i<N;i++)
fscanf(fp,"%d",&zhwsp[i]);
if((p=malloc(sizeof(DEPART)))==NULL)
{
printf("Nei Cun Bu Zu!");exit(-1);
}
readdep(&p,fp); /*从文件中读取部门信息*/
headd=p;
headd->left=NULL;
headd->right=NULL;
headd->down=NULL;
if((p=malloc(sizeof(DEPART)))==NULL)
{
printf("Nei Cun Bu Zu!");exit(-1);
}
readdep(&p,fp);
tail=p;
tail->right=NULL;
tail->left=headd;
tail->down=NULL;
headd->right=tail;
while(!feof(fp))
{
if((p=malloc(sizeof(DEPART)))==NULL)
{
printf("Nei Cun Bu Zu!");exit(-1);
}
readdep(&p,fp);
tail->right=p;
p->left=tail;
tail=p;
tail->right=NULL;
tail->down=NULL;
}
fclose(fp);
return;
}
void savedep(void) /*保存部门信息*/
{
FILE *fp;int i;
DEPART *p;
if((fp=fopen("d:\\sal\\zong.dat","w+"))==NULL)
{
printf("Cannot open the file d:\\sal\\zong.dat");
exit(-1);
}
fprintf(fp,"%10d%10d",clst,tvst);
for(i=0;i<N&&departs[i][0]!=NULL;i++);
fprintf(fp," %d ",i);
for(i=0;i<N;i++)
fprintf(fp," %s ",departs[i]); putchar('\n');
for(i=0;i<N&&zhchs[i][0]!=NULL;i++);
fprintf(fp," %d ",i);
for(i=0;i<N;i++)
fprintf(fp," %s ",zhchs[i]); putchar('\n');
for(i=0;i<N&&zhws[i][0]!=NULL;i++);
fprintf(fp," %d ",i);
for(i=0;i<N;i++)
fprintf(fp," %s ",zhws[i]); putchar('\n');
for(i=0;i<N;i++)
fprintf(fp," %d ",zhchsp[i]); putchar('\n');
for(i=0;i<N;i++)
fprintf(fp," %d ",zhwsp[i]); putchar('\n');
for(p=headd;p->right!=NULL;p=p->right)
{writedep(p,fp); putchar('\n'); }
fclose(fp);
return;
}
void changeshuju(void) /*更改基本工资等固定信息*/
{
int i;
char ch;
textbackground(GREEN);textcolor(15);clrscr();
printf("\nThe clean cost:%7d",clst);
printf("\nThe tv cost:%7d",tvst);
printf("\nIs there anything to be changed?(y/n):");
scanf("%1s",&ch);
if(ch=='y'||ch=='Y')
{
printf("\nThe clean cost:");
scanf("%d",&clst);
printf("\nthe tv cost:");
scanf("%d",&tvst);
}
pri
OraclePL/SQL中如何使用%TYPE和%ROWTYPE
本文章简单的介绍了Oracle PL/SQL中如何使用%TYPE和%ROWTYPE,有需要了解的朋友可以参考一下下。
本文章简单的介绍了Oracle PL/SQL中如何使用%TYPE和%ROWTYPE,有需要了解的朋友可以参考一下下。
1. 使用%TYPE
在许多情况下,PL/SQL变量可以用来存储在表中的数据。在这种情况下,变量应该拥有与表列相同的类型。例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量:
代码如下DECLARE
v_FirstName VARCHAR2(20);
但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?那就会导致所有使用这个列的PL/SQL代码都必须进行修改。如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。
这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。
例如:
代码如下DECLARE
v_FirstName students.first_name%TYPE;
通过使用%TYPE,v_FirstName变量将同students表的first_name列的类型相同(可以理解为将两者邦定起来)。
每次匿名块或命名块运行该语句块以及编译存储对象(过程、函数、包、对象类和触发器)时,就会确定该类型。
使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
2. 使用%ROWTYPE
2.1 PL/SQL记录
PL/SQL记录类型类似于中的结构,是一种复合类型,是用户自定义的。
记录提供了一种处理的但又作为一个整体单元相关的变量的机制。请看:
代码如下DECLARE
v_StudentID NUMBER(5);
v_FirstName VARCHAR2(20);
v_LastName VARCHAR2(20);
这3个变量在逻辑上是相互关联的,因为他们指向students表中不同的字段。如果为这些变量声明一个记录类型,那么他们之间的关系就十分明显,可作为一个单元进行处理。
代码如下DECLARE
/*Define a record type to hold common student informationi*/
TYPE t_StudentRecord IS RECORD(
StudentID NUMBER(5),
FirstName VARCHAR2(20),
LastName VARCHAR2(20);
/*Declare a variable of this type.*/
v_StudentInfo t_StudentRecord;
2.2 记录赋值
可以用SELECT语句向记录赋值,这将会从数据库中检索数据并将该数据存储到记录中。注意的是,记录中字段应该和查询结果列表中的字段相匹配。
代码如下SELECT studentID,firstName,lastName
into v_StudentInfo
from students where studentID=32;
2.3 使用%ROWTYPE
在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。
例如:
代码如下DECLARE
v_RoomRecord rooms%ROWTYPE;
将定义一个记录,该记录中的字段将与rooms表中的列相对应怎么让网页只显示固定条数信息,超出后自动生成下一页
功能:JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle
--%>
<%@ page contentType="text/html;charset=8859_1" %>
<%
//变量声明
java.sql.Connection sqlCon; //数据库连接对象
java.sql.Statement sqlStmt; //SQL语句对象
java.sql.ResultSet sqlRst; //结果集对象
java.lang.String strCon; //数据库连接字符串
java.lang.String strSQL; //SQL语句
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
java.lang.String strPage;
int i;
//设置一页显示的记录数
intPageSize = 2;
//取得待显示页码
strPage = request.getParameter("page");
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
}
else{//将字符串转换成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//装载JDBC驱动程序
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//设置数据库连接字符串
strCon = "jdbc:oracle:thin:@linux:1521:ora4cweb";
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"hzq","hzq");
//创建一个可以滚动的只读的SQL语句对象
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
//准备SQL语句
strSQL = "select name,age from test";
//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
//获取记录总数
sqlRst.last();
intRowCount = sqlRst.getRow();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
if(intPageCount>0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){
%>
<tr>
<td><%=sqlRst.getString(1)%></td>
<td><%=sqlRst.getString(2)%></td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>
第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage<intPageCount){%><a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%> <%if(intPage>1){%><a href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%>
</body>
</html>
<%
//关闭结果集
sqlRst.close();
//关闭SQL语句对象
sqlStmt.close();
//关闭数据库
sqlCon.close();
%>