1. dataAdapter对象
数据适配器对象是数据提供者OracleConnection对象和dataset对象之间的管道。它是一个非常复杂的数据读取器,也可以改变数据源。打开数据集以后,我们所有的操作都可以对数据集进行而不是对数据源进行了。
下面是使用代码新建一个OracleDataAdapter对象的例子:
Dim strConn As String = "user id=JBTTM;data source=SCUT;password=JBTTM"
Dim Conn As New OracleConnection(strConn)
Dim cmd As New OracleCommand("select * from student", Conn)
Dim oraAdapter As New OracleDataAdapter
oraAdapter.SelectCommand = cmd
oraAdapter.Fill(dst, "student")
DataGrid1.DataSource = dst.Tables("student")
我们需要注意数据适配器对象的几个属性和方法,如selectCommand等四个属性,是数据适配器对象能够使数据集完成数据查询更新等操作的关键。在使用设计工具设计适配器对象时,我们一般都可以自动设置它们。
在我们产生一个新的数据适配器的时候,SelectCommand属性会被自动设置,这是必须的。如果我们希望适配器可以完成更新类的行为,可以设置其它的Command参数,当然,后面三个insert、update和delete三个命令参数也会被设置。
下面是使用手工方法设置的例子:
cmd = New OracleCommand("INSERT INTO Dept (DeptNo, DName) " & "VALUES (:pDeptNo, :pDName)", conn)
cmd.Parameters.Add("pDeptNo", OracleType.Number, 2, "DeptNo")
cmd.Parameters.Add("pDName", OracleType.NVarChar, 14, "DName")
da.InsertCommand = cmd
OracleDataAdapter的两个方法,如Fill和Update都是重要的,前者可以将得到的数据装载到数据集的一张表中去,而后者可以用于更新一个数据集对象。Update方法的更新是基于一个Dataset的,如果我们将一个表数据绑定到一个datagrid控件,我们在修改、添加和删除数据后,只需要使用Update方法就可以将数据保存到数据库中去。
在数据的获取中,我们也可能需要使用不同的字段名,比如将英文改为中文等,这个过程尽管我们也可以修改datagrid控件的属性,但是我们也可以通过产生一个映射表的方式来完成,如下面的代码:
Dim myMap As New DataTableMapping("student", "stu")
With myMap.ColumnMappings
.Add("SID", "编号")
.Add("NAME", "姓名")
.Add("AGE", "年龄")
.Add("ADDR", "地址")
End With
OracleDataAdapter1.TableMappings.Add(myMap)
OracleDataAdapter1.Fill(DataSet11, "student")
DataGrid1.DataSource = DataSet11
DataGrid1.DataMember = "stu"
在下面所有的例子中,我们都是使用一个数据适配器对象来往数据集中填充一个表的。
2. commandBuilder对象
它可以给dataAdapter对象自动生成删除,插入和更新的属性,用于处理数据更新等操作。在不使用工具配置一个适配器对象的时候,我们一般都仅仅设置dataAdapter对象的selectCommand属性,这个时候如果进行Update方法就会出现异常,因此必须使用commandBuilder对象来设置,其设置的方法非常简单:
Dim combuild As New OracleCommandBuilder(OracleDataAdapter)
3. DataSet 对象
DataSet是数据在内存中的断开副本,它是在system.data空间中定义的,这意味着无论使用何种数据源,dataset都是一样的,它就是在内存中的一个数据库。什么时候需要使用DataSet呢?如果数据源有多个,如果在各个层之间交换数据,如果使用XML服务,如果对数据进行重复性操作和如果使用大量数据的话,建议使用Dataset对象。
这种方法取出数据需要dataAdapter作为媒介。下面是一个例子:
Dim pDs As DataSet
pDs = New DataSet
Dim pAdapter As OracleDataAdapter
pAdapter = New OracleDataAdapter("select * from sde.catalog", pConn)
pAdapter.Fill(pDs, "catalog") '将选出的数据放入一个表中
Dim i As Integer
For i = 0 To pDs.Tables(0).Rows.Count - 1
'下面的语句可以将表的结构输出
MessageBox.Show(pDs.Tables(0).Columns(i).ToString)
Next
在一个数据集中需要使用两个或以上的表的时候,我们就必须配置多个dataAdapter对象,下面的代码是有两个数据表的一个数据集对象,使用TreeView控件来控制。下面是在Load事件中:
Dim rootnode As New TreeNode("表")
TreeView1.Nodes.Add(rootnode)
Dim i As Integer
Dim j As Integer
For i = 0 To DataSet11.Tables.Count - 1
Dim tablename As New TreeNode(DataSet11.Tables(i).TableName)
rootnode.Nodes.Add(tablename)
For j = 0 To DataSet11.Tables(i).Columns.Count - 1
Dim fieldname As New TreeNode(DataSet11.Tables(i).Columns(j).ColumnName)
tablename.Nodes.Add(fieldname)
Next
Next
下面的代码在TreeView的AfterSelect事件中:
If TreeView1.SelectedNode.Text = "表" Then Exit Sub
If TreeView1.SelectedNode.Parent.Text = "表" Then
DataSet11.Clear()
OracleDataAdapter1.Fill(DataSet11)
OracleDataAdapter2.Fill(DataSet11)
DataGrid1.DataSource = DataSet11
DataGrid1.DataMember = TreeView1.SelectedNode.Text
End If
这样,当我们点击表名称节点的时候,在一边的DataGrid控件中就会出现这个表的数据。
4. dataTable对象
dataTable是dataset对象中所包含的对象,一个dataset对象可以有多个dataTable,在ADO中recordset的概念与dataTable最为接近。我们知道,在ADO中,查看数据有moveNext等语句,可以让数据游标移动,但是在ADO.NET中,却不支持游标。
我们可以在一个dataSet中新建一个dataTable,下面是代码,生成一个有两个字段的表:
ds.Tables.Add("BigTable")
ds.Tables(0).Columns.Add("ID", Type.GetType("System.Int32"))
ds.Tables(0).Columns("ID").Unique = True
ds.Tables(0).Columns.Add("Value", Type.GetType("System.Int32"))
在数据表对象中没有直接提供查找、排序和筛选的方法,但是我们可以使用它的defaultview属性来实现这个功能,后面这个属性(其实是一个视图对象),拥有Find、Sort和RowFilter方法。下面是一个使用代码,数据表已经被Fill进入了数据集对象:
Dim str As String = "SID>1003"
DataSet11.Tables(1).DefaultView.RowFilter = str
DataGrid1.DataSource = DataSet11.Tables(1)
dataTable对象本身提供了一个select方法用于选择数据,下面是一个例子:
Dim dtRow() As DataRow
Dim dr As DataRow
dtRow = DataSet11.Tables(1).Select("SID>1003", "SID DESC")
For Each dr In dtRow
ComboBox1.Items.Add(dr("name"))
Next
5. dataRow
dataRow对象是数据表中的一行记录,我们可以通过多种方式得到,新建一个数据行的代码是:
Dim drow As DataRow
drow = DataSet11.Tables(0).NewRow
然后,我们可以给这个数据行对象填入数据,最后写上下面的语句将它添加到数据表中:
DataSet11.Tables(0).Rows.Add drow
将一个数据行删除的方法有两种,一是使用remove方法,另一种是使用delete方法,当时后一种方法仅仅是将数据做上删除的标记,需要使用AcceptChange方法真正删除。
方法一:
Mytable.Rows.Remove(mytable.row(1))
方法二:
Mytable.rows(1).delete
Mytable.AcceptChange
6. dataColumn
数据列是我们使用代码新建数据表时需要产生的对象。
7. 数据关系dataRelation对象
Dataset作为一个可以容纳数据表的内存容器对象,不可避免地,这些数据中将存在关系,而关系也是dataset的一个重要属性对象。
下面是一个产生数据关系对象的代码:
Dim par As DataColumn
Dim chi As DataColumn
par = DataSet11.Tables("press").Columns("pressid")
chi = DataSet11.Tables("booklist").Columns("pressid")
Dim rel As New DataRelation("bookpress", par, chi)
DataSet11.Relations.Add(rel)
当我们使用可视化工具往一个dataset中装载进两个表的时候(每个表都需要使用一个自己的适配器,并且表拥有一些限制规则,如唯一性,主键,外键等),我们可以在数据集的架构中为两个表设置关系属性,在关系属性设置后,当我们往数据集中Fill数据的时候,需要先保证数据的限制规则不起作用,否则会出现限制问题,代码如下:
DataSet11.EnforceConstraints = False
OracleDataAdapter1.Fill(DataSet11)
OracleDataAdapter2.Fill(DataSet11)
DataGrid1.DataSource = DataSet11.PRESS
在数据装载后,我们需要使限制规则有效,再加上下面的代码:
DataSet11.EnforceConstraints = True
下面我们再来讨论一个问题:如何在一个datagrid显示主表,而在另一个datagrid中显示关联表:
'tempDt是一个临时的数据集对象
Dim tempDt As New DataSet
tempDt.EnforceConstraints = False
OracleDataAdapter1.Fill(tempDt)
OracleDataAdapter2.Fill(tempDt)
tempDt.EnforceConstraints = True
'将临时数据集合并到dataset11中去,dataset11中保存了两个表的关系pressbook
DataSet11.Merge(tempDt)
'绑定数据
DataGrid1.SetDataBinding(DataSet11, "press")
DataGrid2.SetDataBinding(DataSet11, "press.pressbook")
数据导航:
在数据显示中,我们通常都需要使用按钮来获得诸如“第一条数据”“下一条数据”等内容,其代码如下:
Dim ps As CurrencyManager
ps = Me.BindingContext(DataSet11, "press")
上面的ps可以将数据集中的press表绑定状态,而显示表的datagrid也会制动绑定ps。
第一条数据:
ps.Position = 0
最后一条数据:
ps.Position = ps.Count – 1
往后一条:
ps.Position += 1
往前一条:
ps.Position -= 1
TextBox控件的数据绑定代码:
TextBox1.DataBindings.Add("text", DataSet11, "press.name")
它绑定了数据集中一个表的某个字段。
8. dataView
数据视图对象其实是一个虚表,它可以在一个实际存在的表的基础上创建,从而生成一个新的视图供用户使用,如:
Dim pDataView As DataView
pDataView = New DataView(pDs.Tables("cate"), "d<4", "objectid", DataViewRowState.CurrentRows)
GridControl2.DataSource = pDataView
9. 往表中存入一条数据(下面的方法更简单)
Dim pDs As DataSet
pDs = New DataSet
Dim pAdapter As OracleDataAdapter
pAdapter = New OracleDataAdapter("select * from sde.catalog", pConn)
pAdapter.Fill(pDs, "catalog") '在数据集中产生一个表,
dim pTable As DataTable
Dim pRow As DataRow
pTable=pDs.Tables("catalog")
pRow = pTable.NewRow
pRow(0) = 7
pRow(1) = "aa"
pRow(2) = 1
pRow(3) = "aa"
pRow(4) = 20
pTable.Rows.Add(pRow)
pAdapter.Update(pDs, "catalog")
10. 更新一条数据(7的方法更简单)
如果我们要更新objectid=10的数据,其方法为:
Dim pRowColl As DataRow()
Dim dataRow As DataRow
Dim pTable As DataTable
pTable = pDs.Tables("catalog")
pRowColl = pTable.Select("objectid=10")
dataRow = pRowColl(0)
dataRow(1) = "bbb"
pAdapter.UpdateCommand = pCmdBui.GetUpdateCommand
pAdapter.Update(pDs, "catalog")
11. 删除一条数据
如何删除一条记录我还摸索了好半天,最好终于发现了一个简单无比的方法:
Dim pCommand As OracleCommand
pCommand = New OracleCommand
pCommand.CommandText = "delete from sde.catalog where objectid=10"
pCommand.Connection = pConn '数据库的连接
pCommand.ExecuteOracleNonQuery()
其实数据的插入也完全可以这样做的这样简单。
pCommand.CommandText = "insert into sde.catalog values(10,'aa',10,'aa',10)"
比上面的插入一条记录的方法简单多了。
12. 更新数据:
pCommand.CommandText = "update sde.catalog set name='bbc',cate_intro='bbc' where objectid=10"
13. ADO.NET中的XML
由于ADO.NET模型传递数据是使用XML结构,所以要得到我们获取的表的结构就更容易不过了
dim pXml as string
pXml=pDs.getXml
可以看看pXml的内容,是符合XML结构的数据。如果是一个dataset获取一个XML文件,也非常简单
Dim pDa as new Dataset
Dim pStreamReader as new StreamReader(“test.xml”)
pDa.readxml(pStreamReader)
dataset还有一个方法可以将xml文件直接写到文件上writeXml()。