DataSet、Connection、Command、DataReader

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43679333/article/details/89530468

DataSet

DataSet可以理解为一个数据库,但它是存在于应用程序中的微型数据库。和数据库一样,DataSet中可以存放多张表(DataTable),表和表之间有着关系(DataRelation),DataRow为Dataset的行,DataColumn为DataSet的列。

在这里插入图片描述
上图中的DataSet包含了两个DataTable:Products和Categories。两个表通过CategoryID建立外键约束,即DataRelation

那么,DataSet中的数据从何而来呢?这就要谈到Connection、Command和DataReader…

Connection

Connection并不是单纯的一个类,而是包含了很多类,这些类的作用就是提供了数据库连接。例如:连接SQL Server就是SqlConnection,连接Oracle就是OracleConnection。

由于他们都叫***Connection,所以统称为Connection

连接数据库的前提是制定连接字符串,字符串中包含数据库名字、位置、登录的用户名、密码等

eg:

using System;
using System.Data.SqlClient;

namespace text
{
	class Class_09_01
	{
		public statioc void Main(String[] args)
		{
			//数据库连接情况各不相同,读者可自行查阅资料
			string strConn = "Initial Catalog=Northwind;Data Source=(local);User ID = ****;Password=**** ";
			SqlConnection conn = new SqlConnection();
			conn.ConnectionString = strConn;
		
			try
			{
				conn.Open();//打开数据库
				////////////
				//数据库操作
				////////////
				//...............

				conn.Close();
			}
			catch(Exception e)
			{
				Console.WriteLine("异常:无法连接到数据库!");
			}
	}
}

连接上数据库,接下来我们就可以用Command来获取数据了

Command

和Connection一样,Command也不是一个类,而是包含了很多类,如SqlCommand,OracleCommand等。

一个command对象表示要对数据库执行的SQl语句或存储过程。

对于查询命令,可返回一个数字,这时可以用ExecuteScalar()执行

Command也可以执行数据库的更新任务

eg:

using System;
using System.Data.SqlClient;

namespace ****
{
	class Class_09_02
	{
		public static void Main(String[] args)
		{
			string strConn = "Initial Catalog=Northwind;Data Source=(local);User ID = ****;Password=**** ";
			SqlConnection conn = new SqlConnection(strConn);
			try
			{
				conn.open();
				SqlCommand cmd = new SqlCommand();
				cmd.Connection = conn;
				cmd.CommandText="select count(productID) From Products";
				console.WriteLine("products 有{0}行",cmd.ExecuteScalar());
				conn.Close();
			}
			catch(Exception e)
			{
				//*****************************
			}
		}
	}
}

若是返回的不是一个数字,而是一张表呢?

DataReader

DataReader也是通过Command里的ExecuteScalar()方法得到的,但是DataReader只会在内存中保存当前行的数据,而不会保存全部内容,可以用Read()方法读取一行并使他前进到下一行。

eg:

using System;
using System.Data.SqlClient;

namespace text
{
	class Class_09_01
	{
		public statioc void Main(String[] args)
		{
			//数据库连接情况各不相同,读者可自行查阅资料
			string strConn = "Initial Catalog=Northwind;Data Source=(local);User ID = ****;Password=**** ";
			SqlConnection conn = new SqlConnection();
			conn.ConnectionString = strConn;
		
			try
			{
				conn.Open();//打开数据库
				SqlCommand cmd = new SqlCommand();
				cmd.Connection = conn;
				cmd.CommandText="select CategoryID,CategoryName From Categories";
				SqlDataReader reader = cmd.ExecuteReader();
				//输出结果
				Console.WriteLine("{0}\t{1}","CategoryID","CategoryName");
				Console.WriteLine();
				while(reader.Read())
				{
					Console.WriteLine("{0}\t{1}",reader.GetInt32(0),reader.Getstring(1));
				}
				conn.Close();
			}
			catch(Exception e)
			{
				Console.WriteLine("异常:无法连接到数据库!");
			}
	}
}

结果
在这里插入图片描述

DataAdapter

当数据库和DataSet中的数据不一致时,用来更新数据。此功能基于Command的4个对象

Command 说明
SelectCommannd 用于在数据源中选择记录SQL命令
InsertCommand 用于在数据源中插入新记录的SQL命令
UpdateCommand 用于更新数据源中的记录的SQL命令
DeleteCommand 用于从数据集删除记录的SQL命令

在这里插入图片描述

DataAdapter提供fill()方法来填充DataSet,在调用Fill()时,利用SelectCommand返回的DataReader来读取数据。

eg:

using System;
using System.Data.SqlClient;

namespace text
{
	class Class_09_01
	{
		public statioc void Main(String[] args)
		{
			//数据库连接情况各不相同,读者可自行查阅资料
			string strConn = "Initial Catalog=Northwind;Data Source=(local);User ID = ****;Password=**** ";
			SqlConnection conn = new SqlConnection();
			conn.ConnectionString = strConn;
		
			try
			{
				conn.Open();//打开数据库
				SqlCommand cmd = new SqlCommand();
				cmd.Connection = conn;
				cmd.CommandText="select RegionID,RegionDescription From Region";
				SqlDataAdapter da = new SqlDataAdapter();
				da.SelectCommand = silcmd;

				DataSet ds = new DataSet();
				//填充数据
				da.fill(ds);
				conn.Close();
				
				DataTable dt = ds.Tables[0];
				Console.WriteLine("{0}\t{1}",dt.Columns[0],dt.Columns[1]);
				foreach(DataRow r in dt.Rows)
				{
					Console.WriteLine("\t{0}\t{1}",r[0],r[1]);
				}
			}
			catch(Exception e)
			{
				Console.WriteLine("异常:无法连接到数据库!");
			}
	}
}

一个DataSet被创建时是空的,被填充之后有了数据和架构。
我们可以通过访问Columns集合得到各列名

如果要更新数据,我们可以用DataAdapter中的Update()方法,他会自动检测有无数据更新,如果有,则调用对应方法

eg:

using System;
using System.Data.SqlClient;

namespace text
{
	class Class_09_01
	{
		static string strConn = "************(连接数据库的名称,密码等)**************";

