使用DataSet和DataAdapter

本文介绍如何使用DataSet进行数据存储、筛选、排序及更新等操作。详细解释了如何创建和填充DataSet,如何利用DataView进行数据筛选和排序,以及如何修改DataSet中的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataSet是一个独立组件,它完全不清楚数据源,工作时与数据源断开连接。
DataSet用DataTable,DataRow,和DataColumn对象存储数据。
DataSet的DataSet.Tables属性返回DataTableCollection的实例,表示DataTable对象的集合。

DataAdapter是DataSet与数据源之间的桥梁。使DataSet能够访问任何外部数据源。
它为DataSet处理所有的连接细节,用数据填充它,用数据更新数据源。
创建SqlaAdapter:
SqlDataAdapter adapter = new SqlDataAdapter(SQL, thisConnection);
这里的SQL是查询语句,thisConnection指创建的连接。

DataTable是System.Data命名空间的成员。可以看作是数据庫中的物理表的客观表示。
DataTable的Rows用来获取资料表的行信息。
DataTable的Columns用来获取资料表的列信息。
DataColumn 是用于创建DataTable架构的基本构造块。通过向 DataColumnCollection 中添加一个或多个 DataColumn 对象来生成这个架构。
使用列名可以获得单个DataColumn的引用:
DataColumn dc=dt.Columns["ContactName"];
这里的dt是DataTable的对象。
为了能够从DataTable对象中检索可利用行,调用Rows属性,或者把序数值传递给Rows属性,以检索指定的行:
DataRow dr= dt.Rows[2];

示例用DataAdapter填充DataSet

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//导入命名空间,使能够访问这些命名空间的类
using System.Data.SqlClient;
using System.Data;
namespace SQLServerProvider
{
    class Program
    {

        static void Main(string[] args)
        {
            SqlConnection thisConnection = new SqlConnection();
            thisConnection.ConnectionString =
              @"Server=localhost;Integrated security=true;database=Northwind";
            try
            {
                thisConnection.Open();
                string SQL = "SELECT ContactName FROM Customers;";
                //创建sqlDataAdapter对象
                SqlDataAdapter dAdapter = new SqlDataAdapter(SQL, thisConnection);

                //创建DataSet对象
                DataSet dDataset = new DataSet();
                //用适配器的Fill方法填允DataSet
                dAdapter.Fill(dDataset, "Products");
                //获取DataSet中表的集合
                DataTable table = dDataset.Tables["Products"];

                //从每个行访问列数据
                foreach (DataRow row in table.Rows)
                {
                   foreach (DataColumn col in table.Columns)
                    {
                        Console.WriteLine(row[col]);
                        Console.WriteLine("-------");
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
            }
            finally
            {
                thisConnection.Close();
              
            }
        }
    }
}

SqlCeDataAdapter.SelectCommand 属性用于 获取或设置用于在数据源中选择记录的 SQL 语句。
DataSet的Tables属性返回DataTableCollection的实例,表示DataTable对象的集合。
Select()返回DataRow对象的数组。其内容反映对物理数据所做的变化,不涉及其排序。
示例DataSet的筛选和排序


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//导入命名空间,使能够访问这些命名空间的类
using System.Data.SqlClient;
using System.Data;
namespace SQLServerProvider
{
    class Program
    {

        static void Main(string[] args)
        {
            SqlConnection thisConnection = new SqlConnection();
            thisConnection.ConnectionString =
              @"Server=localhost;Integrated security=true;database=Northwind";
            try
            {
                thisConnection.Open();
                //查询语句,绑定到SqlDatAdapter的SelectCommand属性,供Fill方法使用
                string SQL = "SELECT * FROM customers;" +
                    "SELECT * FROM products WHERE UnitPrice <10";
                DataSet ds = new DataSet();//Dataset对象
                SqlDataAdapter sqlAdapter = new SqlDataAdapter();//SqlDataAdapter对象
                //绑定到sqlDapter的SelectCommand上
                sqlAdapter.SelectCommand = new SqlCommand(SQL, thisConnection);
                //用两个独立的结果集填充DataSet对象
                sqlAdapter.Fill(ds, "Customers");

                //DataSet的Tables属性返回DataTableCollection的实例,表示DataTable对象的集合
                DataTableCollection dtc = ds.Tables;
                Console.WriteLine("Result from CUSTOMERS table");
                Console.WriteLine("ComapnyName".PadRight(20) +
                    "ContactName".PadLeft(25));
                Console.WriteLine();
                //筛选Country列含有"Germany"的所有行
                string f1 = "Country='Germany'";
                //CompanyName以升序排序
                string str = "CompanyName ASC";
                //显示从每个行提取的数据,Select()在DataTable内部搜索,筛选需要的数据并排序,并返回数组jj
                foreach (DataRow myRow in dtc["Customers"].Select(f1, str))
                {
                    Console.WriteLine("{0}/t{1}",
                        myRow["CompanyName"].ToString().PadRight(25),
                        myRow["ContactName"]);
                }
                Console.WriteLine();
                Console.WriteLine("----------");
                Console.WriteLine("Result from PRODUCTS table:");
                Console.WriteLine("ProductName".PadRight(20) +
                    "UnitPrice".PadLeft(21));
                Console.WriteLine();

                foreach (DataRow myRow in dtc[1].Rows)
                {
                    Console.WriteLine("{0}/t{1}",
                        myRow["ProductName"].ToString().PadRight(25),
                        myRow["UnitPrice"]);
                }


            }

            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
            }
            finally
            {
                thisConnection.Close();

            }
        }
      }
}

DataView是DataTable内容的动态视图,与DataTable对象或物理表是不同的。
示例使用DataView都完成筛选与排序
创建一个新的DataView对象:
 DataView myView = new DataView(dt, "Country='Mexico'", "Country", DataViewRowState.OriginalRows);

第一个参数是所创建的DataTable,第二个提供对DataTable内容执行筛选的筛选器,第三个是排序顺序,最后一个参数指定要包含的行的类型。每次修改,添加或删除行时,都将其内部状态更改为如下所列状态之一:
Added   新添加的行
CurrentRows 所有行,包括末更改的,新的,修改过的等
Deleted   被删除的行
ModifiedCurrent   已修改行的当前版本
ModifiedOriginal   已修改行的当前版本
None        没有行
OriginalRows      所有原来的行,包括末更改的和被删除的行
Unchanged   末修改的行
就像DataRow代表DataTable中的单个行一样,DataRowView代表DataView中的单个行。
我们为DataRowView检索筛选过和排序过的列数据,并输出到控件台。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//导入命名空间,使能够访问这些命名空间的类
using System.Data.SqlClient;
using System.Data;
namespace SQLServerProvider
{
    class Program
    {

