  
- UID
- 1
- 威望
- 1240 点
- 金钱
- 24019 金币
- 点卡
- 317 点
|
1#
发表于 2005-8-25 19:52
| 只看该作者
基于ODBC的通用数据库管理程序
作者:zengh
整理:小歪歪
email: annysun@163.net
日期:00-7-5 下午 02:14:04- #!/usr/bin/perl
- print "Content-type: text/html\n\n";
- #setver
- $http = "http://$ENV{';SERVER_NAME';}$server_port";
- $cgiurl = "$http/cgi-bin/test4.pl"; #cgi的URL exp :http://ssl
- ($disk,$root,$script) =split(/\\/,__FILE__);
- $filehead = "$disk\/$root\/$script"; #exp:d:/inetpub/cgi-bin
- $allow_html = 0; # 1=允许使用html语法 0=no
- $time_miss = +0; # Server时区调整
- #program
- &get_form;
- &set_var;
- use Win32::ODBC;
- #$DSN = "mdbtest" if (!$DSN);
- $DSN = "DSN eq test;UID eq test;PWD eq test;" if (!$DSN); #i use sqlserver
- $DSN1=$DSN;
- $DSN=~s / eq /=/g;
- $DSN1=~s / /%20/g;
- #创建一个DSN文件头
- my $db = Win32::ODBC->new($DSN);
- #测试是否存在此DSN
- if (! $db){
- print "Failed to Connect $DSN\n";
- Win32::ODBC::DumpError();
- #如果不存在则退出程序
- die;
- }#else{print "联结正确!";exit;}
- $DSN=$DSN1;
- if ($job eq "look") {
- &look;
- $db->Close();
- exit;
- }elsif ($job eq "type"){
- &type;
- $db->Close();
- exit;
- }elsif ($job eq "stat"){
- &stat;
- $db->Close();
- exit;
- }elsif ($job eq "help"){
- &help;
- $db->Close();
- exit;
- }elsif ($job eq "log"){
- &log;
- $db->Close();
- exit;
- }
- &main;
- $db->Close();
- exit;
- sub log{
- $sql="select usedate as 时间,host as 使用者,sqlcommand as SQL命令 from log order by usedate";
- &look;
- }
- sub help{
- print <<"EOF";
- <html><body>
- <pre>
- sql语句简介:
- select [ALL|DISTINCT|DISTINCTROW|[TOP n ]字段列表|* from 表名
- [where 条件]
- [order by 字段名 [DESC]]
- [group by 字段名]
- 其中:条件 数字型 字段名 操作符 值(lt < ,gt >,eq =, le <=,ge >=,ne <>)
- 字符型 字段名 like ';值'; 如加%号为模糊条件
- 日期型 TO_CHAR(字段名,';YYYYMMDD HH24:MI:SS';) > ';20000120 09:01:00';
- 谓词 ALL 返回所有数据,默认值
- DISTINCT 省略选择字段中包含重复数据的记录
- DISTINCTROW 省略基于整个重复记录的数据,而不只是基于重复字段的数据。
- TOP n 返回指定记录数
- 标头 用于代替字段名,语法: 字段名 as 标头
- CREATE TABLE 表名(字段名 字段类型(长度)[,字段名 字段类型(长度)...])
- drop table 表名 用途:删除表 注:删除后无法恢复
- TRUNCATE TABLE 表名 用途:清除表中的所有数据但不删除这个表
- ALTER TABLE 表名 ADD 字段名 字段类型 NULL
- 用途:给指定的表增加一个字段,注意:NULL参数是必须有的
- INSERT INTO 表名 (字段列表) VALUES (字段值列表) 用途:增加记录,分隔用,分隔
- DELETE * from 表名 WHERE 条件 用途:删除符合条件的记录 注意:如不提供条件,将删除所有记录
- update 表名 set 字段=字段值[,字段=字段值] where 条件
- 用途:更新符合条件的记录值,注意:如不提供条件将更新所有记录
- SELECT *|字段列表 INTO 新表名 FROM 旧表名 用途:拷贝整个表或指定字段的表
- 字段类型:
- 数据类型 存储大小 描述
- BINARY 每个字符占一个字节 任何类型的数据都可存储在这种类型的字段中。不需数据转换(例如,转换到文本数据)。数据输入二进制字段的方式决定了它的输出方式。
- BIT 1 个字节 Yes 和 No ,以及只包含这两个数值之一的字段。
- BYTE 1 个字节 介于 0 到 255 之间的整型数。
- COUNTER 4 个字节 每当有新记录添加至表中时,由 Microsoft Jet 数据库引擎自动增加数值。在 Microsoft Jet 数据库引擎中,此数值的数据类型为 Long。
- CURRENCY 8 个字节 介于 ?-?922,337,203,685,477.5808 到 922,337,203,685,477.5807 之间的符号整数。
- DATETIME
- (清参阅 DOUBLE ) 8 个字节 介于 100 到 9999 年的日期或时间数值。
- GUID 128 个位 用于远程过程调用的唯一识别数字。
- SINGLE 4 个字节 单精度浮点数,负数范围是从 -3.402823E38 到 -1.401298E-45,正数从1.401298E-45 到 3.402823E38,和 0。
- DOUBLE 8 个字节 双精度浮点数,负数范围是从 -1.79769313486232E308 到 -4.94065645841247E-324,正数从 4.94065645841247E-324 到 1.79769313486232E308,和 0。
- SHORT 2 个字节 介于 -32,768 到 32,767 的短整型数。
- LONG 4 个字节 介于 -2,147,483,648 到 2,147,483,647 的长整型数。
- LONGTEXT 每个字符占一个字节 从零到最大 1.2 千兆字节。
- LONGBINARY 视实际需要而定 从零到最大 1.2 千兆字节。用于 OLE 对象。
- TEXT 每个字符占一个字节 长度从 0 到 255 个字符。
- 标准函数:avg(),count(),sum(),max(),min() 括号内为字段名
- 技巧:
- vote BETWEEN 7 AND 10 等同于vote>6 and vote<11
- username IN (';Bill Gates';,';President Clinton';)只取其中之一
- CONVERT(CHAR(8),price) 将其它类型的数据转型为指定长度的字符型
- site_name LIKE ';[A-M]%'; 则只取首字符为A至M的记录
- site_name LIKE ';[ABC]%'; 则只取首字符为A或B或C的记录
- site_name LIKE ';[C-FY]%'; 则只取首字符为C至F或Y的记录
- site_name LIKE ';[^Y]%'; 要得到那些名字不以Y开头的记录
- site_name LIKE ';M_crosoft'; 通过使用下划线字符(_),你可以匹配任何单个字符
- 如果你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。如果你想匹配连字
- 符(-),应把它指定为方括号中的第一个字符。如果你想匹配方括号,应把它们也括在方括号中。
- TTRIM()和LTRIM(),可以用来从字符串中剪掉空格。函数LTRIM()去除应该字符串前面的
- 所有空格;函数RTRIM()去除一个字符串尾部的所有空格。
- 日期型常数应形式为 #12/25/2000 11:25:32#
- <center><font color=red>(C)Copyright by zengh 1999-2000</font></center>
- </pre>
- </body></html>
- EOF
- }
- sub stat {
- @tables=sort $db->TableList;
- print "<html><body><center><h4>数据表
- (共$#tables个)</h4></center><hr>";
- $yes=0;
- foreach (@tables) {
- if ($_ ne ';log';) {
- print "<a href=$cgiurl?job=look&dsn=$DSN&sql=select%20top%20100%20*%20%20from%20$_ target=look>$_</a>
- \n";
- }else{$yes=1;}
- }
- if ($yes=0) {#如果不存在LOG这个表则建立
- $sql="create table log (usedate datetime,host char(20),sqlcommand char(255))";
- if ($db->Sql($sql)) {
- print "sql错误:$sql\n
- ";
- $db->DumpError();
- $db->Close();
- exit;
- }
- }
- print "<hr>点击表名显示其记录<hr>";
- print "</body></html>";
- }
- sub look{
- @tables=sort $db->TableList;
- if (!$sql) {
- $table=@tables[0];
- $table=@tables[1] if ($#tables>=1 and @tables[0] eq "log");
- $sql="select top 100 * from ".$table;
- }
- $sql=~s / eq /=/g;
- $sql=~s / ne /<>/g;
- $sql=~s / lt /</g;
- $sql=~s / gt />/g;
- $sql=~s / le /<=/g;
- $sql=~s / ge />=/g;
- if ($db->Sql($sql)) {
- print "sql错误:$sql\n
- ";
- $db->DumpError();
- $db->Close();
- exit;
- }
- if (! ($sql=~/select|into|/i)) {
- print "$sql语句执行成功!!";
- $db->Close();
- exit;
- }
- @fieldname=$db->FieldNames();
- print "<html><body><center><h2>返回状态情况<h2></center><hr>";
- print "<table width=100% border=1><tr><td>no.</td>";
- foreach (@fieldname) {
- print "<td>$_</td>";
- }
- print "</tr>";
- $i=0;
- while ($db->FetchRow()){
- $i++;
- %fieldmemo=$db->DataHash;
- print "<tr><td>$i</td>";
- foreach (@fieldname) {
- print "<td>$fieldmemo{$_}</td> ";
- }
- print "</tr>";
- }
- print "</table>";
- print "<hr>表属性";
- print "<table border=1>";
- my(%type) = $db->ColAttributes($db->SQL_COLUMN_TYPE);
- my(%len) = $db->ColAttributes($db->SQL_COLUMN_LENGTH);
- my(%null) = $db->ColAttributes($db->SQL_COLUMN_NULLABLE);
- foreach $field (sort @fieldname) {
- if ($type{$field}==12) {$fieldtype="文本";}
- elsif ($type{$field}==-1){$fieldtype="备注/超级链接";}
- elsif ($type{$field}==4){$fieldtype="数字/自动编号";}
- elsif ($type{$field}==11){$fieldtype="日期/时间";}
- elsif ($type{$field}==2){$fieldtype="货币";}
- elsif ($type{$field}==-7){$fieldtype="是/否";}
- elsif ($type{$field}==-4){$fieldtype="OLE对象";}
- elsif ($type{$field}==1){$fieldtype="文本";}
- else{$fieldtype=$type{$field};}
- print "<TR><TD>$field</td><TD>$fieldtype</td><TD>$len{$field}</td><TD></tr>";
- }
- print "</table>";
- print "</body></html>";
- if ($sql ne "select usedate as 时间,host as 使用者,sqlcommand as SQL命令 from log order by usedate" and $sql !=~"select top 100 * from") {
- $sql1="insert into log (usedate,host,sqlcommand) values (';$daten $timen';,';$userip';,';$sql';)";
- if ($db->Sql($sql1)) {
- print "sql错误:$sql\n
- ";
- $db->DumpError();
- $db->Close();
- exit;
- }
- }
- }
- sub type{
- print <<"EOF";
- <html><body>
- <FORM METHOD=POST ACTION="$cgiurl?job=look&dsn=$DSN" target="look">
- SQL语句:<INPUT TYPE="text" NAME="sql" size=60>
- <INPUT TYPE="submit" value="确定"><INPUT TYPE="reset" value="重写">
- </FORM>
- <a href=$cgiurl?job=stat&dsn=$DSN target="stat">刷性状态</a>-----
- <a href=$cgiurl?job=help target="look">帮助</a>-----
- <a href=$cgiurl?job=log&dsn=$DSN target="look">日志</a>
- </body></html>
- EOF
- }
- sub main {
- print <<"EOF";
- <html>
- <head>
- <title>odbc test</title>
- <meta name="GENERATOR" content="Microsoft FrontPage 3.0">
- </head>
- <frameset cols="643,*">
- <frameset rows="*,25%">
- <frame name="look" src="$cgiurl?job=look&dsn=$DSN">
- <frame name="type" target="look" src="$cgiurl?job=type&dsn=$DSN">
- </frameset>
- <frame name="stat" src="$cgiurl?job=stat&dsn=$DSN">
- <noframes>
- <body>
- <p>This page uses frames, but your browser doesn';t support them.</p>
- </body>
- </noframes>
- </frameset>
- </html>
- EOF
- }
- ##########
- #subs program
- ##########
- sub set_var {
- $job =&get_var(';job'; ,';\n|‖';);
- $sql =&get_var(';sql'; ,';\n';);
- $DSN =&get_var(';dsn'; ,';\n';);
- $userip=$ENV{';REMOTE_ADDR';};
- ($secn,$minn,$hourn,$dayn,$monn,$yearn,$weekn,$yeardayn,$isdst) = localtime(time+(3600*$time_miss));
- $monn=$monn+1;
- if ($monn<10) {$monn="0$monn";}
- if ($dayn<10) {$dayn="0$dayn";}
- if ($hourn<10) {$hourn="0$hourn";}
- if ($minn<10) {$minn="0$minn";}
- if ($secn<10) {$secn="0$secn";}
- $yearn+=1900;
- $daten="$monn/$dayn/$yearn";
- $timen="$hourn\:$minn\:$secn";
- }
- ############
- sub get_form {
- @querys = split(/&/, $ENV{';QUERY_STRING';});
- foreach (@querys) {
- ($name,$value) = split(/=/, $_);
- $value = &decode($value);
- $value = &filterhtml($value);
- &setvaluetoform($name, $value);
- }
- read(STDIN, $buffer, $ENV{';CONTENT_LENGTH';});
- @pairs = split(/&/, $buffer);
- foreach (@pairs) {
- ($name, $value) = split(/=/, $_);
- $value = &decode($value);
- $value = &filterhtml($value);
- &setvaluetoform($name, $value);
- }
- @cookies = split(/; /, $ENV{HTTP_COOKIE});
- foreach $cookies (@cookies) {
- ($name, $value) = split(/=/, $cookies);
- $value = &decode($value);
- $value = &filterhtml($value);
- &setvaluetoform($name, $value);
- }
- }
- ############
- sub decode {
- local($return)=$_[0];
- $return =~ tr/+/ /;
- $return =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
- return $return;
- }
- ##########
- sub filterhtml {
- local($return)=$_[0];
- $return =~ s/<!--(.|\n)*-->//g;
- if ($allow_html != 1) {
- $return =~s/<([>]|\n)*>//g;
- }
- return $return;
- }
- ##########
- sub setvaluetoform {
- if ($FORM{$_[0]}) {
- print "\$_[0]=$_[0]\n
- ";
- print "\$_[1]=$_[1]\n
- ";
- $FORM{$_[0]}="$FORM{$_[0]}§$_[1]";
- print "\$FORM{\$_[0]}=$FORM{$_[0]}\n
- ";
- }
- else {
- $FORM{$_[0]}=$_[1];
- }
- }
- #########
- sub get_var {
- local($return)="";
- $return="$FORM{$_[0]}" if ($FORM{$_[0]});
- $return=~ s/$_[1]//g;
- return $return;
- }
- #########
- sub readtxtfile {
- open(READTXTFILE,"$_[0]");
- @readtxtfile=<READTXTFILE>;
- close(READTXTFILE);
- return @readtxtfile;
- }
- #############
- sub checkempty {
- local($chkval)=$_[0];
- $chkval =~ s/ |
- |\n//g;
- &error($_[1]) if ($chkval eq "");
- }
- ##########
- sub outhtml {
- print "<html><head>\n";
- print "</head><body >\n";
- print "$_[0]\n";
- print "</body></html>\n";
- exit 0;
- }
复制代码 |
我是一个呼吸着现在的空气而生活在过去的人
这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
我已习惯了孤独,爱上孤独
他让我看清了自我,还原了自我
让我再静静的沉思中得到快乐和满足
再孤独的世界里我一遍又一遍
不厌其烦的改写着自己的过去
延伸到现在与未来
然而那只是泡沫般的美梦
产生的时刻又伴随着破灭的到来
在灰飞烟灭的瞬间我看到的是过程的美丽
而不是结果的悲哀。。。
|
|