之前有分享过一个范例

[C#] ADO.NET #3 (GridView + SqlDataSource)完全手写、后置程序代码,兼论 SqlDataSource与UpdateParameter/DeleteParameter的用法

后来,在网络上找到的人,就开始大量地为「SqlDataSource小精灵」动手写程序

这并非我的原意。

我的意思是,透过手写的程序代码,让您知道 SqlDataSource「骨子里面」也是ADO.NET

但,网络上乱找范例,抄了就上.....这样的心态,我也帮不上忙。

https://www.youtube.com/watch?v=tnGqKV4F_Pk

................................................................................................................

前两天,有位读者询问「上集第十章的范例, GridView一次只能编辑(更改)、删除一笔记录,为何要用DataSet来做??」

因为.......我拿这个范例来 Demo DataSet的删除、分页、更新等等功能

不是「只能」这样做  Orz

所以,我把这个范例(ASP.NET专题实务 / 松岗出版。上集,第十章)

改用 SqlCommand + DataReader来做。

首先,画面上只有一个简单的 GridView

<asp:GridView ID="GridView1" runat="server"  PageSize="5" DataKeyNames="id"
            OnRowCancelingEdit="GridView1_RowCancelingEdit"
            OnRowDeleting="GridView1_RowDeleting" OnRowEditing="GridView1_RowEditing"
            OnRowUpdating="GridView1_RowUpdating">
            <Columns>
                <asp:CommandField ButtonType="Button" ShowEditButton="True" />
                <asp:CommandField ShowSelectButton="True" />
                <asp:CommandField ShowDeleteButton="True" />
            </Columns>
        </asp:GridView>

后置程序代码:

using System.Web.Configuration;
using System.Data.SqlClient;
using System.Data;
 
 
    protected void DBInit()   //====自己手写的程序代码, Datareader / SqlCommand ====(Start)
    {  
           // 透过 DataReader 来做分页,以前已经发表过了。
           // 请看下面文章& Youtube影片教学: 

[.NET 4.5]GridView自定义分页的新属性,AllowCustomPaging与 VirtualItemCount #2 范例 - DataReader +数据库分页

 
    }
 
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DBInit();   //---只有[第一次]执行本程序,才会进入 if判别式内部。
            // 第一次执行本程序,请从「GridView 第一页(0)」看起。
        }
    }
 
 
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {   //----修改、更新
 
        //----因为前面有三个「功能键(编辑、选取、删除)」,所以Cells[ ]从零算起,需扣掉前三个功能键与 id字段。
        TextBox my_test_time, my_title, my_author;
 
        my_test_time = (TextBox)GridView1.Rows[e.RowIndex].Cells[4].Controls[0];   // 抓到「Text控件」。
        my_title = (TextBox)GridView1.Rows[e.RowIndex].Cells[5].Controls[0];
        my_author = (TextBox)GridView1.Rows[e.RowIndex].Cells[6].Controls[0];
 
        //=== DataReader的写法 ==========================================
        SqlConnection Conn = new SqlConnection("您自己的链接字符串,或是Web.Config里面的链接字符串");
        Conn.Open();  
        
        //== (2). 执行SQL指令。或是查询、捞取数据。
        SqlCommand cmd = new SqlCommand("update [test] set [test_time] = @test_time, [title] = @title, [author] = @author where [id] = @id", Conn);
        cmd.Parameters.AddWithValue("@test_time", Convert.ToDateTime(my_test_time.Text));
        cmd.Parameters.AddWithValue("@title", my_title.Text);
        cmd.Parameters.AddWithValue("@author", my_author.Text);
 
        cmd.Parameters.AddWithValue("@id", (int)GridView1.DataKeys[e.RowIndex].Value);
        //---- GridView1.DataKeys[e.RowIndex].Value 是指:「用户点选的那一列」数据,所对应的数据表「主键(Primary Key)值」。
 
        //== (3). 自由发挥。
        int RecordsAffected = cmd.ExecuteNonQuery();
        //Response.Write("执行 Update的SQL指令以后,影响了" + RecordsAffected + "列的纪录。)";
 
        //== (4). 释放资源、关闭数据库的链接。
        cmd.Cancel();
 
        if (Conn.State == ConnectionState.Open)   {
            Conn.Close();
            Conn.Dispose(); 
        }
        //==========================================================
 
 
        //----修改、更新完成!!离开「编辑」模式  ----
        GridView1.EditIndex = -1;
        DBInit();
    }
 
 
    //==============================================
    //== GridView的分页,无法搭配 DataReader。所以要自己写分页!
 
    //protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    //{   //----分页 Start----
    //    GridView1.PageIndex = e.NewPageIndex;
    //    DBInit();
    //}
 
 
    //==============================================
    protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
    {   //----编辑模式----
        GridView1.EditIndex = e.NewEditIndex;
        DBInit();
        //----画面上的GridView,已经事先设定好「DataKeyName」属性 = id ----
        //----所以编辑时,主键id 字段会自动变成「只读」----
    }
 
    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {   //---离开「编辑」模式----
        GridView1.EditIndex = -1;
        DBInit();
    }
 
 
 
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {   //----删除一笔数据
 
        //=== DataReader的写法 ==========================================
        SqlConnection Conn = new SqlConnection("您自己的链接字符串,或是Web.Config里面的链接字符串");
        Conn.Open();   //---- 这时候才连结DB
 
        //== (2). 执行SQL指令。
        SqlCommand cmd = new SqlCommand("delete from [test] where [id] = @id", Conn);
        cmd.Parameters.AddWithValue("@id",(int)GridView1.DataKeys[e.RowIndex].Value);
 
        //== (3). 自由发挥。
        int RecordsAffected = cmd.ExecuteNonQuery();
 
        //== (4). 释放资源、关闭数据库的链接。
        cmd.Cancel();
        if (Conn.State == ConnectionState.Open)
        {
            Conn.Close();
            Conn.Dispose(); 
        }
        //==========================================================
 
        //----「删除」已经完成!!记得重新整理画面,重载资料----
        DBInit();
    }

