首页 > 代码库 > C#学习笔记 ----核心ADO.NET(第30章)

C#学习笔记 ----核心ADO.NET(第30章)

ADO(Active Data Object)是一个COM组件库

 

DataSet 这个对象主要用于断开连接,它可以包含一组DataTable,以及这些表之间的关系

DataTable 数据的一个容器,DataTable由一个或多个DataColumn组成,每个DataColumen由一个或多个包含数据的DataRow组成

DataRow 许多数值,类似于数据库表的一行,或电子表格中的一行

DataColumn 该对象包含列的定义,如名称和数据类型

DataRelation DataSet类中两个DataTable类之间的链接,用于外键和主/从关系

Constraint 为DataColumn类(或一组数据列)定义规则,如唯一值

DataColumnMapping 将数据库中的列名映射到DataTable中的列名

DataTableMapping 将数据库中的表名映射到DataSet中的DataTable

 

SqlCommand、OleDbCommand和ODBCCommand用作SQL语句或存储过程调用的包装器

SqlCommandBuilder、OleDbCommandBuilder和ODBCCommandBuilder 用于从一条SELECT语句中生成SQL命令(如INSERT、UPDATE和DELETE语句)

SqlConnection、OleDbConnection和ODBCConnection用于连接数据库

SqlDataAdapter、OleDbDataAdapter和ODBCDataAdapter用于存储select、insert、update和delete命令的类,因此可以用于填充DataSet和更新数据库

SqlDataReader、OleDbDataReader和ODBCDataReader用作只向前的连接数据读取器

SqlParameter、OleDbParameter和ODBCParameter用于为存储过程定义一个参数

SqlTransaction、OleDbTransaction和ODBCTransaction用于数据库事务,包装在一个对象中

 

使用数据库连接

using System.Data.SqlClientstring source = "server=(loacal);"+"integrated security=SSPI;"+"database=Northwind";SqlConnection conn = new SqlConnection(source);conn.Open();//Do something usefulconn.Close();

integrated security=SSPI:这个参数使用Windows Authentication连接到数据库,最好在源代码中使用这个参数,而不是用户名和密码

 

管理数据库连接字符串,使用配置文件中的<connectionString>

private DbConnection GetDatabaseConnection(string name){    ConnectionStringSettings settings = ConfigurationManger.ConnectionStrings[name];    DbProviderFactory factory = DbProviderFactories.GetFactory(settings.ProviderName);    DbConnection conn = factory.CreateConnection();    conn.ConnectionString = settings.ConnectionString;    return conn;}

 

高效的使用连接

1.利用 try...catch...finally语句块

try{    //Open the connection    conn.Open();    //Do something useful}cath(SqlException ex){    //Log the exception}finally{    //Ensure that the connection is freed    conn.Close();}

2.使用using语句块

string source = "server=(loacal);"+"integrated security=SSPI;"+"database=Northwind";using(SqlConnection conn = new SqlConnection(source)){    //Open the connection    conn.Open();    //Do something useful}

组合使用

try{    using(SqlConnection conn = new SqlConnection(source))    {        //Open the connection        conn.Open();        //Do something useful        //Close it myself        conn.Close();    }}catch(SqlException e){    //Log the exception}

 

事务

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)){    using(SqlConnection conn = new SqlConnection(source))    {        //Do something in SQL        .        //Then mark complete        scope.Complete();    }}

在使用事务作用域时,可以选择在该事务中执行的命令的独立级别 ReadCommitted、ReadUncommitted、RepeatableRead、Serializable

 

命令

<provider>Command类有一个CommandType属性,一下列举CommandType枚举

string select = "SELECT ContactName FROM Customers"SqlCommand cmd = new SqlCommand(select,conn);SqlCommandcmd = new SqlCommand("CustOrderHist",conn);cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add("@CustomerID","QUICK");OleDbCommand cmd = new OleDbCommand("Categories",conn);cmd.CommandType = CommandType.TableDirect;

<provider>Command类提供下述可执行命令:

ExecuteNonQuery() --执行命令,但不返回任何结果

ExecuteReader() --执行命令,返回一个类型化的IDataReader

ExecuteScalar() --执行命令,返回结果集中第一行第一列的值

除了上述命令,SqlCommand类也提供了下面的方法:

ExecuteXmlReader() --执行命令,返回一个XmlReader对象

 

ExecuteNonQuery() 一般用于UPDATE、INSERT或DELETE语句,其中唯一返回值是受影响的记录个数。但如果调出带输入参数的存储过程,该方法就有返回值

数据读取器

public class DataReaderExample{    public static void Main(string[] args)    {        string source = "Provider=SQLOLEDB;"+                "server=(local);"+                "integrated security=SSPI;"+                "database=northwind";        string select = "SELECT ContactName,CompanyName FROM Customers";        OleDbConnection conn = new OleDbConnection(source);        conn.Open();        OleDbCommand cmd = new OleDbCommand(select,conn);        OleDbDataReader aReader = cmb.ExecuteReader();        while(aReader.Read())            Console.WriteLine("‘{0}‘ from {1}",aReader.GetString(0),aReader.GetString(1));        aReader.Close();        conn.Close();    }}

 

DataSet类是数据的脱机容器

设置主键

DataColumn[] pk = new DataColumn[1];pk[0] = dt.Columns["ProductID"];dt.Constraints.Add(new UniqueConstraint("PK_Products",pk[0]));dt.PrimaryKey = pk;

设置外键

DataColumn parent = ds.Tables["Categories"].Columns["CategoryID"];DataColumn child = ds.Tables["Products"].Columns["CategoryID"];ForeignKeyConstraint fk = new ForeignKeyConstraint("FK_Product_CategoryID",parent,child);fk.UpdateRule = Rule.Cascade;fk.DeleteRule = Rule.SetNull;ds.Tables["Products"].Constraints.Add(fk);

 

填充DataSet类

用数据适配器填充DataSet

string select = "SELECT ContactName,CompanyName FROM Customers";SqlConnectioin conn = new SqlConnection(source);SqlDataAdapter da = new SqlDataAdapter(select,conn);DataSet ds = new DataSet();da.Fill(ds,"Customers");

从XML中填充DataSet类

DataSet ds = new DataSet();ds.ReadXml(".\\MyData.xml");

 

C#学习笔记 ----核心ADO.NET(第30章)