分享
 
 
 

ADO.NET数据库实例教程

王朝c#·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

ADO.NET数据库编程比较复杂,名目繁多的类、对象、属性、方法让每一个编程者都感觉恼火。本文旨在介绍ASP.NET Beta2数据库编程的主要内容,帮助编程者最快的了解ADO.NET数据库编程的精髓。

一、 Managed Providers

如果你是初学者,可能你会问,什么是"Managed Providers"?

Managed Providers提供简单的方法连接和访问数据库,有点类似于数据库连接,当然又比它强的多。Managed Providers提供OleDb和SQL Server两种编程接口。因为SQL Server是微软自己的产品,因此,专门提供了一个针对SQL Server的接口,使用这个接口访问SQL Server的效率应该比使用OleDb强。

NameSpaces

本文所有的例子程序都需要使用以下NameSpaces:

<%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.Oledb" %>

Connection

为了连接数据库,必须使用OleDbConnection:

Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:sffsitedbusers.mdb")

当然,你也可以将具体的连接方法作为变量使用,在连接数据库以后,必须打开数据库:

objConn.Open()

这样,就可以使用数据库了,一般在最后,我们都要求关闭数据库连接:

objConn.Close()objConn=Nothing

Command

连接数据库以后,就可以发送命令对数据库进行操作了,OleDbCommand允许发送命令对数据库进行操作。根据发送的SQL语句,我们可以对数据库进行几乎所有操作。

Dim objCmd as New OleDbCommand("SELECT * From users", objConn)

以上语句建立Command,根据习惯不同,也可以使用以下方法:

Dim objCmd as New OleDbCommand()objCmd.Connection = objConnobjCmd.CommandText = "SELECT * FROM users"

还可以这样:

Dim objCmd as New OleDbCommand(SQL String, connection string)

仔细观察上面的语句,我们发现在定义OleDbCommand时,可以同时使用数据库连接OleDbConnection和数据库连接语句。以上代码并没有执行SQL语句,现在我们来看到底怎样执行:

ExecuteNonQuery

当执行没有返回数据的操作的时候,我们可以使用以上方法,比如插入数据、更新数据等操作,具体这样执行:

objCmd.ExecuteNoQuery

ExecuteReader

在需要一个Data Reader的时候,我们可以使用以上方法,具体这样执行:

Dim objRd as OleDbDataReaderobjRd = objCmd.ExeuteReader

ExecuteScalar

使用ExecuteScalar方法来取得一个单个地返回数据,比如对数据的统计。

Data Reader

OleDbReader是专门用来读取数据的对象,这个对象除了读数据以外,不能做其他任何数据库操作。尽管比较简单,但是在用来浏览数据的时候效率是非常高的。

Dim objReader as OleDbDataReaderobjReader = objCmd.ExecuteReaderWhile objReader.ReadResponse.Write(objReader.GetString(0) & "<br>")End While

以上语句读取Command的返回结果的第一个字段,这个字段是字符型数据。我们可以使用其他方法取得各种类型的数据:

GetBoolean(x)

GetByte(x)

GetBytes(x)

GetChar(x)

GetChars(x)

GetDataTypeName(x) -取得数据类型

GetDateTime(x)

GetDecimal(x)

GetDefaultStream(x)

GetDouble(x)

GetFieldType(x)

GetFloat(x)

GetGuid(x)

GetInt16(x)

GetInt32(x)

GetInt64(x)

GetName(x) - 取得字段名

GetOrdinal(name) -根据字段名取得字段序号

GetString(x)

GetTimeSpan(x)

GetValue(x)

GetValues(values())

以上方法都是Command返回数据。

Data Adapter

OleDbDataAdapter取得数据并且数据与DataSet之间建一座桥梁,可以这样使用:

Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)

实现方法有点类似于OleDbCommand。OleDbAdapter可以填充DataSet,也可以修改数据然后提交以实现对具体数据的修改:

Dim ds as Dataset = New DataSet()objAdapter.Fill(ds, "users")

以上语句实现将SQL语句取得的Users表的数据填充到DataSet。

Mappings

Mappings可以实现对DataSet的列取别名:

objAdapter.TableMappings.Add("adbtable", "users")With objAdapter.TableMappings(0).ColumnMappings.Add("PID", "ID").Add("LastName", "LName").Add("StreetAddress", "Addy")End WithobjAdapter.Fill(ds)

当使用了以上代码以后,就可以用ds.Tables("users")来代替ds.Tables("adbtable")了。

Command Builder

在下一章我们可以看到Command Builder的具体使用和强大功能。

练习:

如果你能理解以下代码,你就可以看下一章的内容了:

<%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.Oledb" %><script language="VB" runat="server">Sub Page_Load(sender as object, e as eventargs)Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:sffsitedbusers.mdb")objConn.Open()Dim ds as Dataset = New DataSet()Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)Dim objCmdBld As New OleDbCommandBuilder(objAdapter)objAdapter.Fill(ds, "users")End Sub</script>

二、 Data Set

本章将介绍DataSet对象,DataSet对象包含内容很多,我们基本上都将涉及,包括DataTables、DataRows等。