        static void Main(string[] args)
        { 
          
            SqlDataAdapter da = new SqlDataAdapter();
            SqlConnection thisConnection = new SqlConnection();
            thisConnection.ConnectionString = @"Server=localhost;Integrated security=true;database=Northwind";
       

            try
            {
                  string SQL = "SELECT ContactName,Country FROM Customers";
                  da.SelectCommand = new SqlCommand(SQL, thisConnection);

                  DataSet ds = new DataSet();
                  da.Fill(ds, "Customers");
 
                  DataTable dt = ds.Tables["Customers"];
                            //创建DataView对象
                  DataView myView = new DataView(dt, "Country='Mexico'", "Country", DataViewRowState.OriginalRows);
                          //遍历DataView中刚才创建的行
                  foreach (DataRowView myDrv in myView)
                  {
                      for (int i = 0; i < myView.Table.Columns.Count; i++)
                          Console.Write(myDrv[i] + "/t");
                      Console.WriteLine();
                     
                  }
            }

            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
                thisConnection.Close();
            }
            finally
            {
                thisConnection.Close();

            }
        }
      }
}

       修改DataSet中的数据
Rows用于获取属于该表的行集合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//导入命名空间,使能够访问这些命名空间的类
using System.Data.SqlClient;
using System.Data;
namespace SQLServerProvider
{
    class Program
    {

        static void Main(string[] args)
        { 
          
            SqlDataAdapter da = new SqlDataAdapter();
            SqlConnection thisConnection = new SqlConnection();
            thisConnection.ConnectionString = @"Server=localhost;Integrated security=true;database=Northwind";
       

            try
            {
                string SQL = "SELECT * FROM Employees WHERE Country='UK'";
             
                da.SelectCommand = new SqlCommand(SQL, thisConnection);
                //创建DatSet并用数据填充
                DataSet ds = new DataSet();
                da.Fill(ds, "Employees");
                //从DataSet中获取DataTable
                DataTable dt = ds.Tables["Employees"];
                //列FirstName不接受空值
                dt.Columns["FirstName"].AllowDBNull = false;
                //修改单行
                dt.Rows[0]["FirstName"] = "Steven jin";
                //增加新行。
                //DataTable的NewRow()方法返回DataRow实例,用具体的值来填充
                DataRow newRow = dt.NewRow();
                newRow["FirstName"] = "Susan";
                newRow["LastName"] = "juicy";
                newRow["TitleOfCourtesy"] = "Ms.";
                newRow["City"] = "New Yoke";
                newRow["Country"] = "UK";
                 //使用DataTable对象的Add()方法把新行添加到DataTable的Rows集合中
                dt.Rows.Add(newRow);
                //显示数据
                foreach (DataRow row in dt.Rows)
                {
                    Console.WriteLine("{0}{1}{2}",
                        row["FirstName"].ToString().PadRight(15),
                        row["LastName"].ToString().PadLeft(25),
                        row["City"]);
                 }
            }

            catch (Exception e)
            {
                Console.WriteLine("{0}", e.Message);
                thisConnection.Close();
            }
            finally
            {
                thisConnection.Close();

            }
        }
      }
}

        把变化保存到数据存储中
更新并将数据保存到数据源的三个属性:
1.UpdateCommand
用可利用的SQL UPDATE查询更新数据源。
如果要从DataSet修改DataTable中行的内容,并将所做的变化与数据源同步,就需要把SqlCommand赋值给UpdateCommand属性。SqlCommand定义有效的SQL UPDATE语句以及与数据源的活动连接。
da.UpdateCommand= new SqlCommand("UPDATE Customers SET CompanyName = "dt.Rows[0]["CompanyName"],thisConnection)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值