		public static void CheckData()
		{
			SqlConnection conn = new SqlConnection(strConn);
			try
			{	
				conn.open()
				SqlCommand cmd = new SqlCommand("select * from Region",conn);
				SqlDataReader reader = new SqlDataReader();
				DataTable dt = reader.GetSchemaTable();
				Console.WriteLine("{0}\t{1}",dt.Columns[0],dt.Columns[1]);
				while(reader.read())
				{
					Console.WriteLine("{0}\t{1}",reader[0],reader[1]);
				}
			}
			catch(Exception e)
			{
				///////////////////*********************
			}
		}
		public statioc void Main(String[] args)
		{
			SqlConnection conn = new SqlConnection(strConn);
			try
			{
				conn.open();
				SqlCommand selcmd = new SqlCommand();
				selcmd.Connecction = conn;
				selcmd.CommandText = "select * from Region";
				
				SqlDataAdpter da = new SqlDataAdpter();
				da.SelectCommand = selcmd;

				DataSet ds = new DataSet();
				da.File(ds);
				conn.Close();

				//利用SqlCommandBuilder自动建立
				//Insert,updata和Delete Command
				SqlCommandBuilder cb = new SqlCommandBuilder(da);

				//添加数据
				Console.WriteLine("输入一个新的RegionDesCription:");
				string newRegion = ConSole.ReadLine();

				//吧新数据添加到DataSet
				DataRow r = ds.Tables[0].Newrow();
				r["RegionID"] = 5;
				r["RegionDesCription"] = newRegion;
				ds.Table[0].Rows.Add(r);
				//更新数据库
				da.Update(ds);
				CheckData();

				//更新数据库
				Console.WriteLine("再输入一个新的RegionDescription,它将取代刚才的数据:");
				newRegion = Console.WriteLine();

				//更新DataSet中的数据
				r = ds.Table[0].Select("RegionID = 5")[0];
				r["RegionDescription"] = newRegion;
				//更新数据库
				da.Update(ds);
				
				CheckData();

				//删除数据
				Console.WriteLine("删除刚才的数据:");
				r.Delete();
				da.Update(ds);

				CheckData();
			}
			catch(Exception e)
			{
				///////////////////////////////////////////////////////////
			}
		}
	}
}

本文章所有代码都没有在编译器上运行检验,所以可能会有一些小错误,但是总体私立时对的

小白笔记 , 欢迎大家指点

猜你喜欢

转载自blog.csdn.net/qq_43679333/article/details/89530468