这个范例的程序代码看来虽然多又杂

但拆解开来,不过是三大主题:

  • 大型控件的 CommandField & 对应的事件(事件里面的 e,是什么意思?)
  • .FindControl()方法与 .Controls
  • ADO.NET ( DataReader + DataSet / DataTable)

这三个主题要讲一整天的课

所以初学者看不懂,才是「正常的」!因为有很多学问要先搞懂。

对应的课程如下:

这也是七周课程里面的「第三天&第四天」重点!!

远距教学-- 大型控件完全解密+ADO.NET实战范例 (14hr)

相关文章&范例:

[习题]上集 Ch 14-4 (Repeater与 ListView版) -- 撰写ADO.NET DataReader的分页程序#2(搭配SQL指令 ROW_NUMBER)

[习题]上集 Ch 14-4 撰写ADO.NET DataReader的分页程序#3(搭配SQL 2012指令 OFFSET...FETCH)

[读书心得]资料分页的优化,以SQL 2012的 OFFSET-FETCH为例

[习题]上集 Ch 14-4 (Repeater与 ListView版) -- 撰写ADO.NET DataReader的分页程序#2(搭配SQL指令 ROW_NUMBER)

GridView自定义分页样式#1(以下拉式选单,DropDownList做分页)与分页样版(PagerTemplate)-- TopPagerRow与 BottomPagerRow属性

https://www.youtube.com/watch?v=oY7jd0ABXeM

................................................................................................................

这位外国朋友每一篇文章与范例,都贴心地附上 YouTube影片教学,实在令人佩服
推荐给大家。
 
