1、与ODBC,OLE DB。ADO 可访问非关系DB多种接口,可访问关系型数据库。
2、ODBC提供了一组对数据库访问的标准API(应用程序编程接口),处理底层数据,让高层不用例会那种数据库接口。ODBC的数据源就是Access、MSSQl、Oracle、MYSQL
3、ODBC就是一种分层思想,OLE DB操作ODBC
OLE DB标准时实现一组C++API函数,OLE DB符合COM标准、基于对象的。4、(类似DAO和RDO)ADO是一种对象模型,实现与语言无关,ADO出现了OLEDB标准的API事C++API,只能提供C++语言调用。****************ADO是对oledb数据源存取API的封装,底层API效率好,不易使用,封装越高越容易使用。
5、ADO和ADO.NET是两种数据访问方式
*****************************显著区别是后者全面支持XML数据呈现*****************************ADO.NET是托管代码库,提供简单灵活的架构ADO使用OLE DB接口并基于微软的COM技术(COM是开发软件组件的一种方法,一些小的二进制可执行程序,COM组件是符合COM规范的小组件)ADO.NET拥有自己的ADO.NET接口并基于.NET体系,基于XML格式,不需要再做COM编排导致的数据类型转换。6、System.Data.SqlClient;
System.Data.Linq;7、Connection;Command使用对象向数据源发出命令;
ConmmandBuilder用于生成用于更新sql的语句,不必自己创建;(只能更新一个表,表中必须设置 主键,如果数据集是多表关联,则不可用此方法自动更新) 用法:有时候需要缓存的时候,进行一系列的操作最后一并提交数据库 ************************************************************************************ DataReader;轻量级,读取只能向前和只读的数据流 DataAdapter;执行对数据源的各种操作8、DataSet(DataTable(DataRow,DataColumn),DataRelation)
9、SqlDataReader thisReader=thisCommand.ExcuteReader();
while(thisReader.Read()) { Console.WriteLine("\t{0}\t{1}",thisReader["CustomerID"],thisReader["CompanyName"]); }10、Oracle using System.Data.OracleCline;
Access using System.Data.OleDb; 无 using System.Data.Odbc;11、DataSet对象只有一个Tables属性,填充了后才才能访问行列
myDataSet.Tables["Customrs"].Rows[n]["CompanyName"];12、SqlDaraAdapter一般用于查询,使用的时候不用con.open(),直接将数据fill到dataset中
SqlCommand 一般用于非查询,也可以用于查询。需要con.open(),使用完要关闭13、SqlDataAdapter thisAdapter=new SqlDataAdpter("Select CutomerID,CompanyName From Customers",thisConnection);
SqlCommandBuilder thisBuilder=new SqlCommandBuilder(thisAdapter); DataSet thisDataSet=new DataSet(); thisAdapter.Fill(thisDataSet,"Customers"); ---------------------------------------填充完了DataSet后就可以访问其中的行和列了 Console.WriteLine("name before change:{0}",thisDataSet.Tables["Customer"].Rows[9] ["CompanyName"]);14、DataRow thisRow=thisDataSet.Tables["Customer"].NewRow(); thisRow["CustomerID"]="ZACIZ"; thisRow["CompanyName"]="Zachary Ztither ltd"; thisDataSet.Tables["Customers"].Rows.Add(thisRow); Console.WriteLine("#rows after change:{0}",thisDataSet.Tables ["Customers"].Rows.Count);15、DataSet是内存中非连接的数据副本,DataAdapter负责连接到磁盘上的数据库,因此需要调用它的
Update()方法才能使DataSet中的内存数据与磁盘上的数据同步。16、DataTable对象Row集合提供了Find(); 来检查要添加的行是否已经存在,若为空则进行更改。
???????????????????????????????????????
17、Delete();方法不用来删除行,仅仅用来标记将要删除的行。18、DataRelation用于描述DataSet中的多个DataTables对象的关系。每个对象都包含DataRelations的Relations集合,以查找和操纵相关的表。
19、DataSet中访问多个表
----------------------------------------------------------------------------------- DataSet thisDataSet=new DataSet(); SqlDataAdapter custAdapter=new SqlDataAdapter("Select * from Customers",thisConnect); SqlDataAdapter orderAdapter=new SqlDataAdapter("Select *form Orders",thisConnect); custAdapter.Fill(thisDataSet,"Customers"); orderAdapter.Fill(thisDataSet,"Orders"); ----------------------------------------------------------------------------------- DataRelation custOrderRel=thisDataSet.Relations.Add("Customer", thisDataSet.Tables["Customer"].Columns["CustomerID"] thisDAtaSet.Tables["Customer".Columns["CustomerID"]]);//创建DataRelation并连到DataSet20、ADO.NET中XML主要集中于DataSet对象,因为XML主要关注的是关系和分层的结构话数据。
DataSet中有7个用于处理XML的方法,最容易使用的是WriteXml(); thisDataSet.WriteXml("nwinddata.xml"); ReadXml()方法也可以用于将XML文件的内容读取到DataSet中21、ExecuteScalar()要从sql查询中返回一个值
ExecuteNonQuery()类似Insert、Update、Delete的数据修改操作22、调用存储过程
SqlCommand thisCommand=thisConnection.CreateCommand(); thisCommand.CommandType=CommandType.StoredProduce; thisCommand.Command.Text="Ten Most Expensive Producets"; SqlDataReader thisReader=thisCommand.ExecuteReader(); while(thisReader.Read()) { Console.WriteLine("\t{0}\t{1}",thisReader{"TenMostExpensiveProducts",thisReader ["UnitePrice"]}); } thisReader.Close();23、ExecuteNonQuery();执行命令,返回影响的行数。int rowsReturned=com.ExecuteNonQuery; ExecuteReader();执行命令返回一个类型化的IDataReader; ExecuteScalar();执行命令,返回结果集中第一行第一列的值。 SqlCommand cmd= new SqlCommand(str,con); object o=cmd.ExecuteScalar(); Console.WriteLine(o);24、ExecuteXmlReader();只用于SqlClient提供程序 给调用者返回一个XmlReader对象 Using System.Xml;//必须导入命名空间 public static void Main(string [] args) { string source="连接字符串"; string select="select * from Works" SqlConnection conn=new SqlConnetion(source); conn.open(); SqlCommand cmd=new SqlCommand(select,conn); XmlReader xr=cmd.ExecuteXmlReader(); xr.Reader(); string data; do { data=xr.ReadOuterXml(); if(!string.IsNullOrEmpty(data)) Console.WriteLine(data); }while(!string.IsNullOrEmpty(data)); conn.close(); }25、DataColumn customerID=new DataColumn("CustomerID",typeof(int));
CustomerID.AllowDBNull=false; //设置不可以为空 CustomerID.ReadOnly=false; CustomerID.AutoIncrement=true; //自动增长 CustomerID.AutoIncrementSeed=1000;// 最初的种子值;递增量默认为1 AutoIncrementStep //DefaultValue可以定义列的默认值;Expression定义所计算的列中使用的表达式 DataColumn name=new DataColumn("Name",typeof(string)); name.AllowDBNull=false; name.Unique=true;26、访问数据行用DataRow来访问,需要引入SqlDataAdapter类
SqlDataAdapter da=new SqlDataAdapter(select,conn); DataSet ds=new DataSet(); da.Fill(ds,"Customers"); ---------------------------使用DataRow类的索引器访问数据行的值,遍历 foreach(DataRow row in ds.Tables["Customers"].Rows) Console.WriteLine("'{0}'from {1}",row[0],row[1]); --------------------------------------ds.Tables[表名].Rows[行][列]27、给数据表添加架构(列),没有包含可空的列,这个仅限于内存,不是添加到数据库中。
DataTable products=new DataTable("Products"); Products.Columns.Add(new DataColumn("ProductID",typeof(int))); Products.Columns.Add(new DataColumn("ProductName",typeof(int))); ds.Tables.Add(products); Products.Columns.Add(new DataColumn("Supplier",typeof(int)));28、DataRow中的版本功能,可以接收某一特定行上指定列的各个值
Current 列中目前存在的值,如果没有进行编辑,该值与初值相同,如果编辑了,该值就是最后有效值 Default 列的任何默认值设置 Original 最初从数据库中出来的列值,如果调用DataRow类的AcceptChanges方法,该值更新为Current Proposed29、fo