Step By Step 一步一步写网站[1] —— 填加数据

简介: 填加数据是一个项目必不可少的部分,也是一个基础操作,使用也是最频繁的。那么您是怎么实现添加数据的呢?添加数据可以分为几种情况。1、单表添加,不需要事务。最简单最常见2、多表(主从表)添加,不需要事务。3、多表(主从表)添加,需要事务。

填加数据是一个项目必不可少的部分,也是一个基础操作,使用也是最频繁的。
那么您是怎么实现添加数据的呢?

添加数据可以分为几种情况。
1、单表添加,不需要事务。最简单最常见
2、多表(主从表)添加,不需要事务。
3、多表(主从表)添加,需要事务。
4、其他。

今天先来说一下简单的,单表添加的情况。为了更形象一点,我们先来假设一个环境。

要求:信息发布系统,添加一条信息。
表名:T_News
字段:NewsID,标题,作者,内容,发布时间等。

先来说一下我常用的方法,然后在猜想一下OOD的方法,最后猜想一下三层的方法。
接下来是当需求发生变化如何应对、添加功能了怎么办、更换数据库又怎么处理。

在这些情况下三种方式的对程序的修改成都的对比。

最后最后是 抽象。毕竟一个系统不是只有一个填加数据的地方,假设有一百的,那么怎么处理更好呢?

>>想好了的,思维却乱了,当初好好学习就好了。

>>好了,继续。

(假设数据库已经设计好了,文档、设计都做好了。)

 第一步:写.aspx页面。在页面上绘制文本框、下拉列表框、复选框等控件,用来接收用户输入的信息。

在写点js脚本的验证了这类的代码。

代码略

分析:这一步基本没有什么异议。aspx的变动对下面的影响基本不大。

第二步:写.aspx.cs文件。

1、定义一个数组(string[] str1),目的是存放字段名称,要添加哪些字段就定义多少数组元数(下标)。

2、把字段放在数组里面。

3、在定义一个数组(string[] str),目的是存放字段对应的数据。要和上面的数组内容一一对应

4、赋值,从控件里面取值放在str 里面。

5、必要的验证。比如标题不能为空,标题不能重复等。

6、调用“我的数据访问层”里的一个方法添加数据。

7、根据返回信息判断是否发生异常,并作相应的处理。

8、结束。

说明:可以使用组合SQL语句(就是insert into )的方法,也可以使用存储过程的方法。两个方法区别不大。

代码:SQL

 

public   void  add()
        
