ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写Code Behind

[C#] ADO.NET #3-1 (GridView + DataReader + SqlCommand)完全手写、后置程序代码

之前有分享过一个范例

[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 --

How to implement Basic CRUD Functionality with the Entity Framework and ASP.NET Webforms application

(1) http://dotnetawesome.blogspot.com/2015/04/how-to-implement-basic-crud-functionality-entity-framework-aspnet-webforms.html

(2) http://dotnetawesome.blogspot.com/2015/04/part-2-how-to-implement-basic-crud-functionality-entity-framework-aspnet-webforms.html

时间: 2024-12-28 00:35:02

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

(5)C#之ADO.NET 手写SqlHelp.cs 以及改进

为了更快捷的反问数据库,以及更加符合面向对象封装的原则,我们应该有一个自己的数据库操作类,SqlHelper.cs  这样我们在访问数据库的时候就不必每一次都连接.赋值.执行了,可以比较方便的一步到位. 首先书写一个比较简易的SqlHelp.cs,分开写ExecuteNonQuery.ExecuteScalar.ExecuteReader. ◇首先配置连接变量(上一节中有说到) private static string connStr = ConfigurationManager.Connec

ADO.NET——Command(执行SQL) &amp; DataReader(读取数据库)

一,关于两个对象的基础知识 1,Command Command对象主要用于对数据源执行SQL命令并返回结果. ADO.NET提供了Connection来连接数据库,同时也提供了Command对象来查询数据库.同Connection对象一样,Command也有两种:OleDbCommand和SqlCommand.其区别同Connection对象. Command对象有一个属性:CommandType(sql语句或者存储过程):三个重要方法:ExecuteNonQuery(增.删.改影响的行数).E

ADO.NET快速入门——将DataReader作为函数返回值

相关知识: 在很多情况下,可能把数据库的访问封装到一个函数中,通过该函数返回一个DataReader对象给调用者.例如定义函数:SqlDataReader returnDR(),然后再Main函数中调用它. 但这里导致了一个问题:在哪里关闭数据库连接? 在returnDR()函数中关闭Connection,那么在Main函数中将无法获取每行数据: 在Main函数中关闭Connection,但是Main函数无法访问returnDR()函数内部定义的SqlConnection对象:(除非把SqlCo

ADO.NET数据库编程

ADO.NET数据库编程 1.ADO.NET的相关概念. Microsoft的新一代技术,是ADO组件的后继者. 主要目的是在.NET Framework平台存取数据. 提供一致的对象模型,可以存取和编辑各种数据源的数据,即对这些数据源,提供了一致的数据处理方式. ADO.NET保存和传递数据是使用XML格式.可实现与其他平台应用程序以XML文件进行数据交换. 2.数据访问类库的名称空间 针对不同的数据源,使用不同名称空间的数据访问类库,即数据提供程序.常用的数据源包括四种: Microsoft

Java进击C#——语法之ADO.NET

本章简言 上一章讲到关于C#语法的基础部分.了解相关的基础部分之后我们就要去了解一下C#是什么样子访问数库的.C#把访问数据库这一部分的知识点叫作ADO.NET.即是JAVA常常讲到的JDBC这一部分的知识点了.笔者根据使用数据库方式的不同又分为有线连接和无线连接(关于有线和无线的叫法是笔者个人定义的.因为看了不同的书里面很多叫法).不管是什么样子的叫法.只要明白有线是保持连接的状态下操作数据库.而无线是连接之后复制一份副本,关闭连接,对副本进行操作之后,在连接更新数据库.笔者认为如果只是使用的

数据库基础与ADO.NET和C#中的异常处理

一.数据库基础 1.启动数据库服务--SQLServer(MSSQLSERVER) 方式1: 开始--程序--Microsoft SQL Server 2008 R2  --配置工具--SQL Server 配置管理器--SQLServer服务 方式2: 进入控制面板--管理工具--服务   --找到SQL Server (MSSQLSERVER) 方式3: 开始--运行--输入 services.msc 回车后    进入到 服务列表中,   找到SQL Server (MSSQLSERVER

ADO.NET 学习笔记 入门教程

本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=57&page=1&extra=#pid63 这是本人在学习ADP.NET过程中所作的笔记,可作为ADO.NET入门或者复习的教程. 连接字符串: DataSource=localhost; AttchDBFilename=|DataDirectory|\Database1.mdf; InitialCatalog=UserDate; Integrated Secu

ADO.NET复习——自己编写SqlHelper类

今天复习了一次ADO.NET基础,整理一下自己的认为的重点: 编写SqlHelper类,方便我们执行数据库语句,这时可以直接调用封装在SqlHelper类的方法.现在大多数公司面试的时候,给你的面试题都会要你自己手写一个SqlHelper的类,这考的是自己的基本功,如果一个根基不牢固的开发人员,你写的代码肯定好不到哪里去. 下面是SqlHelper的演示代码,一定要熟练: 1 public static SqlHelper 2 { 3 //这里定义一个字符串变量,把数据库连接字符串赋值给它,也可

Asp.net有关GridView的使用

一.带提示语句的删除 二.使用config里面的连接字符串 三.鼠标移到GridView某一行时改变该行的背景色方法 四.两个事件 五.GridView实现自动编号 不难写