相同范例,他改用 EF 来做 GridView CRUD --
 

ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写Code Behind的更多相关文章

  1. ADO SQL手写分页

    //实现层 ---------------------------------------------------------分割线---------------------------------- ...

  2. 抓取GridView "编辑"模式下,TextBox修改后的数值

    [FAQ]抓取GridView "编辑"模式下,TextBox修改后的数值 -- ASP.NET专题实务「上集」Ch.10 抓取GridView "编辑"模式下 ...

  3. C#通用数据访问类库

    说明:此篇文章是给那些和我一样仍在使用ADO.NET访问数据库的.NET开发人员写的,因为某些原因,比如还在使用.NET3.0以下版本开发.NET应用或者所使用的数据库对ORM支持不是很好,或者是对O ...

  4. 017. ADO.NET Connection和command及DataReader

    ADO.NET主要包括Connection , command , DataReader, DataSet, DataAdapter5个对象, 通过这5个对象可以对数据库进行查询, 添加, 修改及删除 ...

  5. ADO.NET数据库编程

    ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和 ...

  6. ADO.Net知识总结

    (一)基础知识 ADO.NET: .NET中用来向数据库提交执行SQL语句的一堆类 本机访问直接"Windows验证",但是一般项目中都是单独的数据库服务器,程序在另外一台电脑上连 ...

  7. ADO.NET基础笔记

    ADO.NET 程序要和数据库交互要通过ADO.NET进行,通过ADO.Net就能在程序中执行SQL了. ADO.Net中提供了对各种不同的数据库的统一操作接口. 连接字符串: 程序通过连接字符串指定 ...

  8. ADO.NET学习笔记(1)

    ADO.Net是.Net框架中为数据库的访问而封装的一个库.通过这个库我们可以简单便捷的访问数据库,并对数据库进行一些增删改查的操作,目前ADO.Net支持四种主流的数据库,分别是SQL.OLE DB ...

  9. ADO.NET之一:连接层

    ADO.NET大部分由System.Data.dll核心程序集来表示. ADO.NET类库有三种完全不听的方式来实现数据访问:连接式.断开式和通过Entity框架.连接式就是会一直占用网络资源,断开式 ...

随机推荐

  1. 交叉编译Spice-gtk

    Fedora环境 编译环境 操作系统: 64位 Fedora23 下载源文件 spice-gtk.spice-protocol 安装依赖 $ sudo yum install -y dh-autore ...

  2. JAVA中的工厂方法模式和抽象工厂模式

    工厂方法模式: 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类.类型:创建类模式类图: 类图知识点:1.类图分为三部分,依次是类名.属性.方法2.以& ...

  3. Maven核心知识

    什么是Maven? Maven是基于项目对象模型(POM), 可以通过一小段描述信息来管理项目的构建和文档的软件项目管理工具 目录结构如下 src main java package test jav ...

  4. c++手工扩栈

    -Wl,--stack=64000000 c++手工扩展

  5. AT2348 HonestOrUnkind

    传送门 显然\(a>b\)的情况下才有解 考虑先找出一个诚实的人,然后剩下的都可以在\(n\)次以内问出来了 发现如果一个人说另一个人是说谎的那么这两个人必有一个是说谎的,由于诚实的人严格多于不 ...

  6. angularjs 使用angular-sortable-view实现拖拽效果(包括拖动完成后的方法使用)

    首先还是看效果图吧,方便大家可以快速得知是否是自己需要的功能:(抱歉电脑还未安装动图软件,先用.png) 如果上图是你需要的功能效果图,那么请往下看,我有写出来例子哦~ 使用这个插件有几个好处,首先: ...

  7. MySQL存储过程的动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  8. 012 Integer to Roman 整数转换成罗马数字

    给定一个整数,将其转为罗马数字.输入保证在 1 到 3999 之间. 详见:https://leetcode.com/problems/integer-to-roman/description/ cl ...

  9. Codeforces Round #172 (Div. 2) D. Maximum Xor Secondary 单调栈应用

    http://codeforces.com/contest/281/problem/D 要求找出一个区间,使得区间内第一大的数和第二大的数异或值最大. 首先维护一个单调递减的栈,对于每个新元素a[i] ...

  10. Java 编码规范有感

    应小组要求,开发测试都需要考阿里编码规范,因此,相当于是突击了一下关于编码规范方面的知识,目前做的项目后期需要进行项目迁移,数据迁移,功能迁移... 各种迁移... 阿里巴巴编码规范(Java)考试地 ...