学习ADO.NET(1)

Posted by 蒋波涛 31 May,2005 Views (0)Comment
最近在学习Oracle数据库,顺便也学习一下ADO.NET,所以这里的代码都是链接ORACLE数据库的,我以前写ASP的时候使用的都是ADO,在ADO中我最常用的只有两个对象,connection和recordset对象。但是在ADO.NET里面一切都在变化。
在.NET平台上,微软提出了ADO.NET的技术,而这一技术并非是ADO的新版本。为了实现离线存储、全面XML支持和与.NET平台的无缝结合,ADO.NET诞生了。在.NET平台上,ADO.NET是最好的选择。ADO.NET处理的数据主要分为两大类,一种是RDBMS关系数据模型,一种是XML可扩展标记语言。实际上,在ADO.NET里面数据的传递格式就是XML的。
ADO.NET将数据的提供者和数据的持有者分开来了。它依据数据的类型不同提供了好几种数据提供方式,有OLEDB Manager provider、SQL Manager Provider和ODBC Manager provider等方法,对于ORACLE数据库也专门有一种oracle manager provider。

ADO.NET的数据提供者是最主要的,它分为四个对象,即:connection、command、dataReader和dataAdapter。除了这四个依据数据类型不同而各有差异的数据提供对象外,在ADO.NET里面的数据持有者DataSet却是公共的。因此,ADO.NET使用了一种统一、简单的方法来操作数据。下面我们开始逐一介绍这些重要的对象:
 1.      连接数据库
ADO.NET有三种数据链接方式,“连接式”“断开式”和“传统访问与XML混合式”。这里使用到数据库连接对象connection:
Dim pConn As OracleConnection
pConn = New OracleConnection("User ID=sde; Password=sde; Data Source=DEMDOM")
pConn.open
程序要引入system.data.oracleclient包;我的数据库的UID是“DEMDOM”,密码和用户名都是sde。在连接中,尽量使用连接池来提高连接的性能,但是oracle数据提供者可以自动地创建连接池,连接池的打开是在连接字符串后面加上pooling=true。在建立一个Oracle连接对象后,一定要将它打开,下面这个代码可以有效地打开连接:
If OracleConnection1.State = ConnectionState.Closed Then
            OracleConnection1.Open()
End If
 
下面列出几个其他类型的数据库连接字符串:
Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=grocertogo.mdb(ACCESS数据库)
data source=localhost;initial catalog=pubs;user id=sa;password=  (SQLSERVER数据库)
 
除了使用语句写出链接外,VS.NET的IDE还提供了可视化的数据链接,在“服务器资源管理器”中的“数据链接”中右键选择“新建链接”,然后从组件面板中拖出oracleconnection对象,将其配置到新建的链接上,产生一个oracle链接对象。
在连接中出现异常Exception有多种,但是我们最一般使用的是sqlException。这个异常可以更加有效地检测程序在调试过程中出现的问题。
数据连接在数据使用完后,即数据填充到Dataset后最好关闭。
 
(SQL攻击):
在一般的程序编写过程中,很多人习惯使用SQL语句来验证密码和用户名,如使用这种方法:
“Select * from user where uid=’ ”+text1.text+” ’ ”+”pwd= ‘”+text2.text+” ‘”,但是这种写法是非常容易受到SQL语句攻击的,如果我们的text1.text的内容是’ or 1=1 ‘--,这样完全可以将后面的密码注释掉,而且前面的用户名甚至也可以没有。解决的方法是:text1.text.tostring.replace(“’ ”,” ‘ ‘”)。
 
2.      OracleCommand对象
Command对象是ADO.NET模型中的第二级对象,也是一个非常灵活的对象,由于它可以灵活使用SQL语句,因此几乎所有的数据更新都可以使用这个对象完成而不需要借助dataSet对象来完成,如下面的例子:
pCommand.CommandText = "insert into sde.catalog values(10,'aa',10,'aa',10)"
pCommand.ExecuteNonQuery()
上面的两个语句可以向表中插入一条记录而不需要调用dataSet对象来完成。当然,上面的写法未免太傻了,我们可以新建几个OracleParamater对象来完成这个插入任务:
'下面是OracleCommand对象的SQL语句和连接对象
Me.OracleCommand1.CommandText = "INSERT INTO STUDENT (SID, NAME, AGE, ADDR) VALUES (:id, :name, :age, :addr)"
Me.OracleCommand1.Connection = Me.OracleConnection1
 
