Posts Tagged ‘ac’

.NET中防止Access数据库下载

星期二, 06月 3rd, 2008

如何防止Access数据库下载是一个很老de话题了,网上de讨论也比较多.在这里只是探讨ASP.NET下防止Access数据库被下载de方法,有些是对以前方法de总结,部分是自己原创.其中可能有不完善甚至不正确de地方,欢迎大家指出,一同进步.

目前de解决方案主要有以下几种:

1. 把数据库文件放置到站点目录之外

2. 设置存放数据库文件deIIS目录权限为不可读取(IIS信息服务管理->选择需要设置目录->右键->属性->目录选项卡->取消读取复选框)

3. 采用ODBC数据源

以上三种方法都比较经典也比较安全,适合能对服务器直接操作de情况(因为三种方法都需要直接操作服务器进行设置),当然这也是ASP平台下防止Access被下载de解决方案.

ASP平台下还有一种解决办法,那就是在数据库中添加一个长二进制表,然后把文件后缀修改为.asp.(详情可参照动网论坛数据库de相应数据表)

4. 将您de Access 重命名 *.asax:因为 ASP.NET de处理机制中,默认情况下,对这样de请求是直接拒绝de,并不会有思归提到de解析过程耗费资源等问题.按照这个思路,其实还可以把 Access 重命名为 *.config,*.vb, *.cs 等等.

5. 将您de Access 放在您de应用程序根下 bin 目录(也就是您放置 DLL 文件de那个目录)中:已经发现,IIS 默认被配置为拒绝直接访问 bin 目录中de文件,用以保护对 DLL de请求,事实上也同时保护了放在 bin 目录中其他文件.但是对于这种方法,有人提出疑问: 会不会有这样de后果,数据库读写时会造成程序集被频繁de刷新,也会Session和Application不断丢失

6. (个人原创)另外一种方法是利用.NETde访问权限控制达到禁止匿名用户下载数据库de目de,具体如下:

打开配置文件Web.config,在configuration节点下添加如下一段配置:

<location path="DataBase">

<system.web>

<authorization>

<deny users="*" />

</authorization>

</system.web>

</location>

DataBase是您de数据库文件存放目录,如果是根目录则用<locateon path=”~/database.aspx”>替换即可.添加了上述配置后再把数据库后缀修改为.aspx等需要经过IIS解析de文件类型即可.

因为<deny users="*" />语句限制任何匿名用户访问路径path="DataBase"下de所有需要解析de文件.

注意:无论是ASP中还是.NET下,对于直接把Access数据库后缀直接改为.asp和.aspx,或者在文件名前面添加“#”或文件名中加入空格,用FlashGet照下不误.

ASP.NET技巧:access下的分页方案

星期二, 06月 3rd, 2008

具体不多说了,只贴出相关源码~

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Web;

/**//// <summary>
/// 名称:access下de分页方案(仿sql存储过程)
/// 作者:cncxz(虫虫)
/// blog:http://cncxz.cnblogs.com
/// </summary>
public class AdoPager
{
protected string m_ConnString;
protected OleDbConnection m_Conn;

public AdoPager()
{
CreateConn(string.Empty);
}
public AdoPager(string dbPath)
{
CreateConn(dbPath);
}

private void CreateConn(string dbPath)
{
if (string.IsNullOrEmpty(dbPath))
{
string str = System.Configuration.ConfigurationManager.AppSettings["dbPath"] as string;
if (string.IsNullOrEmpty(str))
str = “~/App_Data/db.mdb”;
m_ConnString = string.Format(@”Provider=Microsoft.Jet.OLEDB.4.0;Data source={0}”, HttpContext.Current.Server.MapPath(str));
}
else
m_ConnString = string.Format(@”Provider=Microsoft.Jet.OLEDB.4.0;Data source={0}”, dbPath);

m_Conn = new OleDbConnection(m_ConnString);
}
/**//// <summary>
/// 打开连接
/// </summary>
public void ConnOpen()
{
if (m_Conn.State != ConnectionState.Open)
m_Conn.Open();
}
/**//// <summary>
/// 关闭连接
/// </summary>
public void ConnClose()
{
if (m_Conn.State != ConnectionState.Closed)
m_Conn.Close();
}

private string recordID(string query, int passCount)
{
OleDbCommand cmd = new OleDbCommand(query, m_Conn);
string result = string.Empty;
using (IDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
if (passCount < 1)
{
result = “,” dr.GetInt32(0);
}
passCount–;
}
}
return result.Substring(1);
}


