DataSet的CRUD

插入和查询:

 

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对象都不会为你工作
    很多时候都是用手工来创建的.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值