插入和查询:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class Default6 : System.Web.UI.Page { //定义连接 SqlConnection conn; //加载连接字符串 String connString = System.Configuration.ConfigurationManager.ConnectionStrings["sql2005"].ToString(); //定义数据适配器 SqlDataAdapter adapter; protected void Page_Load(object sender, EventArgs e) { //绑定数据 /*注意如果在这里设置仅第一次访问绑定数据 添加会出错,因为 adapter = new SqlDataAdapter("select * from zzx", conn); 定义在DataBinds()方法里.在Button1_Click事件中会找不到,所以定义每次加载 页面则执行DataBinds(); */ DataBinds(); } protected void DataBinds() { DataSet ds = new DataSet(); conn = new SqlConnection(connString); adapter = new SqlDataAdapter("select * from zzx", conn); adapter.Fill(ds); /*注意SqlCommandBuilder类根据创建DataAdapter对象的过程中 指定的select语句自动创建insert,update,delete语句.使用简单的 * select语句的时候SqlCommandBuilder类非常有用.但可以的是,当 * DataAdapter对象由多表select命令创建的时候,就不能使用SqlCommandBuilder * 类了. */ SqlCommandBuilder scb = new SqlCommandBuilder(adapter); this.GridView1.DataSource = ds.Tables[0].DefaultView; this.GridView1.DataBind(); } protected void Button1_Click(object sender, EventArgs e) { //创建临时数据集(在内存中创建) DataSet tempds = new DataSet(); //填充临时数据集 adapter.Fill(tempds); //从数据集中得到第一个虚拟表(虚拟表在内存中),并创建一行 DataRow dr = tempds.Tables[0].NewRow(); //在该行通过列索引添加数据 dr["categories"] = this.TextBox1.Text; dr["descrpition"] = this.TextBox2.Text; //最后将该行数据添加到该数据集的第一个虚拟表中 tempds.Tables[0].Rows.Add(dr); 如果没有SqlCommandBuilder类的情况下,必须指定以下被注释的内容: 设置sql命令为插入数据 //SqlCommand comm = new SqlCommand("insert into zzx values (@categories,@description)", conn); 设置参数需要与数据库的列相匹配 //comm.Parameters.Add("@categories", SqlDbType.VarChar, 50, "categories"); //comm.Parameters.Add("@description", SqlDbType.Text, 2000, "descrpition"); 设置适配器插入的sql指令 //adapter.InsertCommand = comm; //最后把该数据集内容更新到数据库 adapter.Update(tempds); //绑定刷新数据 DataBinds(); } }
删除和更新:
.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default7.aspx.cs" Inherits="Default7" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowEditing="RowEdit_RowEditing"
OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowUpdating="GridView1_RowUpdating"
DataKeyNames="id,categories,descrpition" OnRowDeleting="GridView1_RowDeleting">
<Columns>
<asp:BoundField HeaderText="分类ID" DataField="Id" ReadOnly="true" Visible="false" />
<asp:BoundField HeaderText="分类名" DataField="Categories" ReadOnly="true" />
<asp:BoundField HeaderText="描述" DataField="Descrpition" />
<asp:CommandField HeaderText="编辑" EditText="Edit" UpdateText="Update" CancelText="Cancel"
ShowEditButton="true" />
<asp:CommandField HeaderText="删除" DeleteText="Delete" ShowDeleteButton="true" />
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
.aspx.cs:
using System; using System.Collections; using System.Configuration; using System.Data; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Data.SqlClient; public partial class Default7 : System.Web.UI.Page { private String connString = System.Configuration.ConfigurationManager.ConnectionStrings["sql2005"].ToString(); private SqlConnection conn; private SqlDataAdapter adapter; private String TableName = "Categories"; DataSet ds; protected void Page_Load(object sender, EventArgs e) { conn = new SqlConnection(connString); ds = new DataSet(); adapter = new SqlDataAdapter("select * from zzx", conn); adapter.Fill(ds, TableName); if (!IsPostBack) { GetDateBind(); } } /// <summary> /// 绑定数据 /// </summary> protected void GetDateBind() { this.GridView1.DataSource = ds.Tables[TableName].DefaultView; this.GridView1.DataBind(); } /// <summary> /// 编辑事件 /// </summary> protected void RowEdit_RowEditing(object sender, GridViewEditEventArgs e) { //指定GridView编辑索引为当前选择编辑行索引 this.GridView1.EditIndex = e.NewEditIndex; GetDateBind(); } /// <summary> /// 行编辑的取消事件 /// </summary> protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { //取消编辑只需要把EditIndex改为-1即可 this.GridView1.EditIndex = -1; GetDateBind(); } /// <summary> /// 编辑的更新事件 /// </summary> protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { /*通过DataKeys集合取到文本框原始列的值(就是数据库的值) 注意:在使用DataKeys集合取数据时必须在GridView的DatakeyNames 属性中设置绑定GridView列名,否则用DataKey去去数据会索引越界 DataKeys集合是通过DatakeyNames集合的索引来取值的 */ int id = Convert.ToInt32(this.GridView1.DataKeys[e.RowIndex][0]); //取到要更新描述信息的值,描述值在GridView选取行的第三列,取到编辑后文本框的值 String descript = (this.GridView1.Rows[e.RowIndex].Cells[2].Controls[0] as TextBox).Text; //调用更新的方法 UpdateDescript(id, descript); this.GridView1.EditIndex = -1; GetDateBind(); } /// <summary> /// 更新方法 /// </summary> /// <param name="id">分类表的id</param> /// <param name="description">分类表的描述decsription</param> protected void UpdateDescript(int id, string description) { //得到数据集 DataTable dt = ds.Tables[TableName]; //查找数据集中数据必须指定主键列,也可以指定多个主键列(组合键)查找. dt.PrimaryKey = new DataColumn[] { dt.Columns["id"] }; //在DataTable行集合中通过参数id查找的是和先前指定主键列匹配的值 //如果主键列(组合键)为多个那么可以在Find方法中的参数为:Find(new Object(id,name)) DataRow row = dt.Rows.Find(id); //更新查找到该行的descrpition列中的数据 row["descrpition"] = description; //执行更新命令 adapter.UpdateCommand = new SqlCommand("update zzx set descrpition=@description where id=@id", conn); //创建一个参数对象 SqlParameter param = new SqlParameter(); //指定更新参数 param = adapter.UpdateCommand.Parameters.Add("@description", SqlDbType.Text); //指定源列(数据集的列名)为descrpition param.SourceColumn = "descrpition"; //指定源列(数据集的列名)版本为当前版本 param.SourceVersion = DataRowVersion.Current; param = adapter.UpdateCommand.Parameters.Add("@id", SqlDbType.Int); param.SourceColumn = "id"; param.SourceVersion = DataRowVersion.Original; //判断数据集中的数据是否又更新,删除,修改的列 if (ds.HasChanges()) { //更新数据 adapter.Update(dt); } } /// <summary> /// 删除行事件 /// </summary> protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { DataTable dt = ds.Tables[TableName]; int id = Convert.ToInt32(this.GridView1.DataKeys[e.RowIndex][0]); adapter.DeleteCommand = new SqlCommand("delete from zzx where id=@id", conn); adapter.DeleteCommand.Parameters.Add("@id", SqlDbType.Int, 4, "id"); //删除多行的方式用循环来删除不错.如果删除单行可以采用前面的DataRow的Find方法查找删除. foreach (DataRow dr in ds.Tables[TableName].Rows) { if (Convert.ToInt32(dr["id"]) == id) { dr.Delete(); } } adapter.Update(dt); GetDateBind(); } }
总结:
DataSet操作数据库原理:
ADO.NET通过检查在DataSet对象中的特定表的所有记录来决定
对数据库中的那条记录进行更新,添加,删除.当数据库中的的记录填充DataSet
对象时,ADO.net会为每个字段保存两个副本:初始值和当前值.
如果需要的话可以在表达式中指定需要的值来分别访问这两值
SqlCommandBuilder类的原理:
sqlCommandBuilder scb=new SqlCommandBuilder(adapter);
通过SqlCommandBuilder的构造函数传入一个SqlDataAdapter的对象,
该构造函数会使用SQL 的Update语句,(基于适配器对象的select命令)
来创建一个SqlCommand对象,然后将该Command对象指定给数据适配器的
UpdateCommand属性.SqlCommandBuilder类同样可以构建Insert和delete命令,
会在您创建的实例时自动完成.
SqlCommandBuilder对象虽然能够完成Insert,Delete,Update命令创建工作,
但是它是有缺点的,至少他们存在着如下限制:
1.它只能用于单个数据库表中的记录,如果又两个以上数据库表,将不能构建命令.
2.指定给DataAdapter对象的SelectCommand属性的SQL语句必须要返回一个包含唯一
识别返回记录值的列(也就是必须包含主键,一般来说是通过主键来保证的.)
3.如果SelectCommand属性变化了,必须调用适配器对象的RefreshSchema()方法来更新
元数据,它用于生成Insert,Update,Delete命令.
如果你的情况符合上述限制中任何一条,CommandBuilder对象都不会为你工作
很多时候都是用手工来创建的.