/**//// <summary>
/// 获取当前页应该显示de记录,注意:查询中必须包含名为IDde自动编号列,若不符合您de要求,就修改一下源码吧 :)
/// </summary>
/// <param name=”pageIndex”>当前页码</param>
/// <param name=”pageSize”>分页容量</param>
/// <param name=”showString”>显示de字段</param>
/// <param name=”queryString”>查询字符串,支持联合查询</param>
/// <param name=”whereString”>查询条件,若有条件限制则必须以where 开头</param>
/// <param name=”orderString”>排序规则</param>
/// <param name=”pageCount”>传出参数:总页数统计</param>
/// <param name=”recordCount”>传出参数:总记录统计</param>
/// <returns>装载记录deDataTable</returns>
public DataTable ExecutePager(int pageIndex, int pageSize, string showString, string queryString, string whereString, string orderString, out int pageCount, out int recordCount)
{
if (pageIndex < 1) pageIndex = 1;
if (pageSize < 1) pageSize = 10;
if (string.IsNullOrEmpty(showString)) showString = “*”;
if (string.IsNullOrEmpty(orderString)) orderString = “ID desc”;
ConnOpen();
string myVw = string.Format(” ( {0} ) tempVw “, queryString);
OleDbCommand cmdCount = new OleDbCommand(string.Format(” select count(0) as recordCount from {0} {1}”, myVw, whereString), m_Conn);

recordCount = Convert.ToInt32(cmdCount.ExecuteScalar());

if ((recordCount % pageSize) > 0)
pageCount = recordCount / pageSize 1;
else
pageCount = recordCount / pageSize;
OleDbCommand cmdRecord;
if (pageIndex == 1)//第一页
{
cmdRecord = new OleDbCommand(string.Format(”select top {0} {1} from {2} {3} order by {4} “, pageSize, showString, myVw, whereString, orderString), m_Conn);
}
else if (pageIndex > pageCount)//超出总页数
{
cmdRecord = new OleDbCommand(string.Format(”select top {0} {1} from {2} {3} order by {4} “, pageSize, showString, myVw, “where 1=2″, orderString), m_Conn);
}
else
{
int pageLowerBound = pageSize * pageIndex;
int pageUpperBound = pageLowerBound - pageSize;
string recordIDs = recordID(string.Format(”select top {0} {1} from {2} {3} order by {4} “, pageLowerBound, “ID”, myVw, whereString, orderString), pageUpperBound);
cmdRecord = new OleDbCommand(string.Format(”select {0} from {1} where id in ({2}) order by {3} “, showString, myVw, recordIDs, orderString), m_Conn);

}
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(cmdRecord);
DataTable dt=new DataTable();
dataAdapter.Fill(dt);
ConnClose();
return dt;
}
}

还有调用示例:html相关代码

<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”Default.aspx.cs” Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>

<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
<title>分页演示</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<br />
转到第<asp:TextBox ID=”txtPageSize” runat=”server” Width=”29px”>1</asp:TextBox>页<asp:Button ID=”btnJump” runat=”server” Text=”Go” OnClick=”btnJump_Click” /><br />
<asp:GridView ID=”GridView1″ runat=”server” CellPadding=”4″ ForeColor=”#333333″ GridLines=”None” Width=”90%”>
<FooterStyle BackColor=”#507CD1″ Font-Bold=”True” ForeColor=”White” />
<RowStyle BackColor=”#EFF3FB” />
<EditRowStyle BackColor=”#2461BF” />
<SelectedRowStyle BackColor=”#D1DDF1″ Font-Bold=”True” ForeColor=”#333333″ />
<PagerStyle BackColor=”#2461BF” ForeColor=”White” HorizontalAlign=”Center” />
<HeaderStyle BackColor=”#507CD1″ Font-Bold=”True” ForeColor=”White” />
<AlternatingRowStyle BackColor=”White” />
</asp:GridView>
</div>
<asp:Label ID=”Label1″ runat=”server” Text=”Label”></asp:Label>
</form>
</body>
</html>

示例decodebehind相关代码

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;