... {
            
//添加数据
            string[] str1 = new string[3];
            
//NewsID(自增1),标题,作者,内容,发布时间(字段的默认值(GetDate()))
        
            
定义字段#region 定义字段
            str1[
0= "Title";
            str1[
1= "Editor";
            str1[
2= "Content";
            
            
#endregion


            
string[] str = new string[3];
    
            
获取数据#region 获取数据
            str[
0= this.Txt_Title.TextTrimNone;    //标题;
            str[1= this.Txt_Editor.TextTrimNone;    //作者;
            str[2= this.Txt_Content.TextTrimNone;    //内容;
            
            
#endregion


            
验证数据#region 验证数据
            
if (str[1].Length == 0)
            
...{
                Page.RegisterStartupScript(
"err",JYK.Functions.myAlert("请填写主题名称!"));
                
return;
            }

            
if (str[8].Length == 0)
            
...{
                Page.RegisterStartupScript(
"err",JYK.Functions.myAlert("请填写内容!"));
                
return;
            }

            
#endregion

            
            
//实例化
            JYK.DataAccessLayer dal = new JYK.DataAccessLayer();
            
//添加数据,获取新添加的数据的NewsID字段的值
            string NewID = dal.InsertDataStr("T_News",str1,str);
            

            
检查是否出现异常#region 检查是否出现异常
            
if (dal.ErrorMsg.Length > 2)
            
...{
                Page.RegisterStartupScript(
"err",JYK.Functions.myAlert("保存信息的时候出现意外情况,请与我们联系!"));
                
return;
            }

            
#endregion


            dal.Dispose();
        }

 

 代码:存储过程

 

public   void  add()
        
... {
            
//添加数据
            
//NewsID(自增1),标题,作者,内容,发布时间(字段的默认值(GetDate()))
            
            
string[] str = new string[3];
            
获取数据#region 获取数据
            str[
0= this.Txt_Title.TextTrimNone;    //标题;
            str[1= this.Txt_Editor.TextTrimNone;    //作者;
            str[2= this.Txt_Content.TextTrimNone;    //内容;
            
            
#endregion



            
验证数据#region 验证数据
            
if (str[1].Length == 0)
            
...{
                Page.RegisterStartupScript(
"err",JYK.Functions.myAlert("请填写主题名称!"));
                
return;
            }

            
if (str[8].Length == 0)
            
...{
                Page.RegisterStartupScript(
"err",JYK.Functions.myAlert("请填写内容!"));
                
return;
            }

            
#endregion

            
            JYK.DataAccessLayer dal 
= new JYK.DataAccessLayer();
    
            
添加存储过程的参数#region 添加存储过程的参数
            dal.addNewParameter(
"@Title",str[0],100);    //nvarchar(100) 类型 
            dal.addNewParameter("@Editor",str[1],20);    //nvarchar(20) 类型 
            dal.addNewParameter("@Content",str[2]);        //ntext 类型 
            
//dal.addNewParameter("@Hits",Int32.Parse(""));    //假设要添加一个int类型的数据,这里只是演示
            #endregion


            
//执行存储过程
            dal.RunStore("Proc_News_AddData");    
        
            
检查是否出现异常#region 检查是否出现异常
            
if (dal.ErrorMsg.Length > 2)
            
...{
                Page.RegisterStartupScript(
"err",JYK.Functions.myAlert("保存信息的时候出现意外情况,请与我们联系!"));
                
return;
            }

            
#endregion

            
            dal.Dispose();
        }

 

两段代码基本相同,只是个别的地方有一点不同。

第三步:数据访问层

应该写点代码吧,但是这里我直接使用SQLHelp这类的Help工具直接代替数据访问层。所以呢这里就不需要在写代码了。

这里使用的是我自己写的Help,我把他叫做“我的数据访问层”。

小结:

 优点:

1、只涉及.aspx和.aspx.cs两个文件。.aspx.cs里面没有需要重用的代码,所以没有提出来放在.cs文件。这样也就不需要数据传递了,省了一个实体类。

2、数据访问层使用通用的方式,无需再编写代码。

3、所需要的代码少。我觉得代码少是便于维护的一个基础。

4、没有出现SQL语句,也没有出现 SqlClient 里面的对象,也就是说更换数据库的话,不需要修改这些代码。

缺点:

看起来不符合“标准”,一开始会用着不习惯。没有采用强类型,好像也不是弱类型。没有OO的感觉,有点乱。

 我的数据访问层的源码

先写到这里,下一篇写猜想的OOD的方法。因为我还不会OO所以只好猜想了。

 

 

相关文章
|
存储 关系型数据库 数据库
聊多版本并发控制(MVCC)
MVCC是数据库并发控制技术,用于减少读写冲突。它维护数据的多个版本,使事务能读旧数据而写新数据,无需锁定记录。当前读获取最新版本,加锁防止修改;快照读不加锁,根据读取时的读视图(readview)决定读哪个版本。InnoDB通过隐藏字段(DB_TRX_ID, DB_ROLL_PTR)和undo log存储版本,readview记录活跃事务ID。读已提交每次读取都创建新视图,可重复读则在整个事务中复用一个视图,确保一致性。MVCC通过undo log版本链和readview规则决定事务可见性,实现了非阻塞并发读。
1013 5
聊多版本并发控制(MVCC)
|
安全
阿里云服务器被xmrigMiner及pnscan及伪装httpd的病毒入侵排查记录
阿里云服务器被xmrigMiner及pnscan及伪装httpd的病毒入侵排查记录
1525 0
J3
|
存储 前端开发 JavaScript
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
J3
844 0
个人开发的小破站,居然把掘金的文本编辑组件给搬上来了
|
人工智能 自然语言处理 运维
工业组态 + LLM : 大模型技术引领传统工业软件创新与实践(上)
工业组态 + LLM : 大模型技术引领传统工业软件创新与实践(上)
2813 1
|
网络协议 Python
|
存储 NoSQL 分布式数据库
Flink 细粒度资源管理问题之调整 slot 配置来提高资源利用效率如何解决
Flink 细粒度资源管理问题之调整 slot 配置来提高资源利用效率如何解决
|
数据安全/隐私保护
单片机课程设计——基于C51电子密码锁(源代码)
单片机课程设计——基于C51电子密码锁(源代码)
|
负载均衡 算法 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
434 0
|
定位技术 API
Google Earth Engine(GEE)——如何给地图添加一个不同底图
Google Earth Engine(GEE)——如何给地图添加一个不同底图
353 0
|
Web App开发 存储 JavaScript
【面试题】2023前端vue面试题及答案(一)
【面试题】2023前端vue面试题及答案(一)
305 0