`

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

 

分享到:
评论

相关推荐

    通过Web服务获取DataSet.rar

    它支持CRUD(创建、读取、更新和删除)操作,使得在客户端处理和分析数据变得方便。 接着,我们来看如何通过Web服务获取DataSet。Web服务通常基于SOAP(Simple Object Access Protocol)或REST(Representational ...

    .net的crud实例(刚忘了数据库,不好意思)

    .NET的CRUD(Create, Read, Update, Delete)实例是基于.NET框架进行数据库操作的基本示例,主要用于演示如何使用编程语言如C#或VB.NET与SQL Server数据库进行交互。在这个例子中,我们看到的是使用Visual Studio ...

    数据集和数据库的同步-DataSET

    DataSet提供了强类型的数据操作,可以方便地进行CRUD(创建、读取、更新、删除)操作。 数据库同步是指保持数据库系统中多个副本的一致性。在DataSet和数据库之间进行同步通常涉及以下几个步骤: 1. **填充DataSet...

    PHP_DataSet.rar_DataSet p

    6. **数据操作**:提供CRUD(创建、读取、更新、删除)操作的方法,如`insert()`,`select()`,`update()`和`delete()`。 7. **序列化与反序列化**:为了保存和恢复DataSet的状态,可以实现序列化和反序列化功能。PHP...

    将DataSet对象的更新映射会数据库的操作事例

    总的来说,这个案例展示了如何结合使用DataSet、GridView和ASP.NET事件处理机制来实现对数据库数据的CRUD(创建、读取、更新和删除)操作。通过这种离线数据处理模式,开发者可以提供更灵活的用户体验,同时保持与...

    C#用VS实现CRUD操作(作业).zip

    在本项目"C#用VS实现CRUD操作(作业)"中,我们将探讨如何使用Microsoft Visual Studio(VS)作为集成开发环境(IDE),结合C#语言来实现数据库的基本 CRUD(Create, Read, Update, Delete)操作。CRUD是任何数据...

    c# + access(crud)例子

    ADO.NET通过Connection对象连接数据库,使用Command对象执行SQL命令,DataAdapter对象用于填充DataSet或DataTable,而DataReader对象则用于高效地读取大量数据。 2. **连接Access数据库**: 要连接到Access数据库...

    Dataset2XLS_delphi_

    DataSet通常包括TClientDataSet、TDataset、TTable等组件,它们提供了数据的CRUD(创建、读取、更新和删除)操作。在这个实例中,我们可能看到如何将这些数据集组件中的数据转换为Excel格式,从而生成一个.XLS文件。...

    深入DataSet与DataAdapter视频+实例教程,本视频详细讲解了它们的关系和用法,是非常好的

    在实例部分,教程可能通过一个具体的数据库操作示例,如CRUD(创建、读取、更新、删除)操作,来展示如何利用DataSet和DataAdapter。你将学习如何创建一个新的DataAdapter,连接到数据库,编写SQL查询,填充DataSet...

    datasetWinform_dataset_.net_

    它支持数据的CRUD(创建、读取、更新和删除)操作,并且可以处理数据的关联关系。 `DataGridView`控件是Winform中用于显示表格数据的强大工具。它可以与多种数据源进行绑定,包括`DataSet`、`DataTable`或数组等。...

    个人通讯录 C# DataSet

    DataSet通过DataTable对象提供了对数据的CRUD(创建、读取、更新和删除)操作,使得在没有实时连接数据库的情况下也能进行数据处理。 其次,项目中提到了TreeView控件的使用。TreeView是Windows Forms中的一种控件...

    crud.zip_2012_CRUD VB.NET_QJZ6_rubberuzi_traila99

    VB.NET可以使用SQL SELECT语句或者ADO.NET中的DataSet、DataView等组件来实现。开发者通常会创建一个查询,然后用结果填充控件,如DataGridView,展示给用户。 更新(Update):当需要修改现有记录时,VB.NET会使用...

    DataSet 和XML

    - **数据操作**:DataSet提供了DataTable、DataRow、DataColumn等对象,支持CRUD(创建、读取、更新、删除)操作。 - **事件驱动**:DataSet中的DataTable会触发RowChanging、RowDeleted等事件,便于在数据更改时...

    基于三层Vs.net+SQLServer2005实现单张表的CRUD(GridView带分页).

    在这个项目中,SQL Server 2005是数据存储的平台,可能通过ADO.NET的DataSet、DataTable、SqlCommand等对象进行数据操作。 为了实现这个功能,开发者需要熟练掌握以下技术: - ASP.NET控件:如GridView,用于在...

    实验七使用DataSet访问数据库.docx

    实验七的目的是让学生掌握如何利用DataSet和DataAdapter来访问SQL Server数据库,进行基本的CRUD(创建、读取、更新、删除)操作。DataSet是.NET框架中的一个离线数据存储区域,它可以存储从数据库检索的数据,并...

    02-SqlHelper对CRUD操作的封装

    除了基本的CRUD操作,SqlHelper还提供了一些其他功能,如ExecuteScalar(用于获取单个值,如COUNT(*)),以及ExecuteDataset(用于获取DataSet对象,用于多表查询)。 **四、SqlHelper的优势** 1. **代码复用**:...

    DATASET 与 DATAREADER对象有什么区别

    - **DataSet** 支持添加、删除、修改行和列,可以实现对数据的离线更改,然后通过DataAdapter将这些更改同步回数据库,适合于需要进行CRUD操作(创建、读取、更新、删除)的应用。 - **DataReader** 不支持此类...

    CRUD_WinForm:CRUD Basico de Windows窗体

    通过ADO.NET的Dataset或DataAdapter,可以从数据库查询数据并填充到数据网格视图中,使得用户可以浏览所有记录。 3. 更新(Update):当用户需要修改数据时,可以通过选择数据网格视图中的行来编辑数据,然后使用...

    C#_mySQL CRUD.rar

    在WinForm应用中,开发者可能使用了数据绑定技术,将数据源(如DataTable或DataSet)与UI控件关联,实现数据的实时更新和展示。 7. **批处理操作**: 项目描述中提到“小批量写入数据”,这可能涉及到`Batch SQL`...

    CRUD-Organizador-Processos

    3. 数据访问对象(DAO)或Entity Framework:在C#中,可以使用ADO.NET的DataSet、DataTable、DataAdapter等类直接操作Access数据库。或者,如果项目规模较大,可能采用Entity Framework,这是一个更高级的对象关系...

Global site tag (gtag.js) - Google Analytics