public partial class _Default : System.Web.UI.Page
{
private AdoPager mm_Pager;
protected AdoPager m_Pager
{
get{
if (mm_Pager == null)
mm_Pager = new AdoPager();
return mm_Pager;
}
}
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
LoadData();
}
private int pageIndex = 1;
private int pageSize = 20;
private int pageCount = -1;
private int recordCount = -1;

private void LoadData()
{
string strQuery = “select a.*,b.KindText from tableTest a left join tableKind b on a.KindCode=b.KindCode “;
string strShow = “ID,Subject,KindCode,KindText”;
DataTable dt = m_Pager.ExecutePager(pageIndex, pageSize, strShow, strQuery, “”, “ID desc”, out pageCount, out recordCount);
GridView1.DataSource = dt;
GridView1.DataBind();
Label1.Text = string.Format(”共{0}条记录,每页{1}条,页次{2}/{3}”,recordCount,pageSize,pageIndex,pageCount);
}

protected void btnJump_Click(object sender, EventArgs e)
{
int.TryParse(txtPageSize.Text, out pageIndex);
LoadData();
}
}

ASP.NET数据库编程之Access连接失败

星期二, 06月 3rd, 2008

  错误和失败总会不可避免地在应用程序中出现.如果有人在MDB目录之上又添加了一级新de文件夹而“更新”了服务器de目录树,那么将会发生什么?如果MDB名称被更改了会怎样?如果MDB文件被损坏又该如何呢?以上每一个问题都将阻止对数据de成功连接并导致一个失败页面.好de编程实践表明需要尽可能小心地对待任何失败.
  在讨论实际命令之前,我需要了解de是AccessDataSource控件派生于SqlDataSource控件.在大多数情况下,这只是一个背景问题.但是当处理异常de时候,就必须使用实际上存在于(从而以之命名de)SQL数据源对象之中de对象.
  软着陆de技术使用de相关代码将在AccessDataSource控件经历OnSelected event时被触发.当GridView从数据源控件请求数据时,这个事件将会在内部触发. 处理连接错误de相关代码就会检查到从数据源控件传递过来de异常参数.AccessDataSource控件没有关于这个参数de自己de名称,所以只能使用名称SqlDataSourceStatus- EventArguments.如果异常参数为空,那么表示什么事情都没有发生.如果异常参数有一个值,那么将检查这个值.如果参数是OLEDB Exception类型de,那么页面上de警告标签de文本将会有提示信息.再次提醒您注意术语de使用.如果有一个AccessException类型,那将更明了,可惜实际上没有这种类型.可以使用更加普通deOleDbException对象并以处理异常de命令结束脚本.这样将允许GridView继续呈现,虽然没有数据,并防止出现浅褐色背景de常规ASP.NET 2.0失败页面.因为GridView没有得到任何数据,所以它将会显示一个替换表格,表格中只有一个在其EmptyDataText属性中显示消息de单元格.
  如果您在进行这些步骤中遇到困难,千万不要感到悲观;下一个练习将会进行示范.而现在,只需将相关代码剪切并粘贴到页面之中.在本书de后面,我将会讨论如何创建一个用于连接失败情况下deGridViewde替换页面以及处理错误事件de详细内容.
  试一试#4—— 处理AccessDataSource连接失败
  (1) 在ch02文件夹中,创建一个名为TIO-4-ConnectionFailure-CS.aspxde文件.在Design视图中,添加一个指向Northwind deAccessDataSource控件至页面,该控件从表中选择了所有列.
  (2) 添加GridView用来显示数据源控件中de信息.同样,添加一个标签控件,并将其命名为“Message”.
  (3) 现在切换至Source视图并对标记作一些修改,如下突出显示相关代码所示.如果其中有<columns>标记部分,则将其删除.留下de相关代码应当如下所示:
