Posts Tagged ‘据库’

在asp.net中操作sql server数据库的一些小技巧

星期二, 06月 3rd, 2008

1.给数据库语句参数传递

向数据库操作语句传递参数可以通过存储过程实现,这里给出另外两种简便易捷de方法:

可以在C#中通过字符串操作将参数直接传入SQL语句变量中,例如:

string s=”Davolio”;

string sql= “select * from employees where LastName=” “‘” s “‘”

相当于写入SQL语句:

select * from employees where LastName=’Davolio’
也可以通过thisCommand.Parameters.Add()方法实现,如下所示:

string s=”Davolio”;


SqlConnection thisConnection=new SqlConnection

(”Data Source=(local);Initial Catalog=Northwind;UID=sa;PWD=”);

thisConnection.Open ();

SqlCommand thisCommand=thisConnection.CreateCommand ();


thisCommand.CommandText =

” select * from employees where LastName=@charname“;

thisCommand.Parameters.Add(”@charname”,s);


可以看到,字符串s将参数“Ddbolio”传递给数据库操作语句中de参数charname.

2.将数据库中不同表内de数据读入到数据集DataSet中

SqlDataAdapterdeFill方法可以填充已知数据集,并且为每个填充项创建一个临时表,可以通过对该表de访问来读取数据集中de相关数据.其相关操作如下所示:


SqlConnection thisConnection=new SqlConnection

(”Data Source=(local);Initial Catalog=Northwind;UID=sa;PWD=”);

try

{

thisConnection.Open ();

}

catch(Exception ex)

{

thisConnection.Close ();

}

string sql1=”select * from employees”;

string sql2=”select * from Customers”;

SqlDataAdapter sda=new SqlDataAdapter(sql1,thisConnection);

DataSet ds= new DataSet();

sda.Fill(ds,”myemployees”);

sda.Dispose();

SqlDataAdapter sda1=new SqlDataAdapter(sql2,thisConnection);

sda1.Fill(ds,”myCustomers”);

sda1.Dispose();


string t1=ds.Tables["myemployees"].Rows[0]["Hiredate"].ToString();

string t2=ds.Tables["myCustomers"].Rows[0]["ContactTitle"].ToString();

Page.RegisterStartupScript(”aa”,”<script language=javascript>alert(’t1=” t1 “,t2=” t2 “‘);</script>”);


可以看到,在数据集ds中新生成了两个临时表“myemployees”和“myCustomers”.为验证这两个表中数据确实已读入数据集ds中,通过数据读取操作将表“myemployees”中对应于属性“Hiredate”de第一行赋值给字符型变量t1,将表“myCustomers”中对应于属性“ContactTitle”de第一行赋值给字符型变量t2,并通过JavaStript函数“alert()”将这些变量显示到弹出窗口中.Page.RegisterStartupScript方法用于发出客户端脚本块,其第一个参数为标志位,用户可以任意选取,第二个参数为JavaScript脚本,这里alert函数用来弹出MessageBox对话框,我将参数t1和t2传入该脚本中,使其在MessageBox中显示出来.

ps:由于网络速度太慢,不能将相关de显示图表传到服务器,真一大遗憾.还有不知道编写相关代码de样式和格式,使得给出de相关代码显得很零乱.

.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与MySQL数据库简明图示入门教程

星期二, 06月 3rd, 2008

  作者: CRYSTAL编译

  在ASP时代,如果我要建立一个数据库驱动deweb站点,那么您可以选择环很多钱de微软SQL SERVER数据库或者选择要花很多时间来寻找达到性能和稳定性统一deACCESS数据库,但在.NET时代您有另一种选择,那就是:MySQL数据库
  什么是MySQL数据库?
  MySQL数据库是一种开放源相关代码de数据库,通过获得授权来保持源相关代码de官方支持,同时可以自由修改源相关代码,目前许多公司和组织都采用了这种数据库.对此详细信息您可以访问MySQLde官方站点.
  第一步 下载和安装
  与大多数软件一样,首先是得到并安装mysql数据库软件,获得Mysql数据库de方很简单,在mysql.com/downloads/index.html”>http://dev.mysql.com/downloads/index.html . 上可以自由下载,本文采用de是Mysql4.1,当然读者也可以下在其他版本,不过我要推荐给读者de是最好下载预编译de二进制de文件.我de操作平台是Windwos XP,所以我选择de是包括安装文件deWindows版,这个版本大约35M,所以下载de时间不是很长,除非您de网络有问题.
  安装非常简单,按照安装步骤不会导致任何问题,如下图:


MySQL Server安装

MySQL Server安装

MySQL Server安装

MySQL Server安装

  如图所示,在安装完成de最后一步,系统会问您是否要配置MySQL服务器,如果选择现在配置MySQL服务器,那么系统将自动运行MySQL实例配置向导,于是您将进入下一步.

  第二步 配置
  MySQL服务器实例配置向导使配置服务器变得非常简单,按照配置向导一步一步de走,绝大多数时候都选择缺省配置.


MySQL服务器配置向导

MySQL服务器配置向导

  如上图,读者可以自行选择是安装在专用de数据库服务器上或是共享de服务器,由于我使用de笔记本电脑,所以我选择是最简单de”Developer Machine”,这个设置不能提供同样de性能,而且也不能使用很多系统资源

