ADO.NET学习之SqlDataAdapter,DataSet

来源:互联网 发布:黎活明 知乎 编辑:程序博客网 时间:2024/06/06 15:01

ADO.NET学习之SqlDataAdapter

ADO.NET提供了2中data access模式
1.Connection oriented data access
2.Disconnected data access

下面说第二种Disconnected data access,2个类SqlDataAdapterDataSet

DataSet 是个内存数据存储,可以持有一个或多个tableDataSet 只是持有数据,并不和底层的数据表做交互。DataSet对象并不知晓底层的数据源。

要在DataSet中提取记录并将它们填入表中,需要使用另一个ADO.NET对象DataAdapter(如SqlDataAdapter
为了让DataAdapter能够编辑、删除或者添加行,需要设定DataAdapter对象的InsertCommandUpdateCommandDeleteCommand属性。利用DataAdapter填充DataSet时,必须设定SelectCommand

DataAdapter的方法:

  • Fill()执行SelectCommand中的查询后,向DataSet添加一个DataTable。如果查询返回多个结果集,该方法将一次添加多个DataTable对象。还可以用该方法向现有的DataTable添加数据
  • Update()检查DataTable中的所有变化,并执行适当的InsertCommandUpdateCommandDeleteCommand操作,为数据源执行批量更新

步骤:
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。而SqlDataAdapterDataSet给我们提供了一种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对象,需要的参数(SqlCommandTextconnection对象)
2.创建DataSet对象,DataSet是内存数据存储,可存储表,就像数据库一样
3.Fill() 方法,打开数据的连接,执行sql命令,使用数据填充dataset,然后关闭数据库连接。

使用SqlDataAdapter执行存储过程

创建如下的存储过程:

Create procedure spGetProductInventory asBegin Select ProductId, ProductName, UnitPrice  from tblProductInventoryEnd

想要使用SqlDataAdapter执行存储过程spGetProductInventory ,需指定存储过程的名称:

SqlDataAdapter dataAdapter = new SqlDataAdapter("spGetProductInventory", connection);dataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;

执行带有参数的存储过程
如下的存储过程:

Create procedure spGetProductInventoryById@ProductId intasBegin Select ProductId, ProductName, UnitPrice  from tblProductInventory where ProductId = @ProductIdEnd

执行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 spGetProductAndCategoriesDataasBegin Select ProductId, ProductName, UnitPrice  from tblProductInventory Select CategoryId, CategoryName from tblProductCategoriesEnd

在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();}

默认情况下,DataSettable名字如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的类是允许你检索和更新数据源中数据的类。该类别中最重要的类是ConnectionDataReaderDataAdapter
  • Disconnected -Disconnected类允许你使用Connected类对数据进行脱机访问和操作的功能。你可以使用Connected类同步对Disconnected类所做的更改。最重要的Disconnected类是DataSetDataTableDataColumnDataRowDataRelation

DataSet.Tables集合里的每个项目是一个DataTableDataTable又包含自己的集合-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

添加DataRowDataTable

参考:

  • Dynamically create DataTable and bind to GridView in ASP.Net
  • How to: Add Rows to a 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 });