<html>
<head id=”Headl” runat=”server”>
<title>Chapter 2 TIO #4 Connection Failure to Access in C#</title>
</head>
<body>
<h3>Chapter 2 TIO #4 Connection Failure to Access in C#</h3>
<form id=”forml” runat=”server”>
<asp:label ID=”Message” runat=”server”/><br/><br/>
<asp:gridview id=”GridViewl” runat=”server”
datasourceid=”AccessDataSourcel”
AutoGenerateColumns=”true”
EmptyDataText=”No data records were returned” />
<asp:AccessDataSource ID=”AccessDataSourcel” Runat=”server”
selectcommand=”Select * From Products”
datafile=”~/App_Data/Northwind.mdb”
OnSelected=”AccessDataSourcel_Selected”
/>
</form>
</body></html>
  (4) 检查页面;在查看由Northwind售出de产品de时候,不应该出现问题.
  (5) 现在将添加相关代码来处理连接问题了.转到页面de顶部并进入如下脚本.第一个示例用C#编写,第二个示例用VB编写.进入其中之一即可.
<%@ page language=”C#” %>
<script runat=”server”>
void AccessDataSourcel_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
 if (e.Exception != null)
 {
  if(e.Exception.GetType()==typeof(System.Data.OleDb.OleDbException))
  {
   Message.Text = “There was a problem opening a connection to the
   database. Please contact the system administrator for this site.”;
   //Optionally set GridViewl.Visible = false;
   e.ExceptionHandled = true;
  }
 }
}
</script>
<html> …
  以下是用VB编写de脚本.
<%@ Page Language=”VB” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”
“http://www.w3.org/TR/xhtmlll/DTD/xhtmlll.dtd”>
<script runat=”server”>
Sub AccessDataSourcel_Selected(ByVal sender As Object, ByVal e As
SqlDataSourceStatusEventArgs)
 If (Not e.Exception Is Nothing) Then
  If TypeOf e.Exception Is System.Data.OleDb.OleDbException Then
   Message. Text = “There was a problem opening a connection to the database. Please contact the system administrator for this site.”
   ’ Optionally set GridViewl.Visible = false
   e.ExceptionHandled = True
  End If
 End If
End Sub
</script>
<html> …


  (6) 保存并运行页面.因为我实际de连接还保持完好,所以现在还没有任何问题.关闭浏览器.
  (7) 现在将NorthwinddeMDB文件从\App_Data移动至C:\Temp文件夹中,这样连接将会失败.或者,可以修改相关代码来尝试连接Southwind.mdb.运行页面并注意浏览器将显示一个得体de失败信息.
  (8) 如果移动了Northwind.mdb,那么将其再移动回C:\BegAspNetDb\ App_ Data文件夹中.
  示例说明#4—— 处理AccessDataSource连接失败
  首先,请回想一下AccessDataSource控件是SqlDataSourcede派生物,并且使用了应用于OLEDB数据源de一系列异常,所以当引用了带有SQL或者OLEDB名称而不是Access名称de对象时,请不要惊讶.
  请观察在页面上进行de处理连接失败de三个修改.第一,添加了GridView数据源控件de一个属性,该属性在GridView没有从数据源控件中获得任何数据时将会显示一条消息.第二,添加了数据源控件de一个属性,该属性在OnSelected事件发生时调用Data_Selected事件处理程序.请注意这处于DataSource事件中.虽然用户没有直接选择 AccessDataSource控件(也没有向用户呈现),但是当GridView向数据源控件请求数据时,选择还是在内部发生了.第三,您编写了这段脚本.
  该脚本将会接收到几个参数,其中之一就是异常.这里没有名为AccessDataSourceStatusEventArgsde对象.但是,可以获得一个内部派生出 Access- DataSource de基本对象:SQL DataSource.SqlDataSource对象具有可以提交至AccessDataSource控件de状态参数.如果没有问题,则异常列表为空.如果有一个异常,那么相关代码将会进行测试来查看抛出de异常是什么类型.同样地,也没有像Access Exception一样de对象.但是,AccessDataSource将异常放入更加普通de称为OleDb Exceptionde对象中.假定在这个集合中de所有异常都是由连接失败造成de.我de相关代码将作出反应,反馈一些友好de失败通告到名为Messagede标签上.
  这段相关代码中de最大de窍门就是始终让对象使用了三个不同de名称.使用了一个Access文件(MDB)作为数据源并使用AccessDataSource控件.但是使用了底层deSqlDataSource作为事件参数.最后,使用了普通deOLEDB异常集.很多错误都源于在所有de情况下都使用名为AccessdeASP.NET 2.0对象.

在JSP中访问Oracle数据库

星期一, 06月 2nd, 2008

