无废话,本帖提供一个 ASP.NET 的示例下载,包括五大功能「多笔编辑 + 离线编辑 + 多人并行写入冲突侦测 (Concurrent) + 批次写入数据库 + 保留用户在 GridView 的输入值」。
日前版工我要把十几年前的旧系统,翻新成 Web 界面,代码也要重写。为了搭配客户的操作习惯,要能提供「离线」编辑的功能,亦即使用者在 ASP.NET 所做的多个「 创建、修改、删除」内容,要能暂存在内存里,等到最后单击一个「存檔」Button,才一次回写至数据库。
-------------------------------------------------
本帖的示例下载点:
https://files.cnblogs.com/WizardWu/090225.zip
(执行本示例,需要 VS 2008 或 IIS,以及 SQL Server 数据库)
-------------------------------------------------
示例执行画面如下:
* 功能 1 : 多笔编辑
* 功能 2 : 离线编辑 (这个最难)
* 功能 3 : 多人并行写入冲突侦测 (Concurrent, 同时开启两个浏览器执行此示例,即可测试此一功能)
* 功能 4 : 批次 (Batch) 写入数据库 + Transaction
* 功能 5 : 保留用户在 GridView 的输入值
功能说明:
* 功能 1 : 多笔编辑 :
就是 GridView 每一行每一列都可输入,这也没什么,就讨人厌的客户和 SA 要求的功能。另 GridView 的每一行、每一列的控件,如:TextBox,仍可搭配 Validator,或 AJAX 的 FilteredTextBoxExtender 等控件,做用户的输入验证。
* 功能 2 : 离线编辑 :
如上图,用户单击橘色行右方的「新增」按钮,不会真的写入数据库,而是将用户在 FooterRow 输入的创建数据,暂存于内存的 DataTable 里,用户并能再持续创建多笔记录。要等到单击左下方的「存檔」按钮,才会将用户先前做的所有「创建、修改、删除」数据,一次全部写入数据库,以仿真一些远古旧系统的操作模式。
* 功能 3 : 多人并行写入冲突侦测 (Concurrent) :
舍弃 ObjectDataSource 控件的 Concurrent 功能,改用数据表里的一个 MODIFY_DT 字段,来判断是否在同一时间,有两人或多人同时欲编辑数据库里的同一笔记录。若是的话,只有先存储者能正确写入数据库,并在存储成功后,将目前时间一并写入数据库的 MODIFY_DT 字段;后存储者将被迫放弃,必须先离开此页后再回来、取得数据库里最新的 MODIFY_DT 字段的最新时间后,才能存储。
* 功能 4 : 批次写入数据库 + Transaction :
就是一次「创建、修改、删除」多笔记录至数据库,并加上数据库「事务 (Transaction)」,这也没什么,只要将多个 SQL 语句用「分号 (;)」串连起来即可。唯
一要注意的是,多个语句中的 Parameter Name 不可重复。
* 功能 5 : 保留用户在 GridView 的输入值 :
由于「创建」功能内嵌在 GridView 的 FooterRow 里,当用户按下「新增」按钮后,必须执行 GridView.DataBind(),以将创建一笔后的结果,实时显示在 GridView 里。但此举将导致用户在 GridView 其它既有数据行的输入值遗失,导致操作上的不便。因此我在用户按下「新增」按钮后,将其它数据行每个控件的输入值,先暂存至一个 DataTable 里;等到 GridView.DataBind() 之后,再从这个 DataTable 里,将所有的值填回 GridView 的每一行每一列。
最近开发的都是一些小系统,没机会用多高深的 Framework,或最新最炫的新技术,但必须靠一些硬底子功夫硬干,以应付一些客户和 SA 不合理的需求。
------------------------
附注:
代码的注释都是以繁体中文撰写的 (繁简的「行、列」刚好相反),以下为用字对照表:
簡 繁
数据 - 資料
数据库 - 資料庫
表 - 資料表
行 - 列
列 - 行
记录 - 記錄
字段 - 欄位
事务 - 交易
内存 - 記憶體
控件 - 控制項
------------------------