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)
{
///
}
}
}
}
本文章所有代码都没有在编译器上运行检验,所以可能会有一些小错误,但是总体私立时对的
小白笔记 , 欢迎大家指点