4.11 查看及修改数据表结构

数据表结构也是数据库维护的主要操作,通常随着网站的更新,数据表结构也会发生变化。本章主要实现数据表结构的查看与修改。

实例107 查看数据表结构

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\04\107

实例说明

查看数据表结构有助于操作者了解软件的内部体系结构。本实例将显示出所选数据表的所有表字段及相关信息。运行程序,通过下拉列表选择显示表结构的数据表名称,此时页面上就会显示出所选表的结构信息,如图4.71所示。

图4.71 查看数据表结构

技术要点

本实例主要应用SQL Server系统表Sysobject(s系统对象)、Syscolumn(s字段)、Syspro perties(描述)、Systypes(字段类别)和Syscomments(默认值)等相对应的表关系显示出表的结构。这些系统表都可以通过对象编号和相关表编号进行关联。

实现过程

(1)创建UserDao类,定义连接、查询和关闭数据库的方法。

(2)创建index.jsp页面,添加form表单,首先执行查询数据库表的操作,将查询结果集写入到下列列表中;然后在根据下拉列表传递的值查询出指定数据表的结构。关键代码如下:

        <%@ page contentType="text/html; charset=gbk" language="java"
            import="java.sql.*"%>
        <jsp:useBean id="dao" class="com.pkh.dao.UserDao" scope="page" />
        <form name="form1" method="post" action="index.jsp" >
            <select name="select" onChange="submit()">
            <%
                String SQL="Select name From sysobjects Where xtype='u'and status>0";        //编写SQL语句
                ResultSet Rs=dao.selectStatic(SQL);                                    //执行查询操作
                String tablename="";
                while(Rs.next()){                                 //循环输出查询结果集中的数据
            %>
                <option value="<%=Rs.getString("name") %>" <%if
    (Rs.getString("name").equals(request.getParameter("select")))out.println("selected"); %>> <%=Rs.getString("name") %></option>
            <%  }
                Rs.first();
                if (request.getParameter("select")=="")
                    tablename=Rs.getString("name");
                else
                    tablename=request.getParameter("select");
            %>
            </select>
        <table width="99" height="32" border="0" cellpadding="0" cellspacing="0">
            <tr>
            <%
                SQL="Select case when c.colid=1 then  o.name end表名,"+
                    "c.ColId字段编号,c.name字段名,c.length字段长度,t.name字段类别,"+
                    "p.value描述,case when c.isnullable=0 then'1'end是否为空,"+
                    "c.scale小数位数,REPLACE(REPLACE(REPLACE(m.text,'(',''),')',''),'''','') 默认值,"+
                    " case when ("+
                        "Select Count(*)From SysObjects where name in("+
                        "Select name From Sysindexes Where id=c.id and indid in("+
                        "Select indid From Sysindexkeys  where id=c.id and colid in("+
                        "Select colid From Syscolumns where id=c.id and colid=c.colid)))and xtype='pk')>0"+
                        "then'1'end是否为主键"+
                        "From Sysobjects o"+
                        "left join Syscolumns c on o.id=c.id"+
                        "left join Sysproperties p on o.id=p.id and c.colid=p.smallid"+
                        "left join Systypes t on t.xtype=c.xtype"+
                        "left join Syscomments m on m.id=c.cdefault"+
                        "where(o.xtype='u'or o.xtype='v')and o.status>0 and o.name='"+tablename+"'"+
                        "order by o.name,c.colid";                    //编写SQL语句,查询指定数据表的详细信息
                        Rs=dao.selectStatic(SQL);                     //执行查询语句
                        ResultSetMetaData Rsmd=Rs.getMetaData();
                        for(int i=2;i<Rsmd.getColumnCount();i++){     //通过for循环输出查询结果
                    %>
                    <td width="99"nowrap bgcolor="#660066"><div align="center"class="style2">
                        <%=Rsmd.getColumnName(i)%></div></td>
                <%  }    %>
                </tr>
                <%
                    while(Rs.next()){
                %>
                <tr>
                <%
                for (int i=2;i<Rsmd.getColumnCount();i++){
                %>
                    <td nowrap bgcolor="#66CCFF"><div align="center"class="style3">
                        <%=Rs.getString(Rsmd.getColumnName(i))%>
                    </div></td>
                <%  }    %>
                </tr>
                <%  }   %>
            </table>
          </form>

举一反三

根据本实例,读者可以:

显示指定数据表中的数据结构;

分页显示数据表的结构信息;

修改数据表的结构信息。

实例108 在线维护投票数据库

本实例是一个实用性强的程序

实例位置:光盘\mingrisoft\04\108

实例说明

通过网站投票模块可以使创建者或管理人员了解访问者对该网站的评价。运行程序,在“添加备选答案”文本框中输入所要添加的字段名称,然后单击“添加”按钮,字段添加成功。在“删除备选答案”下拉列表中选择一个要删除的字段,单击“删除”按钮,字段删除成功,如图4.72所示。

图4.72 在线维护投票数据库

技术要点

本实例主要使用ALTER TABLE语句中的ADD和DROP子句。

(1)ADD子句。

向数据表中添加字段。

语法:

        ALTER TABLE table
        ADD [ < column_definition > ] | column_name AS computed_column_expression

参数说明:

