ADO.NET学习之SqlDataAdapter,DataSet
ADO.NET学习之SqlDataAdapter
ADO.NET
提供了2中data access
模式
1.Connection oriented data access
2.Disconnected data access
下面说第二种Disconnected data access
,2个类SqlDataAdapter
和DataSet
DataSet
是个内存数据存储,可以持有一个或多个table
。DataSet
只是持有数据,并不和底层的数据表做交互。DataSet
对象并不知晓底层的数据源。
要在DataSet
中提取记录并将它们填入表中,需要使用另一个ADO.NET
对象DataAdapter
(如SqlDataAdapter
)
为了让DataAdapter
能够编辑、删除或者添加行,需要设定DataAdapter
对象的InsertCommand
、UpdateCommand
和DeleteCommand
属性。利用DataAdapter
填充DataSet
时,必须设定SelectCommand
DataAdapter
的方法:
-
Fill()
执行SelectCommand
中的查询后,向DataSet
添加一个DataTable
。如果查询返回多个结果集,该方法将一次添加多个DataTable
对象。还可以用该方法向现有的DataTable
添加数据 -
Update()
检查DataTable
中的所有变化,并执行适当的InsertCommand
、UpdateCommand
和DeleteCommand
操作,为数据源执行批量更新
步骤:
1.创建SqlDataAdapter
对象,指定一个命令和一个connection对象
string connectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString);
string selectQuery = "Select * from tblStudents";
SqlDataAdapter dataAdapter = new SqlDataAdapter(selectQuery, connection);
2.调用SqlDataAdapter.Fill()
方法
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet, "Students");
3.DataSet
中数据的改变并不会影响底层的数据
4.要更新底层数据库表中的数据,调用SqlDataAdapter.Update()
方法
dataAdapter.Update(DataSetObject, "Students");
SqlDataAdapter
在前面的章节中讲到了SqlDataReader
,是 connection oriented
,意味着需要一个活动的,被打开连接的 data source
。而SqlDataAdapter
和 DataSet
给我们提供了一种disconnected data access model
创建SqlDataAdapter
对象,参数
1.执行的sql
命令
2.执行命名的connection
如下的例子:
string CS = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from tblProductInventory02", con);
DataSet dataset = new DataSet();
dataAdapter.Fill(dataset);
GridView1.DataSource = dataset;
GridView1.DataBind();
}
1.创建SqlDataAdapter
对象,需要的参数(SqlCommandText
和 connection
对象)
2.创建DataSet
对象,DataSet
是内存数据存储,可存储表,就像数据库一样
3.Fill()
方法,打开数据的连接,执行sql
命令,使用数据填充dataset
,然后关闭数据库连接。
使用SqlDataAdapter
执行存储过程
创建如下的存储过程:
Create procedure spGetProductInventory
as
Begin
Select ProductId, ProductName, UnitPrice
from tblProductInventory
End
想要使用SqlDataAdapter
执行存储过程spGetProductInventory
,需指定存储过程的名称:
SqlDataAdapter dataAdapter = new SqlDataAdapter("spGetProductInventory", connection);
dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
执行带有参数的存储过程
如下的存储过程:
Create procedure spGetProductInventoryById
@ProductId int
as
Begin
Select ProductId, ProductName, UnitPrice
from tblProductInventory
where ProductId = @ProductId
End
执行spGetProductInventoryById
,如下:
SqlDataAdapter dataAdapter = new SqlDataAdapter("spGetProductInventoryById", connection);
dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure; dataAdapter.SelectCommand.Parameters.AddWithValue("@ProductId", 1);
DataSet dataset = new DataSet();
dataAdapter.Fill(dataset);
DataSet
这节要讲的内容:
1.加载2个或者更多的table到DataSet
中
2.把DataSet与用户接口绑定起来,如使用GridView
先创建如下的存储过程,执行这个存储过程,会获取到2
个结果集
Create procedure spGetProductAndCategoriesData
as
Begin
Select ProductId, ProductName, UnitPrice
from tblProductInventory
Select CategoryId, CategoryName
from tblProductCategories
End
在webform中添加2个GridView ,修改ID属性:
<asp:GridView ID="GridViewProducts" runat="server">
</asp:GridView>
<br />
<asp:GridView ID="GridViewCategories" runat="server">
</asp:GridView>
获取数据:
string ConnectionString = ConfigurationManager.ConnectionStrings["DBConnectionString"].ConnectionString;
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlDataAdapter dataAdapter = new SqlDataAdapter("spGetProductAndCategoriesData", connection);
dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet dataset = new DataSet();
dataAdapter.Fill(dataset);
GridViewProducts.DataSource = dataset.Tables[0];
GridViewProducts.DataBind();
GridViewCategories.DataSource = dataset.Tables[1];
GridViewCategories.DataBind();
}
默认情况下,DataSet
的table
名字如Table
, Table1
, Table2
等,你可以给它指定一个更有意义的名字:
dataset.Tables[0].TableName = "Products";
dataset.Tables[1].TableName = "Categories";
在使用的时候,如下:
GridViewProducts.DataSource = dataset.Tables["Products"];
GridViewProducts.DataBind();
GridViewCategories.DataSource = dataset.Tables["Categories"];
GridViewCategories.DataBind();
Cache DataSet
缓存DataSet
首先检查是否在缓存中存在,然后从缓存中加载
protected void btnLoadData_Click(object sender, EventArgs e)
{
if (Cache["data"] == null)
{
string CS = ConfigurationManager.ConnectionStrings["DatabaseConnectionString"].ConnectionString;
using (SqlConnection con = new SqlConnection(CS))
{
SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from tblProductInventory02", con);
DataSet dataset = new DataSet();
dataAdapter.Fill(dataset);
Cache["data"] = dataset;
gvProducts.DataSource = dataset;
gvProducts.DataBind();
lblMessage.Text = "Data loaded from the database";
}
}
else
{
gvProducts.DataSource = (DataSet)Cache["data"];
gvProducts.DataBind();
lblMessage.Text = "Data loaded from the Cache";
}
}
移除缓存的DataSet
protected void btnClearCache_Click(object sender, EventArgs e)
{
if (Cache["data"] != null)
{
Cache.Remove("data");
lblMessage.Text = "The dataset removed from the cache";
}
else
{
lblMessage.Text = "There is nothing to be removed";
}
}
资源
- SqlDataAdapter in ADO.NET - Part 10
- DataSet in asp.net - Part 11
- Caching dataset in asp.net - Part 12
理解DataSet、DataTable、DataColumn
内容来自ADO.NET : Working with DataSet, DataTable, DataColumn, DataRow and DataRelations
ADO.NET
的类为两大类:
-
Connected
-Connected
的类是允许你检索和更新数据源中数据的类。该类别中最重要的类是Connection
,DataReader
,DataAdapter
类 -
Disconnected
-Disconnected
类允许你使用Connected
类对数据进行脱机访问和操作的功能。你可以使用Connected
类同步对Disconnected
类所做的更改。最重要的Disconnected
类是DataSet
,DataTable
,DataColumn
,DataRow
,DataRelation
类
DataSet.Tables
集合里的每个项目是一个DataTable
。DataTable
又包含自己的集合-DataColumn
对象的Columns
集合(它描述每个字段的名称和数据类型)以及DataRow
对象的Rows
集合(它包含每条记录的真正数据)
创建DataColumn
绑定到DataTable
//创建DataTable
DataTable dt = new DataTable("MyTable");
//创建第一列
DataColumn column1 = dt.Columns.Add();
column1.ColumnName = "First";
column1.DataType = typeof(int);
column1.DefaultValue = 0;
column1.Unique = true;
column1.AllowDBNull = false;
//创建第二列
DataColumn column2 = new DataColumn();
column2.ColumnName = "Second";
column2.DataType = typeof(string);
column2.MaxLength = 25;
dt.Columns.Add(column2);
//创建第三列
dt.Columns.Add("Third", typeof(string)).MaxLength = 40;
//创建第四列和第五列
DataColumn column4 = new DataColumn("Fourth");
column4.DataType = typeof(int);
DataColumn column5 = new DataColumn("Firth", typeof(decimal));
dt.Columns.AddRange(new DataColumn[] { column4, column5 });
可以使用DataTable.Columns.AddRange
添加多个DataColumns
添加DataRow
到DataTable
参考:
如下:
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[3] { new DataColumn("Id", typeof(int)),
new DataColumn("Name", typeof(string)),
new DataColumn("Country",typeof(string)) });
dt.Rows.Add(1, "John Hammond", "United States");
dt.Rows.Add(2, "Mudassar Khan", "India");
dt.Rows.Add(3, "Suzanne Mathews", "France");
dt.Rows.Add(4, "Robert Schidner", "Russia");
GridView1.DataSource = dt;
GridView1.DataBind();
创建DataTable
绑定到DataSet
//创建一个DataSet对象
DataSet ds = new DataSet("MyDataSet");
//添加一个名为Table-1的DataTable
DataTable table1 = ds.Tables.Add("Table-1");
//在这里配置它,添加一些column
DataTable table2 = new DataTable("Table-2");
ds.Tables.Add(table2);
DataTable table3 = new DataTable("Table-3");
DataTable table4 = new DataTable("Table-4");
ds.Tables.AddRange(new DataTable[] { table3, table4 });