'这是四个parameter对象,这样的代码写法未免太麻烦,因此我们是在对话框中添加的参数对象:
Me.OracleCommand1.Parameters.Add(New System.Data.OracleClient.OracleParameter(":id", System.Data.OracleClient.OracleType.Number, 0, System.Data.ParameterDirection.Input, False, CType(6, Byte), CType(0, Byte), "SID", System.Data.DataRowVersion.Current, Nothing))
Me.OracleCommand1.Parameters.Add(New System.Data.OracleClient.OracleParameter(":name", System.Data.OracleClient.OracleType.VarChar, 10, "NAME"))
Me.OracleCommand1.Parameters.Add(New System.Data.OracleClient.OracleParameter(":age", System.Data.OracleClient.OracleType.Number, 0, System.Data.ParameterDirection.Input, False, CType(2, Byte), CType(0, Byte), "AGE", System.Data.DataRowVersion.Current, Nothing))
Me.OracleCommand1.Parameters.Add(New System.Data.OracleClient.OracleParameter(":addr", System.Data.OracleClient.OracleType.VarChar, 10, "ADDR"))
 
'传入数据并执行命令
OracleCommand1.Parameters(0).Value = TextEdit1.Text
OracleCommand1.Parameters(1).Value = TextEdit2.Text
OracleCommand1.Parameters(2).Value = TextEdit3.Text
 OracleCommand1.Parameters(3).Value = TextEdit4.Text
OracleCommand1.ExecuteNonQuery()
 
我们推荐在使用dataset和dataReader对象的时候都使用command对象产生,因为这样可以提高连接效率,减少资源的占用。OracleCommand对象的命令有以下三个:
1.xecuteOracleNoQuery  如果是插入、删除、更新数据的时候,使用这个方法
2.xecuteReader  如果是得到只读数据,使用这个语句。
3.xecuteOracleScalar  这个语句只返回查询数据的第一行,如果是查询count(*),sum(price),avg(price)等只有一行的数据时,使用这个方法:
Dim pCmd As OracleCommand
pCmd = New OracleCommand
pCmd.CommandText = "select count(*) from sde.catalog"
pCmd.Connection = pConn
pCmd.CommandType = CommandType.Text
Dim i As OracleNumber
i = pCmd.ExecuteOracleScalar
Me.Text = i.ToString
这个方法非常有用,尤其是在插入数据的时候,可以使用它判断是否已经存在数据,如:
pCmd.CommandText = "select count(*) from sde.catalog where id=sid"
......
if i=0 then
    Messagebox.show("数据不存在"
end if
这样,我们就可以判断某条数据是否已经存在数据库中了。
 
3  .   DataReader
ADO.NET模型中取出数据有两种方式,除了Dataset外就是dataReader,但是后者是只读流模式的,只能用于查看数据。dataReader只能向前读取数据,它是ADO.NET中最快但是最不灵活的数据读取方式。
Dim pCommand As OracleCommand
pCommand = New OracleCommand
pCommand.CommandText = "select cate_name from sde.catalog"
pCommand.Connection = pConn
Dim pRead As OracleDataReader
pRead = pCommand.ExecuteReader(CommandBehavior.CloseConnection)
datagrid.datasource=pRead
datagrid.setbound()
 
这样可以将数据放入datagrid控件中了。如果是dataReader对象读取数据,使用read方法。建议在数据读取完以后,及时关掉dataReader。
DataReader对象的数据读取方式为:
while pRead.read
       ........
wend

Related Items

Categories : .NET开发 Tags :
Comments
Leave a comment

Or, take a look at Archives and Categories

目录

存档