原文地址:http://www.dingos.cn/index.php?topic=1431.0
【简介】
【ADO.NET 结构】
【ADO.NET 的基本组件】
【.NET 数据提供程序】
【Connection 对象】访问 ADO.NET 中的数据的最重要组件;指定连接到所需数据库时需要的详细信息;连接过程取决于要访问的数据库;
Connection 对象包含下列两个对象
Connection 对象包含下列两个对象
- SqlConnection
引入:"System.Data"、"System.Data.SqlClient"命名空间。
引用sqlcon = new SqlConnection ("server=SQLDB; uid=sa; pwd=password; database=NorthWind"); - OleDbConnection
引入:"System.Data"、"System.Data.OleDb"命名空间。
引用adocon=new OleDbConnection("Provider=SQLOLEDB; Data Source=SQLDB; Initial Catalog=NorthWind; User Id=sa; pwd=password");
【Command 对象】在建立连接后使用;要访问数据,用户需要命令数据库获取所需数据;查询被传递给数据库以获取记录
Command 对象包含下列两个对象
Command 对象包含下列两个对象
- SqlCommand
引用SqlDataAdapter sqlcom = new SqlCommand("select * from Customers", sqlcon); - OleDbCommand
OleDbCommand mycommand = new OleDbCommand ("select * from Customers WHERE city=‘London’", adocon);
【DataReader】用于从数据源获取只读和只进数据
Command.ExecuteReader 从数据源中获取行
Read 方法用于从查询结果中读取行提供了一组方法,可用于访问本机数据类型的列值
SqlConnection sqlconn =
Command.ExecuteReader 从数据源中获取行
SqlDataReader newSqlReader = myCommand.ExecuteReader();
Read 方法用于从查询结果中读取行提供了一组方法,可用于访问本机数据类型的列值
SqlConnection sqlconn =
new SqlConnection ("server=TEST//TEST; uid=sa; pwd=passwd; database=NorthWind");
SqlCommand commnd =
new SqlCommand("SELECT productid,productname from products where supplierid=1", sqlconn);
commnd.Connection.Open();
SqlDataReader newSqlReader = commnd.ExecuteReader();
while (newSqlReader.Read()){
MessageBox.Show(newSqlReader.GetInt32(0)+", "+ newSqlReader.GetString(1));
}
newSqlReader.Close();
commnd.Connection.Close ();
SqlCommand commnd =
new SqlCommand("SELECT productid,productname from products where supplierid=1", sqlconn);
commnd.Connection.Open();
SqlDataReader newSqlReader = commnd.ExecuteReader();
while (newSqlReader.Read()){
MessageBox.Show(newSqlReader.GetInt32(0)+", "+ newSqlReader.GetString(1));
}
newSqlReader.Close();
commnd.Connection.Close ();
【获取单个值】ExecuteScalar方法获取第一行第一列的值。
SqlCommand ordersCMD = new SqlCommand("SELECT Max(Quantity) FROM [Order details]", sqlconn);
SqlCommand ordersCMD = new SqlCommand("SELECT Max(Quantity) FROM [Order details]", sqlconn);
ordersCMD.Connection.Open();
int count = Convert.ToInt32 (ordersCMD.ExecuteScalar());
MessageBox.Show (count.ToString ());
ordersCMD.Connection.Close ();
int count = Convert.ToInt32 (ordersCMD.ExecuteScalar());
MessageBox.Show (count.ToString ());
ordersCMD.Connection.Close ();
【执行目录操作】与查询不同,目录操作不返回任何行。
Command 对象提供 ExecuteNonQuery 方法。
//修改数据库或目录
Command 对象提供 ExecuteNonQuery 方法。
//修改数据库或目录
string createStr = "CREATE PROCEDURE InsertCust "+
"(@ComNameEmpName nchar(20), @Identity int OUT ) AS INSERT INTO Customers (CompanyName)" +
" VALUES(@ComNameEmpName) SET @Identity = @@Identity RETURN @@ROWCOUNT;”;
SqlCommand createCMD = new SqlCommand(createStr, sqlconn);
createCMD.Connection.Open ();
createCMD.ExecuteNonQuery();
"(@ComNameEmpName nchar(20), @Identity int OUT ) AS INSERT INTO Customers (CompanyName)" +
" VALUES(@ComNameEmpName) SET @Identity = @@Identity RETURN @@ROWCOUNT;”;
SqlCommand createCMD = new SqlCommand(createStr, sqlconn);
createCMD.Connection.Open ();
createCMD.ExecuteNonQuery();
【修改数据库中的数据】使用 Insert、Update 或 Delete;使用 ExecuteNonQuery 方法
SqlConnection nwindConn =
SqlConnection nwindConn =
new SqlConnection("Data Source = TEST; Integrated Security= SSPI;Initial Catalog = NorthWind;");
nwindConn.Open();
string insertStr =
"INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')";
SqlCommand insertCMD = new SqlCommand(insertStr, nwindConn);
Int32 recordsAffected = insertCMD.ExecuteNonQuery();
MessageBox.Show("Records added");
MessageBox.Show(recordsAffected.ToString ());
nwindConn.Open();
string insertStr =
"INSERT INTO Customers (CustomerID, CompanyName) Values('NWIND', 'Northwind Traders')";
SqlCommand insertCMD = new SqlCommand(insertStr, nwindConn);
Int32 recordsAffected = insertCMD.ExecuteNonQuery();
MessageBox.Show("Records added");
MessageBox.Show(recordsAffected.ToString ());
【DataAdapter】
【.NET 数据提供程序事件】
【数据集】ADO.NET 非连接结构的重要组件。
是数据的逻辑显示,它只显示信息,而不考虑数据源;旨在访问任何数据源;使用 XML 管理数据
是数据的逻辑显示,它只显示信息,而不考虑数据源;旨在访问任何数据源;使用 XML 管理数据
【使用 C# 代码创建数据集】调用数据集构造函数;指定数据集的名称;默认名称是 NewDataSet;如果使用“数据窗体向导”创建数据窗体,将自动创建数据集。
DataSet empDS = new DataSet("EmpDetails");
DataSet empDS = new DataSet("EmpDetails");
【类型化和非类型化数据集】
类型化数据集
类型化数据集
- 用于创建项目中已经存在的数据集的实例
- 继承所有方法、事件和属性
- 使用基于集合的方法帮助直接访问表名和列名
- 提高代码的可读性
- 它也是从基本 DataSet 类继承而来
- 表和列不能用于使用 XML 架构文件派生新类
【DataTable】表示数据集中的一个表
ADO.NET 库的中心对象之一
数据集和 DataView 在使用时需要访问 DataTable 对象
ADO.NET 库的中心对象之一
数据集和 DataView 在使用时需要访问 DataTable 对象
【创建 DataTable】使用 DataTable 构造函数创建
使用DataTableCollection集合
使用DataTableCollection集合
// 创建DataTable的一个实例empTable,后将它添加到empDS表集合中。
DataSet empDS = new DataSet();
DataTable empTable = empDS.Tables.Add("EmpTable");
DataTable empTable = empDS.Tables.Add("EmpTable");
【向 DataTable 中添加列】使用 DataColumn 构造函数创建 DataColumn 对象。
DataTable empTable = new DataTable("Emp");
DataColumn emCol = empTable.Columns.Add("EmpNo", type(Int32));
empCol.AllowDBNull = false;
empCol.Unique = true;
empTable.Columns.Add("EmpName", typeof(String));
empTable.Columns.Add("Sal", typeof(Double));
DataColumn emCol = empTable.Columns.Add("EmpNo", type(Int32));
empCol.AllowDBNull = false;
empCol.Unique = true;
empTable.Columns.Add("EmpName", typeof(String));
empTable.Columns.Add("Sal", typeof(Double));
【向 DataTable 中添加行】使用 NewRow 方法。
// 创建一个新行,并且把各列的值设置成对象数组里的值。
约束决定了可驻留在表中的数据
ADO.NET 中有两种约束
// 创建一个新行,并且把各列的值设置成对象数组里的值。
DataRow empRow = empTable.NewRow();
empRow["EmpName"] = "Smith";
empRow[1] = "Smith";
empTable.Rows.Add(empRow);
empTable.Rows.Add(new object[]{1, "Smith"});
empRow["EmpName"] = "Smith";
empRow[1] = "Smith";
empTable.Rows.Add(empRow);
empTable.Rows.Add(new object[]{1, "Smith"});
DataRow empRow;
for(int index = 0; index <= 4; index++){
empRow = empTable.NewRow();
empRow[0] = index;
empRow[1] = "EmpName" + index.ToString();
empTable.Rows.Add(empRow);
}
empRow = empTable.NewRow();
empRow[0] = index;
empRow[1] = "EmpName" + index.ToString();
empTable.Rows.Add(empRow);
}
【DataTable 的约束】加在表上的规则集
约束决定了可驻留在表中的数据
ADO.NET 中有两种约束
- ForeignKeyConstraint
操纵数据时维护两个相关表之间的完整性 - UniqueConstraints
维护表的数据完整性,确保记录具有唯一标识
【DataView】提供 DataTable 的视图,可用于排序、筛选和搜索
可用于查看 DataTable 中存储的数据的子集
同一 DataTable 上可以有两个控件,可提供数据的不同视图
存储在 DataTable 中的数据的显示层
可用于查看 DataTable 中存储的数据的子集
同一 DataTable 上可以有两个控件,可提供数据的不同视图
存储在 DataTable 中的数据的显示层
【DataRelation】
DataRelation 对象的功能:
DataRelation 对象的功能:
- 在处理父记录时提供详细记录,反之亦然
- 强制实施引用完整性
【访问相关记录】
int rowCtr;
DataRow[] drarray;
rowCtr = 0;
drarray = dsCustId.Orders[rowCtr].GetChildRows("CustId");
rowCtr = 0;
drarray = dsCustId.Orders[rowCtr].GetChildRows("CustId");
【数据绑定】
【绑定类型】ADO.NET 支持两种类型的数据绑定
- 简单数据绑定
可以在任何时候将数据集中的单个值绑定到任何控件
DataTable dttable = DataSet.Tables["Orders"];TextBox txtAmt = new TextBox();
txtAmt.Bindings.Add("Text", dttable, "OrderAmt"); - 复杂数据绑定
组件可绑定到完整的数据集
DataGridView 和 ComboBox 支持此功能
DataTable dttable = DataSet.Tables["Customers"];ComboBox cmbCustId = new ComboBox();
cmbCustId.DataSource = dtable;
cmbCustId.DisplayMember = "CustomerId";
【数据源】实现 IList 界面的任何组件都可称为数据源
数据源示例
数据源示例
- DataTable
- DataView
- 数据集
- DataViewManager
- 数组
- 集合
【DataTable作为数据源】包含两个集合
- DataColumn
间接控制可输入表中的数据类型 - DataRow
表示表中的确切数据行
DataTable dttable = DataSet.Tables["Customers"];
TextBox txtCustName = new TextBox();
txtAmt.Bindings.Add("Text", dttable, "CustName");
TextBox txtCustName = new TextBox();
txtAmt.Bindings.Add("Text", dttable, "CustName");
DataTable dttable = DataSet.Tables["Customers"];
ComboBox cmbTable = new ComboBox();
cmbTable.DataSource = dtable;
cmbTable.DataSource = dtable;
【DataView作为数据源】提供表的自定义视图;用于对 DataTable 中的数据进行搜索、排序和筛选
DataView dview = new DataView(dataSet1.Tables["Customers"]);
TextBox txtCustName = new TextBox();
txtCustName.Bindings.Add("Text", dview, "CustName");
TextBox txtCustName = new TextBox();
txtCustName.Bindings.Add("Text", dview, "CustName");
DataView dview = new DataView(dataSet1.Tables["Customers"]);
ComboBox cmbCustName = new ComboBox();
cmbCustName.DataSource = dview;
cmbCustName.DisplayMember = "CustName";
ComboBox cmbCustName = new ComboBox();
cmbCustName.DataSource = dview;
cmbCustName.DisplayMember = "CustName";
【数据集作为数据源】
数据的逻辑表示 - 由表、约束和关系组成
列确定数据集的排列
行包含数据集中存储的数据
行跟踪其原始状态和修改状态
数据的逻辑表示 - 由表、约束和关系组成
列确定数据集的排列
行包含数据集中存储的数据
行跟踪其原始状态和修改状态
【DataViewManager】显示数据集的自定义视图;存储关系
DataViewManager dviewmgr = new DataViewManager(dataSet1);
DataViewManager dviewmgr = new DataViewManager(dataSet1);
TextBox txtOrderID = new TextBox();
txtOrderID.Bindings.Add("Text", dviewmgr, "Orders.OrderId");
txtOrderID.Bindings.Add("Text", dviewmgr, "Orders.OrderId");
ComboBox cmdOrderId = new ComboBox();
cmdOrderId.DataSource = dviewmgr;
cmdOrderId.DisplayMember = "Orders.OrderId";
cmdOrderId.DisplayMember = "Orders.OrderId";
【数组作为数据源】使用数字下标访问;以组的方式使用单个名称存储的数据集合
// 简单绑定
TextBox txtArray = new TextBox();
txtArray.Bindings.Add("Text", myArray, "");
txtArray.Bindings.Add("Text", myArray, "");
// 复杂绑定
ComboBox cmbArray = new ComboBox();
cmbArray.DataSource = myArray;
cmbArray.DataSource = myArray;
// 将数据绑定到文本框控件数组
TextBox[] txtArray = new TextBox[2];
lblArray.Bindings.Add("Text", txtArray, "Text");
lblArray.Bindings.Add("Text", txtArray, "Text");
【集合作为数据源】通常包含同类的对象;用于存储一个或多个对象的对象
RowsCollection myRows = dataSet.Tables["Orders"].Rows;
RowsCollection myRows = dataSet.Tables["Orders"].Rows;
TextBox txtOrderId = new TextBox();
txtOrderId.Bindings.Add("Text", myRows, "OrderId");
txtOrderId.Bindings.Add("Text", myRows, "OrderId");
【DataRow】DataRow 的基本组件;用于检索和操纵 DataTable 中的值。
【DataView 中 DataRow 的不同状态】
- 原始
行的状态与其在数据源中的状态相同 - 当前
指示行的当前状态 - 建议
指示将来状态
【DataRowView】排序、搜索和筛选时要用到 DataRowView 对象
它与 DataView 和 DataViewManager 相似
下面的代码将声明一个与 Departments 表相关联的 DataView
它与 DataView 和 DataViewManager 相似
下面的代码将声明一个与 Departments 表相关联的 DataView
DataView dv = new DataView(dataSet1.Tables["Customers"]);
dv.RowStateFilter = DataViewRowState.Added;
DataRowView drv = dv[0];
DataRowView drv = dv[0];
【DataRowState 属性】可以是下列五个值中的任一个
- Detached
尚未添加到 Rows 集合的新 DataRow - Unchanged
未修改过的行 - Modified
行值经过修改 - New
已添加到 Rows 集合的行 - Deleted
显示调用了 Delete 方法的行