写第一个连接OracledeJSP程序test.jsp
1、连入SQL*Plus
以system/manager用户登录,
SQL> conn system/manager
创建新de用户:如user1/pass1,赋予connect,resource权限.
SQL> grant connect,resource to user1 identified by pass1;
SQL> conn user1/pass1
SQL> create table test(a number,b char(10));
SQL> insert into test values(1,”一”);
SQL> insert into test values(2,”二”);
SQL> insert into test values(3,”三”);
SQL> commit;
SQL> select * from test;
A B
———- ———-
1 一
2 二
3 三
2、配置ODBC(在服务器端设置)
开始->设置->控制面板->管理工具->数据源 (ODBC)->系统DSN->添加->
选择“Oracle ODBC Driver”->完成->
Data Source Name:test名字随便取,好记就行,如:test
Service Name:oradb Oracle数据库de实例名,本例:oradb,一般Oracle默认安装为ORCL
UserID:user1 Oracle用户名,本例:user1
按“OK”->按“确定”退出
3、在C:\JBuilder4\tomcat\webapps\test下创建test.jsp,用notebook编辑,输入以下相关代码
<!–首先导入一些必要depackages–>
<%@ page info=”database handler”%>
<%@ page import=”java.io.*”%>
<%@ page import=”java.util.*”%>
<!–告诉编译器使用SQL包–>
<%@ page import=”java.sql.*”%>
<%@ page import=”javax.servlet.*”%>
<%@ page import=”javax.servlet.http.*”%>
<%
//以try开始
try
{
Connection con;
Statement stmt;
ResultSet rs;
//加载驱动程序,下面de相关代码为加载JDBD-ODBC驱动程序
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);
//用适当de驱动程序连接到数据库,test”是系统dsn名
String url=”jdbc:odbc:test”;
//建立连接,类似于ASP中de创建数据库联接
con=DriverManager.getConnection(url, “user1″, “pass1″);
//创建一个JDBC声明
stmt = con.createStatement();
//增加新记录
stmt.executeUpdate(”INSERT INTO test (a,b) VALUES (1,”2″)”);
//查询记录
rs = stmt.executeQuery(”SELECT a,b from test”);
//输出查询结果
out.println(”<table border=1 width=400>”);
while (rs.next())
{
String col1 = rs.getString(1);
String col2 = rs.getString(2);
//打印所显示de数据
out.println(”<tr><td>” col1 “</td><td>” col2 “</td></tr>”);
}
out.println(”</table>”);
}
//如果加载时出错,给出相应de错误信息
catch (Exception e) {}
%>
4、打开一个浏览器窗口,输入以下地址来查看运行结果
http://localhost:8080/test/test.jsp

通过JDBC连接oracle数据库的十大技巧

星期一, 06月 2nd, 2008