MySQL服务器配置向导—选择数据库de用途

MySQL服务器配置向导—指定TCP/IP和端口号

  必须确保响应TCP/IP网络协议,以保证Web页载需要de时候Web服务器能连接数据库;如果您de数据库和web服务器安装在同一台服务器上,那么可以禁用这个选项以防止来自网络de访问.
  MySQL服务器配置向导—设置默认字符串类型


MySQL服务器配置向导

MySQL服务器配置向导—安装服务

MySQL服务器配置向导—设置SQL连接密码

MySQL服务器配置向导—即将完成配置

  第三步 MySQL Administrator
  也许您认为可以不需要这个东西,但我还是要建议您下载并使用MySQL Administrator,它提供图形界面以帮助您管理MySQL数据库,Windows用户可以通过命令提示行运行MySQL Administrator,在余下时间里我假定您已经安装了MySQL Administrator,并且将使用相关图例.


MySQL Administrator主界面


  第四步 创建数据库
  要创建数据库,我必须首先连接服务器.运行MySQL Administrator并登陆服务器.


运行MySQL Administrator并登陆服务器


  选择MySQL Administrator左侧底部de”Catalogs”,然后在管理器de右侧会出现目前服务器上已经有de数据库目录,右击Schema窗口de”mysql“,选择”Create New Schema”.


创建一个新de数据库


  系统将提示您输入数据库de名称,这里我使用”mydatabase”,在本文以后也将使用这个名称.


输入数据库名称


  一旦创建后,新数据库就将与服务器中de其他数据库一起出现在Schema窗口,选择它后,在右侧窗口将出现它de详细资料.

完成新数据库de创建:


新de数据库创建完成了


  现在这里面还没有更多de东西,因为目前数据库还是空de.下面我就为数据库添加点东西.
  第五步 创建表
  创建表很简单,只需要点击”Create Table”按钮,于是将出现下面de对话框:


创建表


  如图所示,我已经给表取名为”mytable”,有四个域,其中id域为自动增量de主键、一个整数域、一个文本域和一个时间/日期域.
  在完成这些后,点击”Apply Changes”按钮,将出现如下图de窗口,窗口中de是创建表deSQL语句,同时询问是否执行,当然点击”Execute”.


确认并执行表中deSQL语句


  到目前为止,我已经创建了一个包含名为”mytable”de表de名为”mydatabase”de数据库,下面我要做de就是为数据库添加点数据.

  第六步 添加数据
  在真实情况中,添加数据是通过应用程序来实现de,但现在仅仅是要添加几个样本数据,所以我将在MySQL客户端命令中使用SQL语句deinsert语句来实现,如果现在您还在MySQL Administrator中,那么可以通过菜单”tools”来访问命令行(Tools -> MySQL Command Line Client),否则可以通过开始菜单deMySQL组来访问.


通过命令行语句来实现添加数据


  图中de第一行是告诉服务器我将使用那个数据库,第二和第三仅仅是简单de向数据库插入数据.
  现在数据表中有两个样本数据,到目前为止,我de数据库服务器已经建立并运行了,里面有一个数据库,一个数据表,一些数据.
  第七步 创建新deMySQL用户账号
  要添加用户账号需要再一次运行并登陆MySQL Administrator,在MySQL Administrator窗口de左边选择”User Administration”,同时右边将显示服务器现行账号de信息(这里通常是所谓deroot),右击下面小窗口里de账号,选择”Add new User”.


再次运行MySQL Administrator,并添加一个用户帐号


  接下来系统将提示您输入新用户de详细信息,我给新用户取名为”15secs”,口令设置为”password”.


设置用户名、密码等常规选项


  完成这些后,点击”Apply Changes”按钮以保存输入.
  第八步 给用户账号授权
  缺省状况下de新用户几乎什么都做不了,要允许新用户连接MySQL数据库必须在”Schema Privileges”中进行授权,这一切将在MySQL Administrator.中de”Schema Privileges”中完成.


为新开帐号设置权限


  注意上图还没有为用户进行任何授权,由于后面de相关代码需要查询数据库,故需要授予用户”select”权限,然后点击”Apply Changes”按钮保存.

进行授权:


进行授权


  也许应用程序需要更多de权限,如:”INSERT”, “UPDATE”, 和 “DELETE”等等,您可以用同样de方法授予给用户,但要注意de是,权限越多安全越小,您必须对每个用户都实行控制.

  第九步 ASP.NET页连接数据库服务器
  在.NET中连接MySQL数据库有两种方法:MySQL Connector/ODBC 和 MySQL Connector/Net,ODBC连接器是符合ODBC标准de交互平台,是.NET访问MySQL数据库de最好de选择.
  下载MySQL Connector/Net,然后直接安装,如下图:


MySQL Connector/Net安装图

MySQL Connector/Net安装图

MySQL Connector/Net安装图

MySQL Connector/Net安装图

  注意:我选择了register Connector/NET in the Global Assembly Cache,但我发现它已经被安装了,但我不能使用import语句,找不到Connector/NETde名称空间,直到将MySql.Data.dll文件拷贝到/bin目录下后才解决这个问题,系统报出de错误是:

