针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2656211 建立时间:2005年1月1日 |
|

| |
ADO.NET学习笔记
|
作者: firerainbow 加入时间: 2005-01-10 文档类型: 转载 来自: 浏览统计: total: 47 year: 47 quarter: 47 month: 47 week: 25 today: 4
最近几天一直在图书馆里面看《ADO.NET实用指南》,发现真是一本好书。读书自然就有心得,本人就根据书的线索,把自己的学习体会主要以代码的形式记录下来。(书上对应代码在http://www.adoguy.com/book里)
1、连接 ADO.NET最大的特色就在于支持在断开连接的情况下对数据库里的内容进行操作,这样可以大大的节约过多连接带来的消耗,前面的那一篇文章中已经给了一个具体的例子说明ADO.NET的这种特性。我们可以在从数据库里获得数据的时候打开连接,在得到数据之后就断开连接,对dataset里面的数据进行操作,然后在把dataset里的内容更新到数据库里面的时候再打开连接。对于dataReader则必须一直保持连接。 使用这种特性的时候有几点要注意一下: (1)更改连接属性的时候必须断开连接 (2)切换数据库的时候选择conn.changeDatabase(dbName),减少断开连接与新建连接往返带来的消耗 ADO.NET同时支持数据库自带连接池。在一个连接关闭之后,连接会在池中保持一段时间,然后才实际的关闭,如果在超时之前,有人请求建立相同的连接,就将打开的连接分配给请求者,这对于经常进行打开和断开的连接可以减少很多的消耗。不过在SQL SERVER 2000中采用集成安全性的连接无法入池。 连接涉及到的事件有Dispose,InfoMessage,StateChange,在MSDN可以查到,不再赘述。 模板代码: Dim conn As SqlConnection conn=New SqlConnection("……") '里面为连接字符串 conn.open() '进行相应的操作 conn.close()
2、Command对象 ADO.NET允许以三种不同的方式获取数据库里面的数据Command,DataSet,DataReader,Command是最基本的方法,通过执行SQL命令的形式获得数据。
(1)创建 可以用两种方式创建 a、创建新的Command对象 Dim cmd As New SqlCommand cmd.connection=conn cmd.CommandText="SELECT * FROM Customer" b、获得对conn中command对象的引用 Dim cmd As SqlCommand cmd=conn.createCommand(); cmd.CommandText="SELECT * FROM Customer" 推荐第二种方法
(2)执行 四种执行方式 ExecuteNonQuery() 返回受命令影响的行数 ExecuteScalar() 返回第一行第一列(使用与集函数) ExecuteReader() 返回一个DataReader对象 ExecuteXmlReader()返回一个XmlReader对象
(3)参数 主要是用在存储过程中,有复杂和精简两种形式 复杂方法: Dim param As new SqlParameter("@Return",SqlDbType.Int) param.Direction=ParameterDirection.ReturnValue cmd.Parameters.Add(param) 精简方法 cmd.Parameters.Add("@Return_value",DbType.Int32).Direction=ParameterDirection.ReturnValue 建议:如果需要处理输出值时的时候使用参数,只处理输入值的时候就不用使用参数了。
(4)事务 用SQL语句: Begin TRAN SQL操作 If @@ERROR <>0 Begin RollBack TRAN Return @@ERROR End Commit TRAN Return 0 在ADO.NET中编写事务 cmd.Transaction = conn.BeginTransaction() try { cmd.CommandText="..." cmd.ExecuteNonQuery() cmd.Transaction.commit() } catch(Exception ex) cmd.Transaction.Rollback() End try 如果希望将数据库事务处理与一些外部系统结合起来(比如在数据库更新时同时进行了WEB更新,如果WEB更新失败希望回滚事务时),选择客户端编写事务处理(用ADO.NET编写) 仅仅做数据库事务处理的话就直接在服务端写事务语句(在SQL SERVER2000 中写事务) 在事务中可以创建SavePoint来实现部分事务回滚 cmd.Transaction.save("New Customer") cmd.Transaction.Rollback("New Customer")
(5)批处理查询 如果有多条SQL语句并且可以一起执行的话,就可以进行批处理查询。在DataReader中支持批处理查询获得的数据集。 cmd.CommandText="SELECT * FROM Customer;SELECT * FROM Inovince;" Dim rdr As SqlDataReader rdr=cmd.ExecuteReader() rdr中即包含两个SQL语句执行的结果
3、DataReader对象 DataReader对象只能对查询获得的数据集进行自上而下的访问,但效率很高。如果仅仅是访问数据的话,可以使用DataReader。但DataReader要求一直连接,所以将结果的一小部分先放在内存中,读完后再从数据库中读取一部分,相当于一个缓存机制。这对于查询结果百万级的情况来说,带来的好处是显而易见的。 模板代码: Do While rdr.Read() Console.WriteLine(rdr(0)) '也可输出rdr("CustomerID") Loop 如果要进行类型限制的话可以输出(String)rdr(0)或rdr.GetString(0) 从DataReader里读出数据的时候要注意属性是否为空,如果属性可以为空,则读出数据时应进行判断 If Not rdr.IsDBNull(0) Console.writeLine(...)
用DataReader读取记录时,数据库默认上锁,可以通过更改DataReader的默认属性改变。
如果DataReader里面的数据是批处理语句执行得到的话,可以通过NextResult访问 模板代码: Do Do While rdr.Read() Console.WriteLine(rdr(0)) Loop Loop While rdr.NextResult()
处理元数据(显示每个属性的情况) Dim schema As DataTable schema=rdr.GetSchemaTable() '得到元数据表,表里的每列对应每个属性的特性集合 对于每一列属性对应的row,通过row("DataType")获得这列属性的数据类型。 |
|
一个经典的ADO.NET入门例子
|
作者: firerainbow 加入时间: 2005-01-10 文档类型: 转载 来自: 浏览统计: total: 32 year: 32 quarter: 32 month: 32 week: 12 today: 3
众所周知,ADO.NET相对于ADO的最大优势在于对于数据的更新修改可以在与数据源完全断开联系的情况下进行,然后再把数据更新情况传回到数据源。这样大大减少了连接过多对于数据库服务器资源的占用。下面是我在《ADO.NET实用指南》这本书上看到的一个例子,比较清楚的讲解了ADO.NET的使用方法。
Imports System.Data.SqlClient Imports System.Data Imports System.Data.Common
Public Class Form1 Inherits System.Windows.Forms.Form
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim conn As New SqlConnection("data source=localhost;initial catalog=StudentCourse;" & _ "User ID=;Password=;") Dim ds As New DataSet Try conn.Open() '在形成SqlDataAdapter前打开conn Dim daAuthors As New SqlDataAdapter("Select * From SC", conn) Dim bldr As New SqlCommandBuilder(daAuthors) daAuthors.Fill(ds,"SC") conn.Close() '在填充完ds后关闭连接,接着对ds进行操作
Dim tbl As New DataTable tbl = ds.Tables("SC")
Dim rowVals(3) As Object rowVals(0) = "5" rowVals(1) = "00003" rowVals(2) = "0001" rowVals(3) = 99 Dim insertedRow As DataRow insertedRow = tbl.Rows.Add(rowVals) '添加一行
tbl.Rows(0).Delete() '删除一行
tbl.Rows(1).BeginEdit() tbl.Rows(1)("score") = 89 '修改一行 tbl.Rows(1).EndEdit()
conn.Open() daAuthors.Update(ds.Tables("SC")) '须将结果传回数据源时打开连接,update conn.Close() Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class |
|
Dataset初步
|
作者: 幻想曲 加入时间: 2005-01-12 文档类型: 原创 来自: 浏览统计: total: 46 year: 46 quarter: 46 month: 46 week: 13 today: 2
在一个DataSet中储存多个数据表 我们在ASP中很多人习惯于使用RecordSet对象来操作数据库,但是RecordSet有一个的缺点就是一个RecordSet只能储存一个数据表,当我们需要操作多个表时,不得不在多个RecordSet中来回操作,虽然这些在使用习惯后也没有什么,但是对一个新手来说,这也是一个很麻烦人的事情。光是那些变量名就可以搞浑你,现在好了,在ASP.Net中,只需要一个DataSet就可以完成一切。大大的方便了我们的程序。先看一段程序,再来细细讲解。
代码拷贝框 <% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.ADO" %>
<Script Language="C#" Runat="Server">
public void Page_Load(Object src,EventArgs e)
{
//联结语句
string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=D:\test.mdb;";
string strComm1 = "select * from UserList";
string strComm2 = "select * from BookList";
//打开一个联结
ADOConnection MyConnection = new ADOConnection(MyConnString);
//打开两个DataSetCommand
ADODataSetCommand MyComm1 = new ADODataSetCommand(strComm1,MyConnection);
ADODataSetCommand MyComm2 = new ADODataSetCommand(strComm2,MyConnection);
DataSet MyDataSet = new DataSet();
//把UserList,BookList表存入DataSet
MyComm1.FillDataSet(MyDataSet,"UserList");
MyComm2.FillDataSet(MyDataSet,"BookList");
DataGrid1.DataSource = MyDataSet.Tables["UserList"].DefaultView;
DataGrid2.DataSource = MyDataSet.Tables["BookList"].DefaultView;
DataGrid1.DataBind();
DataGrid2.DataBind();
}
</script>
<html>
<head>
<title></title>
</head>
<body>
<table>
<tr>
<td>
<ASP:DataGrid id="DataGrid1" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
</td>
<td>
<ASP:DataGrid id="DataGrid2" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Name="Verdana"
Font-Size="8pt"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="#eeeeee"
/>
</td>
</tr>
</table>
</body>
</html>
[Ctrl+A 全部选择 然后拷贝]
在上面的例子中,我们打开了一个名为test.mdb的Access数据库,然后把他其中的两个表"UserList"和"BookList"使用两个DataGrid控件显示出来。 我们现在来分析一下代码: string MyConnString = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=D:\test.mdb;"; string strComm1 = "select * from UserList"; string strComm2 = "select * from BookList"; ADOConnection MyConnection = new ADOConnection(MyConnString); ADODataSetCommand MyComm1 = new ADODataSetCommand(strComm1,MyConnection); ADODataSetCommand MyComm2 = new ADODataSetCommand(strComm2,MyConnection); 这些都只是在作一些准备工作,打开一个联结,并且打开两个DataSetCommand取得两个表的数据。 DataSet MyDataSet = new DataSet(); 这是我们程序的关键之地,这里打开了我们要操作的DataSet对象。下面我们就需要将数据表的内容填入DataSet了。 MyComm1.FillDataSet(MyDataSet,"UserList"); MyComm2.FillDataSet(MyDataSet,"BookList"); 在一个DataSet中可以包含多种数据,这里我们是往这个名为MyDataSet的DataSet中存放了两个数据库表,其实只要愿意,我们还可以在里面插入XML数据,而且他们是不会出现冲突的。 再下面的代码,就是把MyDataSet的数据传送给DataGrid控件显示。这里就不多说了。 这里我们只是简单的说了一下DataSet能存放多个数据表的功能,大家看看好像没有什么特别的。这里看起来确实好像没有什么特别的功能,但是如果配上DataSet中的修改、添加、删除功能,我们操作数据库就变得很简单。我们可以先将数据库读入DataSet,然后在DataSet中修改数据,如果改得觉得不满意,我们还可以使用RejectChanges方法全面恢复,最后一并交给去数据库去更新。下面我们来看看如何利用DataSet和DataAdapter来操作数据库 MyConnection.Open(); //打开数据库 MyCommand.Connection = MyConnection; //设置Command MyCommand. CommandText = “select * from [admin]”; //设置Command OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter(); //定义OleDbDataAdapte对象 MyDataAdapter.SelectCommand = MyCommand; //设置OleDbDataAdapte对象的SelectCommand属性 System.Data.DataSet MyDataSet = new System.Data.DataSet(); //定义DataSet MyDataAdapter.Fill(MyDataSet,"admin"); //通过OleDbDataAdapte对象的SelectCommand属性填充MyDataSet MyConnection.Close(); //关闭数据库
整个过程分以下几步: 1.建立数据库连接 2.建立OleDbDataAdapter对象! 3.实例化OleDbDataAdapter对象! 4.建立一个DataSet对象,执行SQL语句得到的表添加到其中 5.关闭数据库连接 通过上面的步骤我们就可以使用DataBind将DataSet中的数据绑定到特定的控件上了! 我们利用DataSet和DataAdapter能够更加方便的对数据库进行操作,如何通过OleDbDataAdapter来执行数据库的操作?我们只需要对DataSet中的数据进行增加、删除、修改等操作,然后在将DataSet提交给数据库即可。 //利用利用DataSet和DataAdapter操作数据库 public Boolean DoDB() { MyConnection.Open(); //打开数据库 MyCommand.Connection = MyConnection; MyCommand. CommandText = “select * from admin”; OleDbDataAdapter MyDataAdapter = new OleDbDataAdapter(); MyDataAdapter.SelectCommand = MyCommand; System.Data.DataSet MyDataSet = new System.Data.DataSet(); MyDataAdapter.Fill(MyDataSet,"admin"); //通过OleDbDataAdapte对象的SelectCommand属性填充MyDataSet
OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter);//关联DataSet和数据库的操作的,必不可少 foreach(DataRow dr in MyDataSet.Tables["Admin"].Rows) { if(dr["Admin_Code"].ToString().Trim().Equals("a")) { dr.Delete(); //删除DataSet 中的行 } } MyDataSet.Tables["Admin"].Rows[0][0] = "ss";//更新DataSet中第一行第一列的值 string [] dd = new String[3]{"a","b","v"}; MyDataSet.Tables["Admin"].Rows.Add(dd);//增加一行 MyDataAdapter.Update(MyDataSet,"Admin");//将DataSet中”Admin”表中的数据提交给数据库,完成数据库的更新 MyConnection.Close();//关闭数据库 }
这个程序同Command的delete、insert、update例程是执行同样的功能的,我这里改成了用MyDataAdapter来达到同样的效果!
要通过MyDataAdapter执行对数据库的操作,要有下面的几步:
1. 建立数据库连接MyConnection 2. 实例化OleDbDataAdapter对象! 3. 建立一个DataSet对象,并把执行select语句得到的记录添加到其中 4. 建立OleDbCommandBuilder对象! 并让它与我们前面的OleDbDataAdapter对象关联!语句如下:OleDbCommandBuilder MyCommandBuild = new OleDbCommandBuilder(MyDataAdapter); 5. 对DataSet中包含表的特定记录进行增加、删除、修改
6. 执行OleDbDataAdapter对象的Update命令更新数据库,语句如下: MyDataAdapter.Update(ds,"notes"); 7. 关闭数据库连接
总结: DataSet是ADO.NET中非常重要的内容,也是ADO.NET和ADO的区别的一个重要表现,特别适合成批的数据操作,也是数据棒定的重要来源。OleDbDataAdapter是DataSet和数据源之间建立联系的一个桥梁,要熟练的使用DataSet我们需要熟练的掌握OleDbDataAdapter。 |
|
|