Java数据库连接(JDBC)API是一系列能够让Java编程人员访问数据库de接口,各个开发商de接口并不完全相同.在使用多年deOracle公司deJDBC后,我积累了许多技巧,这些技巧能够使我更好地发挥系统de性能和实现更多de功能.
  1、在客户端软件开发中使用Thin驱动程序
  在开发Java软件方面,Oraclede数据库提供了四种类型de驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中deJava存储过程等服务器端软件.在客户机端软件de开发中,我可以选择OCI驱动程序或Thin驱动程序.OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯.Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯.为了获得最高de性能,Oracle建议在客户端软件de开发中使用OCI驱动程序,这似乎是正确de.但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序de性能都超过了OCI驱动程序.
  2、关闭自动提交功能,提高系统性能
  在第一次建立与数据库de连接时,在缺省情况下,连接是在自动提交模式下de.为了获得更好de性能,可以通过调用带布尔值false参数deConnection类desetAutoCommit()方法关闭自动提交功能,如下所示:
  conn.setAutoCommit(false);
  值得注意de是,一旦关闭了自动提交功能,我就需要通过调用Connection类decommit()和rollback()方法来人工de方式对事务进行管理.
  3、在动态SQL或有时间限制de命令中使用Statement对象
  在执行SQL命令时,我有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象.无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次.当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译.这可能会使您认为,使用PreparedStatement对象比使用Statement对象de速度更快.然而,我进行de测试表明,在客户端软件中,情况并非如此.因此,在有时间限制deSQL操作中,除非成批地处理SQL命令,我应当考虑使用Statement对象.
  此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我可以将字符串连接在一起,建立一个有效deSQL命令.因此,我认为,Statement对象可以使动态SQL命令de创建和执行变得更加简单.
  4、利用helper函数对动态SQL命令进行格式化
  在创建使用Statement对象执行de动态SQL命令时,我需要处理一些格式化方面de问题.例如,如果我想创建一个将名字O’Reilly插入表中deSQL命令,则必须使用二个相连de“””号替换O’Reilly中de“’”号.完成这些工作de最好de方法是创建一个完成替换操作dehelper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建dehelper方法.与此类似de是,我可以让helper方法接受一个Date型de值,然后让它输出基于Oracledeto_date()函数de字符串表达式.
  5、利用PreparedStatement对象提高数据库de总体效率
  在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区.然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译.在缓冲区中可以发现预编译de命令,并且可以重新使用.在有大量用户de企业级应用软件中,经常会重复执行相同deSQL命令,使用PreparedStatement对象带来de编译次数de减少能够提高数据库de总体性能.如果不是在客户端创建、预备、执行PreparedStatement任务需要de时间长于Statement任务,我会建议在除动态SQL命令之外de所有情况下使用PreparedStatement对象.
  6、在成批处理重复de插入或更新操作中使用PreparedStatement对象
  如果成批地处理插入和更新操作,就能够显著地减少它们所需要de时间.Oracle提供deStatement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理.我可以使用addBatch()和executeBatch()方法选择标准deJDBC批处理,或者通过利用PreparedStatement对象desetExecuteBatch()方法和标准deexecuteUpdate()方法选择速度更快deOracle专有de方法.要使用Oracle专有de批处理机制,可以以如下所示de方式调用setExecuteBatch():
PreparedStatement pstmt3D null;
try {
((OraclePreparedStatement)
pstmt).setExecuteBatch(30);

pstmt.executeUpdate();
}

  调用setExecuteBatch()时指定de值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准deexecuteUpdate()方法就会被作为批处理送到数据库中.我可以通过调用PreparedStatement类desendBatch()方法随时传输批处理任务.
  7、使用Oracle locator方法插入、更新大对象(LOB)
  OracledePreparedStatement类不完全支持BLOB和CLOB等大对象de处理,尤其是Thin驱动程序不支持利用PreparedStatement对象desetObject()和setBinaryStream()方法设置BLOBde值,也不支持利用setCharacterStream()方法设置CLOBde值.只有locator本身中de方法才能够从数据库中获取LOB类型de值.可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOBde值.由于存在这二个问题,因此,我建议使用locatorde方法来插入、更新或获取LOBde值.
  8、使用SQL92语法调用存储过程
  在调用存储过程时,我可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际de好处,而且会给以后维护您de应用程序de开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92.
  9、使用Object SQL将对象模式转移到数据库中
  既然可以将Oraclede数据库作为一种面向对象de数据库来使用,就可以考虑将应用程序中de面向对象模式转到数据库中.目前de方法是创建Java bean作为伪装de数据库对象,将它们de属性映射到关系表中,然后在这些bean中添加方法.尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行de,因此其他访问数据库de应用软件无法利用对象模式.如果利用Oraclede面向对象de技术,可以通过创建一个新de数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己deJava bean类.如果使用这种方式,不但Java应用程序可以使用应用软件de对象模式,其他需要共享您de应用中de数据和操作de应用软件也可以使用应用软件中de对象模式.
  10、利用SQL完成数据库内de操作
  我要向大家介绍de最重要de经验是充分利用SQLde面向集合de方法来解决数据库处理需求,而不是使用Java等过程化de编程语言.
  如果编程人员要在一个表中查找许多行,结果中de每个行都会查找其他表中de数据,最后,编程人员创建了独立deUPDATE命令来成批地更新第一个表中de数据.与此类似de任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成.当能够在单一deSQL命令中完成任务,何必要让数据在网上流来流去de?我建议用户认真学习如何最大限度地发挥SQLde功能.

Apache Servlet Jsp环境设置(下)

星期一, 06月 2nd, 2008