BC30466: Namespace or type specified in the Imports ‘MySql.Data.MySqlClient’ cannot be found
  我相信这个问题依然存在,只能暂时用手工将文件从安装位置拷贝到相应de目录中,如:C:\Program Files\MySQL\MySQL Connector Net 1.0.4\bin\.NET 1.1\,拷贝到C:\Inetpub\wwwroot\bin\,就可以解决这个问题.
  第十步 示例程序
  至此我de数据库终于完成,MySQL Connector/Net也安装成功,我该做点其他什么事情了.下面我将提供一段简单de脚本,在这段脚本中,我将连接和查询数据库中de数据,输入数据不是脚本de要点. MySQL.aspx
<%@ Page Language=”VB” debug=”true” %>
<%@ Import Namespace = “System.Data” %>
<%@ Import Namespace = “MySql.Data.MySqlClient” %>
<script language=”VB” runat=”server”>
Sub Page_Load(sender As Object, e As EventArgs)
 Dim myConnection As MySqlConnection
 Dim myDataAdapter As MySqlDataAdapter
 Dim myDataSet As DataSet
 Dim strSQL As String
 Dim iRecordCount As Integer
 myConnection = New MySqlConnection(”server=localhost; user id=15secs; password=password; database=mydatabase; pooling=false;”)
 strSQL = “SELECT * FROM mytable;”
 myDataAdapter = New MySqlDataAdapter(strSQL, myConnection)
 myDataSet = New Dataset()
 myDataAdapter.Fill(myDataSet, “mytable”)
 MySQLDataGrid.DataSource = myDataSet
 MySQLDataGrid.DataBind()
End Sub
</script>
<html>
 <head>
  <title>Simple MySQL Database Query</title>
 </head>
<body>
 <form runat=”server”>
  <asp:DataGrid id=”MySQLDataGrid” runat=”server” />
 </form>
</body>
</html>

  在上面de脚本中黑体字部分将随您采用de平台不同而进行修改,如采用SQL Server应用System.Data.SQLClient来替换MySql.Data.MySqlClient,这只是一点,更详细de本文就不讨论了.下图是脚本运行结果:

脚本运行结果

  结论:
  我希望本文能对读者理解数据库服务器有所帮助,当您打算从access或SQL Server上升级de时候,MySQL是一个不错de选择,尽管它是开放源相关代码de,而且还有些缺陷,但它与.NETde结合能做许多工作,另外MySQL Administrator使管理数据库服务器不再是管理员de噩梦.

在ASP.net中保存/取出图片入/从SQL数据库

星期二, 06月 3rd, 2008

一、把图片存入数据库中
用到以下几个方面de知识:
1. 使用流对象
2. 查找准备上传de图片de大小和类型
3.怎么使用InputStream方法

插入图片de必要条件
1.#Form 标记de enctype 属性应该设置成 enctype=”multipart/form-data”
2.# 需要一个<input type=file>表单来使用户选择他们要上传de文件,同时我需要导入 System.IO名称空间来处理流对象
对SqlServer做以下de准备
1.# 需要至少含有一个图片类型de字段de表
2.# 如果我还有另外一个变字符类型de字段来存储图片类型,那样会更好一些.

窗体控件
1.插入图片用到de是System.Web.UI.HtmlControls.HtmlInputFile控件,我在webform中放入这个控件,取名为“imgInput”
2.同时再放入一个确认上传按钮“Button1”

程序相关代码
AddImg,用于返回要上传de图片内容

