DataSet对象是ADO.NET的中心概念,它独立于各种数据源.是支持断开式,分布式的核心对象.DataSet对象包含任意多个表,每个DataSet中的数据表对应于一个数据源中的数据表.
DataSet可利用DataAdapter填充.
DataAdapter对象是DataSet和数据库之间的桥梁.主要是从数据源中检索数据,然后填充到DataSet对象中..Net中主要有两种DataAdapter对象,OleDataAdapter和SqlDataAdapter.
DataSet和DataAdapter配合使用的大致过程是:
SqlDataAdapter myDa = new SqlDataAdapter(SqlStr, MyCon);//建立DataAdapter对象,SqlStr是一个查询语句,MyCon是一个数据库连接
DataSet myDs = new DataSet();
myDa.Fill(myDs);//填充DataSet对象
下面是使用DataSet和DataAdapter对象的一个具体例子.
显示Music数据源中的条目,如果名字过长,用省略号代替.
思路为.新建DataSet对象,用DataAdapter对象查询结果并且填充DadaSet对象,修改DataSet对象的表.然后和GridView绑定以显示数据.
首先在SqlServer中准备好我们的数据库,名字为Music,表名为catalog.两列分别为id int和name nvarchar.
新建网站,添加一个web窗体
在web窗体中添加一个GredView控件,名字为GridView1.
在web.config中添加连接字符串
<appSettings>
<add key="ConnectString" value="server=localhost;database=Music;UId=sa;password=1"/>
</appSettings>
在Default.aspx.cs中
添加三个命名空间
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
新建一个GetConnection方法,使用ConfigurationManager获取web.config中的连接字符串
public SqlConnection GetConnection()
{
string MyStr = ConfigurationManager.AppSettings["ConnectString"].ToString();
SqlConnection MyCon = new SqlConnection(MyStr);
return MyCon;
}
新建一个SubStr函数,用于把超过一定长度的字符串用省略号显示
public string SubStr(string sString, int nLeng)
{
if (sString.Length <= nLeng)
{
return sString;
}
string sNewStr = sString.Substring(0, nLeng);
sNewStr = sNewStr + "...";
return sNewStr;
}
在PageLoad事件中,添加如下代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
SqlConnection MyCon = GetConnection();
MyCon.Open();
string SqlStr = "select * from catalog";
SqlDataAdapter myDa = new SqlDataAdapter(SqlStr, MyCon);
DataSet myDs = new DataSet();
myDa.Fill(myDs);
for (int i = 0; i <= myDs.Tables[0].Rows.Count - 1; i++)
{
myDs.Tables[0].Rows[i]["name"] =
SubStr(Convert.ToString(myDs.Tables[0].Rows[i]["name"]), 5);
}
GridView1.DataSource = myDs;
GridView1.DataKeyNames = new string[] { "id" };//id为数据库中的主键
GridView1.DataBind();
}
}
运行,打开的网页如下
id | name |
---|---|
1 | ji... |
2 | ha... |
3 | gg... |
6 | my... |
总结:
1.GridView对象的使用目前遇到两种方法,一种是在控件上直接选择数据源,可以实现和数据源的自动绑定.
另一种就是本例子中的方法,实现和DataSet的绑定,这样的目的是从数据源获取数据后,可以对数据进行一些处理,然后在现实在GridView中.代码如下
GridView1.DataSource = myDs;
GridView1.DataKeyNames = new string[] { "id" };//"id"和数据源中的列名应该一致
GridView1.DataBind();
2.本例中DataSet对象的使用为
myDs.Tables[0].Rows[i]["name"]
如果在填充时指定fill的第二个参数(给这个虚拟表的一个名字)
myDa.Fill(myDs,"catalog");
则可以通过表名调用,而不必用下标,这样避免忘了是哪个下标
myDs.Tables["catalog"].Rows[i]["name"]
示例的创建过程编写后又经过亲测,按照步骤一步步就可以成功运行,如果差错,请不吝指正.
补充:
使用DataSet中的数据更新数据库
通过DataAdapter对象创建SqlCommandBuilder对象,再使用DataAdapter.Update,即可由SqlCommandBuilder对象自动生成INSERT,UPDATE或DELETE命令
要求DataSet中的数据必须至少存在一个主键列或唯一的列
在上述示例中,把Pageload中的代码替换成如下代码,即可实现DataSet修改后更新到数据库中.
if (!IsPostBack)
{
SqlConnection MyCon = GetConnection();
MyCon.Open();
string SqlStr = "select * from catalog";
SqlDataAdapter myDa = new SqlDataAdapter(SqlStr, MyCon);
DataSet myDs = new DataSet();
SqlCommandBuilder builder = new SqlCommandBuilder(myDa);//使用SqlCommandBuilder对象
myDa.Fill(myDs, "id");
for (int i = 0; i <= myDs.Tables[0].Rows.Count - 1; i++)
{
myDs.Tables["id"].Rows[i]["name"] =
SubStr(Convert.ToString(myDs.Tables["id"].Rows[i]["name"]),2);
}
myDa.Update(myDs, "id");
GridView1.DataSource = myDs;
GridView1.DataKeyNames = new string[] { "id" };
GridView1.DataBind();
myDa.Dispose();
myDs.Dispose();
MyCon.Close();
}
运行后去SqlServer中查看,数据库中的内容也被更新了,关键语句如下
SqlCommandBuilder builder = new SqlCommandBuilder(myDa);//使用SqlCommandBuilder对象
myDa.Fill(myDs, "id");
myDa.Update(myDs, "id");//更新