● table:添加字段的数据表名称。

● column_definition:字段的定义。

● column_name:字段的名字。

● computed_column_expression:计算字段的表达式。

(2)DROP子句。

删除数据表中的字段。

语法:

        ALTER TABLE table
        DROP constraint_name

参数说明:

● table:需要删除字段的数据表名。

● constraint_name:需要删除字段的名称。

实现过程

(1)创建UserDao类,定义连接、查询和关闭数据库的方法。

(2)创建index.jsp页面。首先,通过JavaBean标签调用UserDao类,添加form表单,执行UserDao类中的selectStatic()方法,将查询结果集中的投票选项作为单选按钮的值;然后,创建文本框,用于提交投票的备选答案;最后,将查询结果集中的投票选项输出到下拉列表中,用于实现删除指定投票选项的操作。这里将文本框、下拉列表和单选按钮的值都提交到Create_DataBase类中。关键代码如下:

        <%@ page contentType="text/html; charset=gbk" language="java" import="java.sql.*" errorPage="" %>
        <jsp:useBean id="dao" class="com.pkh.dao.UserDao" scope="page"/>
        <form name="form1" method="post" action="Create_DataBase">
        <%
            ResultSet Rs=dao.selectStatic("Select Top 1*From tb_Tou");     //执行查询投票选项的操作
            ResultSetMetaData Rsmd=Rs.getMetaData();                    //获取查询结果
            for(int i=2;i<=Rsmd.getColumnCount();i++){                  //循环输出查询结果
        %>
        <tr>
            <td width="115"><div align="center"><%=Rsmd.getColumnName(i) %></div></td>
            <td width="117"><div align="left">
                <input type="radio" name="radiobutton" value="<%=Rsmd.getColumnName(i) %>">
            </div></td>
        </tr>
        <%  }   %>
        <tr>
            <td width="113" height="23" nowrap><div align="right">添加备选答案:</div></td>
            <td width="131"><div align="left">
                <input name="tadd" type="text" id="tadd" size="15">
            </div></td>
            <td><input name="Submit" type="submit" id="Submit" value="添加"></td>
        </tr>
        <tr>
            <td height="23"><div align="right">删除备选答案:</div></td>
            <td><div align="left">
                <select name="sdelete" id="sdelete">
                <%
                    for(int i=2;i<=Rsmd.getColumnCount();i++){    //将查询结果循环输出到下拉列表中
                %>
                    <option value="<%=Rsmd.getColumnName(i)%>"><%=Rsmd.getColumnName(i)%></option>
                <%  }    %>
                </select>
                </div></td>
                <td><input name="Submit" type="submit" id="Submit" value="删除"></td>
            </tr>
        </form>

(3)创建Servlet类Create_DataBase,定义doPost()方法,完成投票选项的添加、修改和删除操作。关键代码如下:

        public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
            PrintWriter out = response.getWriter();
            UserDao dao = new UserDao();
            String btn = request.getParameter("Submit");
            String SQL = "";
            if(btn.equals("投票")){                                      //执行投票添加的操作
                String tou = request.getParameter("radiobutton");
                if (tou.length() > 0) {
                    SQL="insert tb_Tou("+tou+")values(1)";                //编写添加语句
                    dao.CreateDataBase(SQL);
                    out.println("<script >alert('投票成功!'); window.location.href='index.jsp';</script>");
                }
            }else if(btn.equals("添加")){                                 //添加投票选项
                String add = request.getParameter("tadd");
                if (add.length() > 0) {
                    SQL="ALTER TABLE tb_Tou ADD"+add+"bit";                 //编写添加语句
                    dao.CreateDataBase(SQL);
                    out.println("<script >alert('创建成功!'); window.location.href='index.jsp';</script>");
                }
            }else if(btn.equals("删除")){                                 //删除投票选项
                String del = request.getParameter("sdelete");
                if (del.length() > 0) {
                    SQL="ALTER TABLE tb_Tou DROP COLUMN"+del;                编写删除语句
                    dao.CreateDataBase(SQL);
                    out.println("<script >alert('删除成功!'); window.location.href='index.jsp';</script>");
                }
            }
        }

(4)创建search.jsp页面,输出投票结果。

        <%@ page contentType="text/html; charset=gbk" language="java" import="java.sql.*" errorPage="" %>
        <jsp:useBean id="dao" class="com.pkh.dao.UserDao" scope="page"/>
        <%
            ResultSet Rs = dao.selectStatic("Select top 1 * From tb_Tou");
            ResultSetMetaData Rsmd = Rs.getMetaData();
            for (int i=2;i<=Rsmd.getColumnCount();i++){
        %>
        <tr>
            <td width="85"><div align="center"><%=Rsmd.getColumnName(i) %></div></td>
        <%
            ResultSet RSCount = dao.selectStatic("Select count(*) Count From tb_Tou Where "+Rsmd.getColumnName(i)+"=1");
            RSCount.next();
        %>
            <td width="129"><div align="center"><%=RSCount.getString(1) %></div></td>
        <%  }    %>

(5)修改工程根目录下WEB-INF文件夹下的web.xml文件,配置Create_DataBase类。

举一反三

根据本实例,读者可以:

在网站后台维护数据表结构;

修改临时表结构;

更改表字段备注信息。