1Private Function AddImg()Function AddImg(ByVal InputImg As System.Web.UI.HtmlControls.HtmlInputFile, ByVal ImgType As String, ByVal MaxSize As Int64) As Byte()
2′传入一个htmlinputfile控件,一个上传图片格式和一个上传图片最大值,返回图片de内容,既要写入数据库中de内容,您也可以同时写入图片类型
3 Dim intImageSize As Int64
4 Dim strImageType As String
5 Dim ImageStream As Stream
6 ‘ Gets the Image Type
7 strImageType=InputImg.PostedFile.ContentType
8 If strImageType <> ImgType Then
9 Response.Write(”<script>alert(’图片类型为”"‘)</script>”) ‘jgp类型为”image/pjpeg”
10 Exit Function
11 End If
12 ‘ Gets the Size of the Image
13 intImageSize = InputImg.PostedFile.ContentLength
14 If intImageSize > MaxSize Then
15 Response.Write(”<script>alert(’图片不得大于K’)</script>”)
16 Exit Function
17 End If
18 ‘ Reads the Image
19 ImageStream = InputImg.PostedFile.InputStream
20 Dim ImageContent(intImageSize) As Byte
21 Dim intStatus As Integer
22 intStatus = ImageStream.Read(ImageContent, 0, intImageSize)
23 Return ImageContent
24 End Function
示例调用

Dim imageContent() As Byte
imageContent = AddImg(fileImg, “image/pjpeg”, 512000)’上传图片类型为jpg,最大不超过500K

插入数据库

我想这部分就不用写了吧,您可以用任何方式(推荐使用存储过程),将imageContent插入到数据库中类型为imagede字段就行了.

二、把图片从数据库中读出

这部分比较简单:

假设img变量是您从数据库中取出de图片内容
那么直接使用
Response.BinaryWrite(img)
就可以将图片输出到页面上了

三:总结

将图片存放在数据库中其实是起到了图片保护de作用,这样就算别人浏览您de机器也看不到您de图片,也可以用来保护重要de图片资料.

ASP.NET数据库编程之处理文件访问许可

星期二, 06月 3rd, 2008

  一个MDB数据库就是硬盘上de另外一个文件,所以,像其他文件一样,它也将遇到相同de文件访问许可问题.这个问题de意思是为了读取(和写入,就像您将要在本书de后面看到de那样)数据库文件,页面中所运行de应用程序必须具有相关许可才可以在Windows中读取(和写入)该文件.
  到目前为止,示例中de页面都能够“正常运行”de原因就是您使用de是VWD Web Server,一个在运行VWDde用户de身份下运行de轻量级程序.这就是说,VWD Web Server为您而运行,并且您已经被允许读取和写入页面连接deMDB文件.
  但是,当在IIS下运行页面时,情况就有一点复杂了.此时,ASP.NET页面运行于一个具有特定权限限制de用户账户de身份之下.在IIS 5.1之下,这个账户是“ASPNET”.在IIS 6.0或更高版本下,这个账户是“Network Service”,属于一个称为IIS_WPG(“worker process group”)deWindows用户组.为了在IIS下使用Access数据库,这些账户都必须授予对包含了MDB文件de目录进行读取de许可以及按情况授予写入de许可.
  为了帮助您创建这些许可,当数据库处于应用程序根目录之下deApp_Data子目录下时,VWD将执行额外de步骤并自动地将这个许可授予ASPNET或者 Network Service账户.假如您正在使用VWD来开发机器上de页面,这个特定de目录就一直会被授予正确de许可.App_Data目录还有另外de好处,例如防止其中de任何文件响应发出请求deWeb浏览器.这就是说将MDB文件放入应用程序de本地App_Data目录之后,就可以保护这些文件不被应用程序de客户端无意或有意地下载了.所以,我极力推荐将MDB文件保存至App_Data目录中.
  如果必须将MDB文件保存至其他de地方,或者需要手动指定数据库目录de许可(例如,您正工作于一台远程Web服务器),那么可以使用Windows来为ASP.NET和/或 Network Service账户配置许可.
  如需手动设置许可,请按如下步骤执行:
  (1) 使用Windows Explorer浏览MDB文件所在de文件夹.
  (2) 右键单击这个目录并选择Properties.
  (3) 选择Security标签并单击Add按钮.
  (4) 添加本地deASP.NET账户(IIS 5.1) 或者IIS_WPG组(IIS 6).
  (5) 单击OK;然后将相关许可应用至这个目录.
  如需获得更多信息,请参阅名为“Running ASP.NET 1.1和IIS 6.0”de白皮书,可以从ASP.NETdeWeb站点:http://www.asp.net/faq/AspNetAndIIS6.aspx上获得该白皮书.

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对象.

ASP.NET2.0数据库入门之SqlDataSource

星期二, 06月 3rd, 2008

当使用SqlDataSource控件选择数据时,可以从两个属性:ConnectionString和SelectCommand开始,如下所示:

<asp:SqlDataSource ID=”MySourceControlName” Runat=”server”

ConnectionString=”Server=MyServer ;

Database=Northwind”

SelectCommand=” SELECT Fieldl, [Field With Space] FROM MyTable”>

</asp:SglDataSource>

当使用Windows认证时,可以添加两个认证数据.

<asp:SqlDataSource ID=”MySourceControlName” Runat=”server”

ConnectionString=”

Server=MyServer ;

User ID=MyID;

Password=Mypass;

Database=Northwind”

SelectCommand=” SELECT Field1, [Field With Space] FROM MyTable”>

</asp:SqlDataSource>

第一个是前面讨论过de连接字符串,第二个是SelectCommand,用来确定将从SQL Server数据库中提取什么信息.在SelectCommand中,可以使用任何符合语法deSQL SELECT语句,包括在上一章或者附录A中讨论de语句.很多SQL Server管理员都不会允许用户直接访问表.数据库管理员将会在SPROC上创建一些受限制de许可.或者,创建表de视图用来提供表de一部分数据或者对表中可以修改de数据进行限制.连接至视图de语法如下:

SelectCommand=”SELECT * from MyView”>

如果表、查询、SPROC或者视图de名称中有空格字符,则应当使用方括号将整个名称包含起来,如下所示:

SelectCommand=”SELECT * from [My View] “

您可能已经注意到了GridView中deFilter属性并且想知道它与在数据源SelectCommand中使用WHERE子句之间有何不同.筛选只用于某些缓冲情况,我将会在第15章中介绍.

有了连接字符串和SelectCommand,就可以创建从SQL Server使用数据de页面了.

试一试#1—— SqlDataSource简单示例

在本练习中,应该以网格(表)格式从NorthwinddeSQL版本显示产品deGridView.可以以添加DataSource控件和数据绑定控件de技术开始,这样就能够创建最简单de源相关代码.然后将会使用一种更快速de开发技术(拖放列名称).

(1) 请确认已经安装了SSE(如第1章所述),包括样本数据库Northwind.本练习还将涉及到SQL Server或者MSDE.

(2) 创建文件夹ch03,在其中创建一个名为TIO-1-SqlSimple-1.ASPXde文件.通过Menu:View|Toolbox(Ctrl Alt X)显示工具箱.请注意工具箱有一个可以展开deData区域.

(3) 在Design视图中,从工具箱deData区域中拖放一个SqlDataSource控件至页面.在便捷任务面板上,将数据源配置为新de连接.输入服务器名称(local)\SQLExpress并使用Windows NT认证.选择名为Northwindde数据库并测试连接.单击OK结束.您将会自动返回至Data Source Configuration对话框,单击Next.对本例来说,不需要在配置文件中保存连接字符串;单击Next.选择“Specify columns from a table”并选择表名Products.在Columns列表中,单击ID、Name和Unit Price.单击Next和Test Query,然后单击Finish.这样就完成添加DataSource控件了.

(4) 添加GridView数据绑定控件.在便捷任务面板中,选择SqlDataSource,然后关闭便捷任务面板.这样就创建了数据绑定控件.保存并运行页面,页面如下:

<%@ Page Language=”VB” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN”

“http://www.w3.org/TR/xhtmlll/DTD/xhtmlll.dtd”>

<script runat=”server”>

</script>

<html xmlns=”http://www.w3.org/1999/xhtml” >

<head runat=”server”>

<title>Ch03-Tio#l-SqlSimple-verl</title>

</head>

<body>

<h2>

Chapter 3 TIO #1 SqlSimple verl

</h2>

<form id=”forml” runat=”server”>

<div>

<asp:SqlDataSource ID=”SqlDataSourcel” Runat=”server”

ProviderName=”System.Data.SqlClient”

ConnectionString=”Server=(local)\SQLExpress;

Integrated Security=True;

Database=Northwind;

Persist Security Info=True”

SelectCommand=”SELECT [ProductID], [ProductName], [UnitPrice] FROM[Products]“>

</asp:SqlDataSource>

<asp:GridView ID=”GridViewl” Runat=”server”

DataSourceID=”SqlDataSourcel”

DataKeyNames=”ProductID”

AutoGenerateColumns=”False”>

<Columns>

<asp:BoundField ReadOnly=”True” HeaderText=”ProductID”

InsertVisible=”False” DataField=”ProductID”

SortExpression=” ProductID” ></asp: BoundField>

<asp:BoundField HeaderText=”ProductName”DataField=”ProductName”

SortExpression=”ProductName”></asp:BoundField>

<asp:BoundField HeaderText=”UnitPrice” DataField=”UnitPrice”

SortExpression=”UnitPrice”></asp:BoundField>

ASP.NET2.0数据库入门之SQL Server

星期二, 06月 3rd, 2008

因为Access并不真正为高性能应用程序服务,所以一个希望有多个同时连接用户de站点必须部署一个比Access更适合de数据源.本文将讲述如何从Microsoft SQL Server(一种企业级RDMS)中获取数据.

SQL Server完全版包括了三个部分.第一个是引擎,用于实际组织数据以及针对命令响应进行读取和写入操作.第二个是开发人员de工具软件包,用于对数据库进行操作,例如Query Analyzer和Data Transformation Services.最后一个是用于管理数据de工具,包括备份程序和复制模式.

虽然完全版对大型企业来说有着不可估量de好处,但是很多开发人员并不需要整套工具.幸运de是,Microsoft提供了一个SQL Server引擎de免费版,叫做SQL Server Express(SSE).尽管它具有一个使用T-SQL命令来导入模式和数据de命令行工具(osql.exe),但是它还不包含在SQL Server完全版中具有de丰富图形化de工具.不过,可以方便地使用Visual Studio或者Visual Web Developer来使用SSE开发数据库.SSE有一个限制,即只处理本地de连接(不可能在Web服务器之外de不同机器上运行SSE).对于具有某些嗜好de人以及学生deWeb站点来说,SSE是一个非常适合de选择.可能会使用基于SQL Server 2000deMSDE,而SSE则基于SQL ServerdeYukon版.

除非有另外特别de说明,这里所介绍de所有技术均可应用于SQL Serverde三种形式(完全版产品、SSE和MSDE),因此,通用术语SQL Server包含了这三种形式.

因为SSE只是一个引擎而并没有内置de开发工具(到2004年),所以必须使用其他de工具来创建、修改或者填充数据库.为此我将要使用de主要工具是Visual Studio或者Visual Web Developer,其中提供了Database Explorer作为其界面de一部分.请注意Database Exporer可以更改本地数据库中de数据和模式,但是它只能更改远程数据库中de数据(而不是结构).在Visual Studio中,Database Explorer被称为Server Explorer,因为它包括了一些处理非数据库服务器de附加功能.我还将在本书de开端简单地使用osql.exe命令行工具来导入将在本书通篇使用de初始数据库.修改数据库结构de第三种方式是打开Access,然后在SSE数据库中链接一个外部表.

使用SQL Server需要熟悉一些词汇.SQL Server安装在一台称为服务器(server)de机器上,并且可以通过其机器名来引用.如果SQL Server与请求软件位于同一台机器上,那么这台机器可以用(local)来引用.引擎可以在一台机器上安装多次,每一次安装称为一个实例(instance).SSE安装一个名为(local)\SQLExpressde实例.在一个实例内,可以创建数据库(database).数据库有一些具有字段(field)和记录(record)de表(table).数据库还有供数据使用者使用de一组表、字段和约束,称为视图(view).存储过程(stored procedures,SPROC)可以对数据执行任务.一个SQL Server实例自动安装了一个用户名为sade账户,当对用户使用SQL Server认证时,这个账户具有对所有对象进行所有动作de权限.在使用Windows认证(也称为混合认证)de时候,登录进Windowsde用户也同时登录进了SSE.

使用SQL Server数据库之前de准备

花时间在研究数据库上将减少您设计使用数据de页面时de错误.在编写使用SQL Serverde页面之前,请检查您是否已掌握了如下几类信息:

· 服务器、实例和数据库名称—— 确认服务器名称、实例和数据库名称de确切拼写.如果在服务器上只有一个完全版SQL Serverde实例,那就不需要使用实例名了.但是即使在服务器上只有一个SSEde实例,也必须用MyServer\SQLExpress来显式地引用.请明确是将要测试实际数据还是测试数据库de部署备份.

· 安全信息—— 您需要知道您de用户ID和密码,以便对开发数据库de访问进行认证.同样地,请检查SSE是使用Windows认证还是SQL认证(第1章中de安装曾说明SSE应该使用Windows认证).

· 数据库模式—— 理解数据库de模式.获得表和字段名、自动生成或锁定de字段、相关性以及约束de确切拼写.仔细注意对象名称中de下划线和空格.从数据库管理员那里查到是直接使用表还是使用视图或者存储过程(SPROC).使用后者将可能需要特殊数据类型de参数.用来检查这些元数据deSQL语法罗列在本章de后面.

· 测试SQL语句(可选)—— 您可能会怀疑SQL语句de语法或者逻辑.您将会发现测试语句de有效方法是使用诸如SQLdeQuery Analyzerde开发工具,而不是在这些语句第一次出现在ASPX页面上时才测试.

连接字符串

AccessDataSource控件和SqlDataSource控件之间语法de主要区别在于使用数据库de方式各异.对MDB来说,我只需提供文件名和路径名,而SqlDataSource则使用包含了服务器名称、数据库名称和登录信息de连接字符串名.连接字符串de语法区别于我在Visual Basic或者C#中所熟悉de语法,并且也是很多学生犯错误de原因.一个典型de连接字符串如下:

ConnectionString=”Server=MyServer; Database=MyDatabase;User ID=MyID; Password=MyPass”

多行de连接字符串de格式能够提高可读性,如下所示:

ConnectionString=”

Server=MyServer;

Database=MyDatabase;

User ID = MyID;

Password=MyPass”

首先,我来讨论语法.源相关代码中整个字符串处于双引号之中.当在VWDde属性窗口指定连接字符串时,您不需要引号,VWD将会自动添加.在引号中间是一些格式如Criteria=valuede成对信息.分号将这些信息分隔开.请注意,值不需要使用引号.同样,请注意即使判句中包含空格(例如User ID),它们也不需要使用引号或者方括号.这种语法理解起来并不困难,但是因为与VB、C#和SQL语言不同,所以错误常常出现.现在让我花一点时间将这个字符串分解开来.

在这个连接字符串中有两种值:数据库标识符(服务器、实例和数据库)和安全值(用户ID、密码和安装设置).数据库标识符以服务器值开始,这个值是运行SQL Serverde机器de网络名称.(在XP中机器名称de获得可以通过Start->My Computer;单击右键并选择Properties->Computer Name tab->Full Computer Name.在Windows 2000中,可以在桌面deMy Computer上单击右键->Properties->Network Indentification).如果知道数据库服务器与ASP.NET运行deWeb 服务器使用相同de机器,那么还可以将服务器名称指定为(local)来表明服务器就是ASP.NET页面运行de本地机器.可以用Instance=MyInstance来添加实例.更一般de情况是,使用MyServer \My- Instance或者(local)\MyInstance来添加实例至服务器名称.可能还会看到使用句点(句号)来表示本地机器,例如.\SQLExpress.

在默认情况下,SSE安装自己de实例.单独引用(local)将导致失败.必须使用(local)\SQLExpress来引用SSE.

安全设置将在本章稍后讨论.现在,我来了解Windows Authentication,使用属性IntegratedTrusted_connection=true而不是用户ID和密码属性.SQL认证需要两个值:user=MyUserName;password=MyPassword,其中MyUserName和MyPassword将被您de证书代替.本文使用de是Windows认证.

如果您熟悉ASP早期版本,那么也许对提供程序感到疑惑.SqlDataSourcede默认提供程序是.NET Framework Data Provider for SQL Server.所以在本章中不需要指定提供程序.下一章将会讨论为其他数据库指定非默认de提供程序.

asp.net2.0如何加密数据库联接字符串

星期二, 06月 3rd, 2008

asp.net2.0如何加密数据库联接字符串

在asp.net2.0中,发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下:

1.添加密钥

执行:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pc “hnlaw” -exp

其中”hnlaw”为密钥名称

2.添加web.config节点

在web.configde<configuration></configuration>之间添加:

<configProtectedData>

<providers>

<add keyContainerName=”hnlaw” useMachineContainer=”true” description=”Uses RsaCryptoServiceProvider to encrypt and

decrypt” name=”hnlaw” type=”System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0,

Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” />

</providers>

</configProtectedData>

注意:这里keyContainerName=”hnlaw”和name=”hnlaw”分别表示您de密钥名称;

3.加密web.config

到网站根目录添加一个批处理文件enweb.bat,内容如下:

@echo off

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef “system.web/identity” “E:\HS Studio\Donet2\Hnlawyer” -prov

“hnlaw”

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef “connectionStrings” “E:\HS Studio\Donet2\Hnlawyer” -prov

“hnlaw”

PAUSE

注册上面dede路径和名称!

运行后出现成功!

4.解密

同样到网站根目录添加一个批处理文件deweb.bat,内容如下:

@echo off

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef “system.web/identity” “E:\HS Studio\Donet2\Hnlawyer”

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf “connectionStrings” “E:\HS Studio\Donet2\Hnlawyer”

PAUSE

最后就是要注意:做完后找到C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys目录下,找到生成

de密钥文件(可按时间查找),给上network service可读取权限,不然会出现Error message from the provider: The RSA key container could

not be opened.

无法读取

这样可能会出现,如果没有自己de服务器,没有权限修改MachineKeys目录,不知道还有其它解决办法,希望大家共享一下:)

Java数据库存取技术

星期一, 06月 2nd, 2008

IT技术日新月异,新技术de出现令人目不暇接,似乎每一天都在产生着新名词.不过归根结底IT所要实现de价值不外乎数据收集,然后再以客户希望de形式展示给客户而已.因此数据存取技术也就成了一个永恒de话题.而在Java这个开放de世界里,数据库存取技术是五花八门,种类繁多.我也来侃侃Java世界里主流de数据库存取技术.
  首先列出英雄榜
  1.JDBC直接访问数据库
  2.EJB entity bean.
  3.JDO技术.
  4.第三方O/R工具,如目前大红大紫deHibernate, 其它如Castor, Toplink.
  先说说这个历史最为悠久deJDBC吧.从Java诞生de那天起,这位仁兄就开始登上历史舞台了.Java能有今天这么风光,JDBC可以说是功不可末.一路走来,如今已是JDBC3.0了.在没有JDBCde时候,访问数据库那是八仙过海,各显神通,各家数据库厂商都有自己de一套API, 苦就苦了开发人员了.换了个数据库,那个程序要改是面目全非.
  JDBC规范de出台,向世界宣告从此有了访问关系数据库de标准通用接口了.JDBC标准获得了几乎所有数据库厂商de支持,好像还真难找到这么一个数据库,它是没有JDBC支持de.JDBC规范一经发布,获得了空前成功,很快成为java访问数据库de标准.JDBCde成功在于它de规范统一标准de接口,只需要掌握标准deSQL语言就可以访问各种不同de数据库了.这种数据库间de可移植性和Java一直高喊de口号Compile Once, Run everywhere遥相呼应.JDBC今天还是java访问数据库de基石,CMP、JDO、Hibernate说到底只是更好de封装了JDBC, 提供了更为上层de更为强大de接口而已.然后说说JDBC直接访问数据库de方式来实现java 持久性.
  这种方式相对于CMP来说比较简单直接,特别是对于小型应用十分方便.比如,我要写一个简单de留言版程序,就没有必要session bean ,entity bean ,又是home接口又是远程接口,一层层调了吧.直接JDBC,写SQL语句了事.和其它持久化技术相比,JDBC直接访问数据库de方式需要程序员操心de事情多了一些,您得自己关心transaction, 自己关心连接池,您得写大量deget set方法,把SQL select出来de值一个一个塞到您dejava object中,或者把java objectde值一个一个给取出来,用SQL insert 到数据库,完全手动进行O/R mapping.为了克服这些缺点,CMP, JDO等等开始陆续登上历史舞台.
  下面EJB登场,EJB作为Sun J2EE体系de核心部分,是Sun 所力推de企业级开发de首选,而EJB entity 目前仍然是Sun J2EE白皮书所最为推荐dejava持久化技术.Entity Bean作为EJB规范de一部分,也是EJB规范里面最备受争议de一种技术,它伴随着EJB规范走过了风风雨雨几个春秋.目前EJB3.0规范草案已经出台,http://jcp.org/en/jsr/detail?id=220.
  从家庭出生来看,EJB可谓是根正苗红,规范处于 JCP管理之下,拥有超级豪华de专家组成员, Sun、IBM、Oracle、Borland、Bea、SAP、Jboss、Apache软件基金组织等等.单从这一点来看,选它作为企业级开发,技术支持应该就无需担心了.当然向IBM, Bea等寻求项目咨询价格当然也不菲.从提供功能上来看,EJB entity经历了EJB1.0,EJB1.1,EJB2.0,功能也越来越完善了.包括了完善de事务支持,EJBQL查询语言,透明de分布式访问等等.不过作为一个重量级技术,entity beande性能不太尽人意,这成为它备受争议de一个焦点,不知在3.0以后这个状况会不会有所改进.
  再有一个,它功能虽然强大,可是对于易用性来说,实在不敢恭维,写一个最简单debean,也非得home接口,远程接口,要再加上2.0以后加入de本地接口,这么林林总总一大堆,足以让Java初学者望而却步了.但是这一点在一段时间内竟然也成了EJB功能强大,技术高深de“佐证”.记得多年以前刚毕业那阵,EJB应用在国内还比较少,公司里也没有人研究Why EJB这个问题,反正凡是用EJBde项目就是牛项目,用EJBde人就是牛人,分到EJB项目组de兄弟们走路都是抬头挺胸de,说话都比我等还在JDBC, SQLde人要高两嗓门.EJB 技术目前盘踞着企业级应用de大部分江山,老大地位短时间内很难捍动.
   下面新生代代表JDO隆重登场,JDO绝对属于超年轻选手, JDO1.0也不过是2002四月份才发布.2003五月份出台1.0.1, 目前最新2.0草案已经发布.就为这2.0,江湖上展开de讨论可以说是“血雨腥风”,两大兵团,JDO兵团和EJB兵团争得是不可开交.有兴趣de不妨去瞧瞧,里面也不乏重量级人物.单从这一点来看,它能对EJB产生这么大de冲击,足以说明了这个初生牛犊确有过人之处.JDOde诞生给java数据持久性带来很多新特性,特别是它弥补了EJB对OO编程de先天不足,JDO提供了完全deOO支持,继承,多态.JDO和 EJB比属于轻量级工具,无需容器支持.不像EJB,要用您就非得整一个Weblogic, webSphere之类de.
  JDOde简单易用是最为人们所称道de,不需要您写大量无用de接口,不需要您继承什么特殊de类,唯一所要做de就是对您declass文件做一下enhance.用了JDO,可以说我dejava程序这下真正OO了,我无需再理会数据库里面有啥表格了,存取都是以java object为对象了,所有数据库表格都是自动生成de.这一点可以说也是一个革命了.
  在此之前,项目设计阶段,Database Schema设计可以说是个重头戏.而现在用JDO开发,完全不需要数据库设计了.那您deDatabase Schema呢?就是您deClass啊,JDO会根据您deClass自动生成相应de数据库表格.一个字,爽!从数据库可移植性来看,JDO也是优势明显,就我使用过deKodo 和 Genie来看,几个简单应用程序换数据库时候除了换一个JDBC driver, 换一下数据库URL,无需对程序做任何改动. 这一点对EJB 来说又是处于劣势.从家庭出身来看,JDO也是出生名门,从一开始就处于JCP管理之下.从企业级支持来看,它可以很好de和Session bean协同工作,对于企业级开发,Session bean   JDOde方式是Session bean entity方式de一个强有力竞争对手.虽然有这么多优点,不过它de发展之路也非一帆风顺,这不,今年五月份JDO2.0de投票,IBM、Oracle、Bea三大巨头同时投了反对票.不过稍微一想,就可以理解,这并不是JDO本身技术有什么重大缺陷,而是JDO动到这些巨头们de奶酪了.
  Bea、IBM做着业界最为著名应用服务器,weblogic和WebSphere,在EJB上面是投下了血本了,他们不能眼睁睁看着JDO来蚕食EJB市场.而Oracle, 还在卖着它自己deO/R工具Toplink, 看着JDO日渐强大,他能不着急么.不过呢,公司再牛,他也挡不住历史前进de车轮吧,最终JDO2.0de投票还是以绝对de票数(12:3)通过了.
  还有其它散落江湖deJava持久化技术,如Hibernate、Castor、Toplink,他们虽然没有皇家血统,不过实力也是不容小视.就拿Hibernate来说,是javaworld评选出来de2003年度最佳java数据存取工具,目前可以说是大红大紫.而Castor和Toplink也算是历史悠久了,在JDO没有出世之前,它们就在江湖上混着了.目前也占据着一定de市场.这些第三方de工具从功能上来说很类似于JDO, 只是各自deAPI互不相同.这也是后来JDO规范de呼声越来越高de一个原因吧.这些第三方O/R mapping工具能在江湖上立足,也确实都有各自过人之处.如Hibernate金字招牌就是Open Source,支持几乎世面上所能看到得绝大部分数据库,并且文档也非常齐全.Toplink么,可谓历史悠久,又榜着Oracle这棵大树.目前来看,这些工具也占据着java数据库存取de不小市场.个人觉得,随着JDO规范de不段完善,JDO产品de普及,这一部分人员可能会在以后渐渐退出历史舞台.不过从Hibernate目前如日中天de气势来看,好像说这句话还为时过早.
  关于这些技术优劣之争从它们刚刚出生那天起从来就没有停止过,而各家各派也从来没有能够说服过对方.对于我应用开发者而言,撇开应用纯粹来争论技术优劣并没有多大意义.还是俗话说de好,没有最好de,只有最合适de.我能够在做开发de时候能够选择一个最合适于自己应用de技术,那就足够了.总de来说,JDBC面向RDBMS,比较适合关系数据库模式驱动de应用,例如统计表格数据,生成报表之类de应用.EJB 技术以J2EE应用服务器为中心,如果您de应用确实需要灵活de可声明de事务边界,需要支持大容量de访问和不间断de服务,需要应用服务器de集群,那么选EJB吧.JDO则面向对象,对于以域对象为中心de应用,包含图,树模型de应用,JDO是首选.