欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ADO.NET学习之SqlDataAdapter,DataSet

程序员文章站 2024-01-14 20:59:22
...

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

默认情况下,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";
        }
    }

资源

理解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

参考:

如下:

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