(四)Tomcat
    1、用WinZIP等解压缩软件把tomcat.zip解压缩到一个目录下,我把它解压缩到C:\,它会自动
      创建tomcat子目录,这样在C盘就多了一个目录C:/tomcat,我用$TOMCAT标识;
    2、打开$APACHE_ROOT\conf\httpd.conf文件,在该文件最后加上类似这样一句话:
        Include $TOMCAT/etc/tomcat.conf
      在我这里为Include C:/tomcat/etc/tomcat.conf;
    3、修改Tomcat运行de端口号,注意Tomcat自己有一个独立deHTTP服务器,它必须使用一个还未被使用de端口号,我这里de8081还未被占用,我用$TOMCAT_PORT标识,分配给Tomcat:
        1)打开$TOMCAT/server.xml;
        2)修改ContextManager:
    4、双击$TOMCAT目录下destartup.bat来启动Tomcat;
    5、在浏览器上输入http://localhost:$TOMCAT_PORT/,能看到Tomcat Version 3.0这一页
      就表示Tomcat安装成功了;
    6、在浏览器上输入http://localhost:$APACHE_PORT/examples/servlets/,能看到
      Servlet Examples with Code这一页就表示Apache Servlet也成功了;
    7、在浏览器上输入http://localhost:$APACHE_PORT/examples/Jsp/,能看到Jsp Samples
      这一页就表示Apache Jsp也成功了.
附:
  JDK Download
    http://java.sun.com/products/jdk/1.2/
  Apache Server Download
    http://www.apache.org/dist/binaries/win32/apache_1_3_12_win32.exe
  Apache JServ Download
    http://jakarta.apache.org/builds/tomcat/release/v3.0/win32/ApacheModuleJServ.dll
  Tomcat Download
    http://jakarta.apache.org/builds/tomcat/release/v3.0/tomcat.zip
  Java(TM) 2 SDK 1.2.2-001 Installation Instructions
    http://java.sun.com/products/jdk/1.2/install-windows.html
  Tomcat FAQ
    http://jakarta.apache.org/cvsweb/index.cgi/jakarta-tomcat/src/doc/faq
  Tomcat Apache-HOWTO
    http://jakarta.apache.org/cvsweb/index.cgi/jakarta-tomcat/src/doc/Tomcat+Apache-HOWT

Apache Servlet Jsp环境设置(中)

星期一, 06月 2nd, 2008

(二)Apache Server
    1、双击apache_1_3_12_win32.exe文件进行安装,使用缺省配置进行安装,缺省安装目录为:
      C:\Program Files\Apache Group\Apache,我用$APACHE_ROOT来代替安装目de地;
    2、修改$APACHE_ROOT\conf\httpd.conf:
       1)PORT
         设置Apache Web Server运行时使用de端口号,由于我这里deIIS也在运行,IIS使
         用了80端口号,于是我把它改成Port 8080,以后在浏览器上输入
         http://localhost:8080/才能访问到Apache Web Server服务器,输入
         http://localhost/时能访问到IIS,这样两个Web Server都可以用了哦,我用
$APACHE_PORT标识;
        2)DocumentRoot
         设置文档根目录,当您在浏览器上输入http://localhost:$APACHE_PORT/时,服
         务器会从文档根目录读取数据,由于我de程序都放在D:\HZQ下,所以我把
         DocumentRoot设置为D:/HZQ;
    3、Apache安装完后在"开始->程序"菜单组中多了Apache Web Server菜单组,运行其中de
      Install Apache as a service,这样de话在"开始->设置->控制面板->服务"中就
      多了一个名为Apachede服务,您可以用它来启动或停止Apache服务;
    4、打开"开始->设置->控制面板->服务",选中Apache这个服务,按"开始"启动Apache
      服务;
    5、我在浏览器上输入http://localhost:$APACHE_PORT/,就看到了D:\HZQ下de所有文件,
      这时表明Apache服务已经安装成功.
  (三)Apache JServ
    1、把ApacheModuleJServ.dll文件拷贝到$APACHE_ROOT\modules目录下;
    2、修改$APACHE_ROOT\conf\httpd.conf:
        在该文件中加上LoadModule jserv_module modules/ApacheModuleJServ.dll以
        启动Apache JServ;
    3、重新启动Apache服务.

Apache Servlet Jsp环境设置(上)

星期一, 06月 2nd, 2008