什么是DataSet

回头看看ASP,我们知道当查询数据的时候,返回的数据是放在RecordSet中的,RecordSet只能保存返回的一个表的数据,而且它很不灵活。

DataSet在RecordSet上增加了很多功能,并且,它可以保存多个返回的数据表结果。

DataSet被分解为很多部分比如DataTables和DataRows,可以使用它们创建一个DataSet而不一定要连接到一个具体的数据库。当然,DataSet本身就是离线数据,所有的数据都可以离线使用而不必一直连接到数据库,只有需要对数据库进行编辑的时候才需要连接到数据库。

实践

Dim ds1 As New DataSet()Dim dtable As new DataTable("people")With dtable.Columns.Add("FName", System.Type.GetType("System.String")).Add("LName", System.Type.GetType("System.String")).Add("UID", System.Type.GetType("System.Int32"))End Withdtable.Columns("UID").AutoIncrement = Trueds1.Tables.Add(dtable)dim pkey() as DataColumn = {ds1.Tables("people").Columns("UID")}ds1.Tables("people").PrimaryKey = pkey

以上语句稍微有点复杂,我们来看看:

前半部分我们建立了一个DataSet和一个叫People的DataTable,然后,我们为这个DataTable加入了三个列并将"UID"列设为自动递增。最后,将这个DataTable加入到了DataSet。

第二部分我们现在不需要理解,只要知道定义了主键就可以了。

DataTables

DataTable就是一个数据表,我们可以对这个表进行如:增加数据、修改数据等操作。我们也可以通过DataSet建立一个DataTable:

Dim dtable As DataTable = ds1.Tables("people")

这样,将DataSet的表People的结构和数据拷贝到了DataTable中,尽管它是无连接的,但是仍然可以通过修改这个DataSet来更新DataSet表,因此,如果我们在dtable中增加一列并且接受改变就以实现对DataSet的修改:

Dim row as DataRow = dtable.NewRow()row(0) = "Philip"row(1) = "Quinn"dtable.Rows.Add(row)dtable.AcceptChanges

这样我们就建立了一个新的DataRow,这和用dtable.NewRow()建立一个新的数据列一样,我们还可以给这个列取名了Fname。

因为以上的DataTable来自DataSet,如果我们使用dtable.AcceptChanges方法更新DataTable,DataSet也会被更新:

<%@ Import Namespace="System.Data" %><script language="VB" runat="server">Sub Page_Load(sender as object, e as eventargs)Dim ds1 As New DataSet()Dim dtable As new DataTable("people")With dtable.Columns.Add("FName", System.Type.GetType("System.String")).Add("LName", System.Type.GetType("System.String")).Add("UID", System.Type.GetType("System.Int32"))End Withdtable.Columns("UID").AutoIncrement = Trueds1.Tables.Add(dtable)Dim dtable2 As DataTable = ds1.Tables("people")Dim row as DataRow = dtable2.NewRow()row(0) = "Philip"row(1) = "Quinn"dtable2.Rows.Add(row)dtable2.AcceptChangesResponse.Write(ds1.Tables("people").Rows(0)("FName").ToString)End Sub</script>

以上代码将显示"Philip",现在我们来看看具体过程:

1、 建立一个DataSet和一个叫"People"的DataTable;

2、 增加三个数据列并且设置它们的数据属性;

3、 将它们加入到DataSet;

4、 建立另外一个DataTable,这个DataTable是刚才建立的那个的拷贝;

5、 用DataTable建立新的DataRow并加入数据;

6、 接受数据改变同时更新了DataSet;

7、 显示第一个数据列;

DataRows

DataRow是DataTable的数据列,刚才我们已经看到,我们可以使用DataTable的以下方法建立一个新的DataRow:

ds1.Tables("people").Rows(0)("FName") = "Phil"

以上语句中,ds1.Tables("people")选择表"people",.Rows(0)选择表的第一行,("FName")选择表的字段为"Fname"。

DataRows是数据列的集合,通过以下语句取得:

Dim drow as DataRowCollection = ds1.Tables("people").Rows

对于DataRows,我们基本上不能做太多。如果针对一个具体的数据列,我们可以这样:

Dim drow2 as DataRow = drow.Item(0)

需要修改这个列的数据,可以这样:

drow2(0) = "Philip"drow2.AcceptChanges

可能说了那么多,我们都觉得比较复杂,我们来看看这个图示:

通过这个图示我们很容易就理清了DataSet、DataTable、DataRowCollection、DataRows、DataColumn和DataColumnCollection之间的相互关系。

三、 DataSet的使用

在第一章我们介绍了数据连接、执行查询等内容,第二章我们介绍了DataSet的方方面面,这一章我们将具体使用DataSet。

DataSet <-> Data Source

DataSet和Data Source通过DataAdapter进行联系,当DataSet取得数据库数据以后,就和数据库断开连接,针对数据作的所有数据修改在没有提交以前都在DataSet里面保存。

数据修改

我们将通过一个小的举例来说明数据怎样被修改和提交。

这是数据结构(Access设计)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有