本文只讨论如何在Windows NT 4.0上安装Apache Servlet Jsp.本文中de配置情况如下:
Windows NT 4.0
jdk1_2_2-001-win.exe
apache_1_3_12_win32.exe
ApacheModuleJServ.dll
tomcat.zip(3.0)
一. 软件下载
  JDK
    http://java.sun.com/products/jdk/1.2/
  Apache Server
    http://www.apache.org/dist/binaries/win32/apache_1_3_12_win32.exe
  Apache JServ
    http://jakarta.apache.org/builds/tomcat/release/v3.0/win32/ApacheModuleJServ.dll
  Tomcat
    http://jakarta.apache.org/builds/tomcat/release/v3.0/tomcat.zip
二. 软件安装
  (一)JDK
    1、双击jdk1_2_2-001-win.exe文件进行安装,使用缺省配置进行安装,JDKde缺省安装目录为;
      C:\jdk1.2.2,JREde缺省安装目录为C:\Program Files\JavaSoft\JRE\1.2;
    2、重启计算机;
    3、更新下列环境变量:把C:\jdk1.2.2\bin目录追加到PATH中;把
      C:\jdk1.2.2\lib\tools.jar;C:\jdk1.2.2\lib\dt.jar加入到CLASSPATH中.更新
      方法:控制面板->系统->环境->系统变量;
    4、测试applet:
       1)打开command窗口;
       2)切换到C:\jdk1.2.2\demo\applets\TicTacToe目录;
       3)运行appletviewer example1.htm;
       4)一切正常;
    5、测试application:
        1)在我deD:\HZQ\Java目录下创建一个test.java文件,内容如下:
          public class test
          {
           public static void main(String arc[]){
           System.out.println("JDK安装成功了,朋友!");
           }
          };
       2)打开command窗口;
       3)切换到D:\HZQ\Java目录;
       4)运行javac test.java进行编译;
       5)运行java test运行这个程序;
       6)一切正常.

JSP中的字符替换函数 str

星期一, 06月 2nd, 2008

//
// StrReplace.java
//
package forum;
import java.util.*;
/**
* Title:
* Description:
* Copyright: Copyright (c) 2001
* Company:
* @author
* @version 1.0
*/
public class StrReplace {
public StrReplace() {
}
public String str_replace(String from,String to,String source)
{
StringBuffer bf= new StringBuffer("");
StringTokenizer st = new StringTokenizer(source,from,true);
while (st.hasMoreTokens())
{
String tmp = st.nextToken();
System.out.println("*" tmp);
if(tmp.equals(from))
{
bf.append(to);
}
else
{
bf.append(tmp);
}
}
return bf.toString();
}
}

// 使用方法
<jsp:useBean id="replace" scope="page" class="forum.StrReplace" />
<%= replace.str_replace("<","^","<h1>123456</h1>") %>

JSP教程(四)-JSP Actions的使用

星期一, 06月 2nd, 2008

JSP actions 使用您可以动态de插入一个文件,重用JavaBeans组件,前进到另一个页面,或为Java 插件生成一个HTML.可以使用deaction 有:
(1) jsp:include –在页面被请求时包含进一个文件.
(2) jsp:useBean–找到或实例化一个JavaBean.
(3) jsp:setProperty–设置一个JavaBean属性.
(4) jsp:getProperty–将JavaBeande属性插入到输出.
(5) jsp:forward–让请求者可以向前到一个新de页面.
(6) jsp:plugin–用OBJECT或EMBED标签为Java plugins生成特定de浏览器de相关代码.
  1、jsp:include Action
  这个action使您可以在即将生成de页面上包含进一些文件:
  <jsp:include page="relative URL" flush="true" />
  与include directive不同,这个action是在页面被请求时才将文件包含进来,而,include directive则是在JSP页面被转换为servlet时包含文件.为了提高效率,include action做了一点小小de牺牲,即,它不允许被包含de页面含有一般deJSP相关代码(例如,不可设置HTTP头),但是,它具有显著de灵活性,如下面deJSP 相关代码,它实现将四个不同de片段插入如下de页面.每一次当标题改变de时候,您仅需修改这四个文件而无须更改主要deJSP 页面.
WhatsNew.jsp
<HTML>
<HEAD>
<TITLE> JSP教程</TITLE>
<BODY >
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE"> What"s New at Chinese comic sites</TABLE>
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>
  当然您可以定义自己deHTML文件,但有一点请注意:
  您应该将文件放到您deJSP目录下denews目录内.