第一节: 大家好: 我们今天讲的还是代码生成,我们知道的有codedom是微软生成自己框架代码的一个类,可以说是自己生成

第一节:

大家好:
我们今天讲的还是代码生成,我们知道的有codedom是微软生成自己框架代码的一个类,可以说是自己生成
自己了.不过我说的生成是根据一定的规则来生成一定的代码.
  我们的DotNetAuto已经是升到了b/s框架了,可是还是不完善的,现在最主要的问题是:可空,model层定义
,dal的定义,表现层的代码实现.我们今天晚上来探讨一下.
   可空,在数据库中,因为有一些值不是所必须要的,按照这一定的原则,给定了一些空值,但是这些空值在
我们程序员的开发过程中,出现了许多不必要的麻烦,首先,在从数据库传值给model的时候,
当值类型为string的时候:  DBNULL可以用null表示, 但是在.net 2.0以前int ,datetime的表示就是比较
的麻烦了. 我估计,以前人们为了表示这些空值,是这样做的-1表示int的空值,1900-1-1表示datetime的空
值, 当然这在一定的条件下是可以的,但是总体来说却是不怎么明朗的.在.net2.0后 system.nullable<>
泛型得到了较好的使用 System.Nullable<int> 中是可以用null表示数据库可中的DBNULL的
,system.nullable<datetime>也是一样的...可以用null表示空值,
  从model到数据库的过程中,null也是不能直接用为dbnull的,所以我们采用的方法 是先判断是否空再传
值,

system.nullable<int> icardid;
if(icard.id.hasvalue)
{
 command.paramater["@cardid"].value=icard.value;
}
else
{
 command.paramater["@cardid"].value=DBNULL.VALUE
}
____________________________________________________
int icard;
command.paramater[i].value=icard
_____________________________________________________


反过来,就是要判断所读的字段来构造 这个system.nullable<int>的
测试:
 datareader getint32(i)可不可以读空值呀 如果可以直接生成null的值
    不可以的,不过可以先用isdbnull(i)来检测一下:

int? i=dr.isdbnull(i)?dr.getint32(i):null;

让我们用datatable datarow则为
dr[0] != DBNULL?convert.toint32(dr[i]): null;
_____________________________________________________

icard = sdr.getint32(i);
icard = convert.toint32(dr[i]);

_____________________________________________________
这就是model-数据库 技术的全部

第二节 界面的深入:
   第二部分是model与前台界面的关联:
    model->前台: 
      当string != null \  int? .hasvalue \ datetime? .hasvalue 
            textbox.text = string; textbox.text int.tostring(); |datetime.toshorttime();
先判断model不为空 再进行绑定  
dropdownlist -
先判断model不为空 (判断其中的值不为空-即为有可选项)   再进行绑定

 

******************************************************************************************* 
 
 password,password text,textarea, select-dropdownlisp,listbox, input-
buton,hidden,checkbox (2, 3, 4)radiobutton
=========================================================================================
前台-->model
textbox -- password --  strName = txtName.Text ; intCard = int.parse(txtCard.text);
dropdownlist   strName = dropdownlist.selectvalue ;intCard = int.parse
(dropdownlist.selectvalue);
这样的意思是可空的string -varchar会被赋与 空字符值 int 保留空值dbnull
radiobutton checkbox 是这样的了 呵呵

这一节就到这里吧 ,大家自己回去好好想一想.

=========================================================================================
  
大家好 这一节分析 , ①界面的生成-②验证控件- *javascript *绑定数据库的默认值

  我们最常用的有
 
 
  <asp:textbox{text种类} id="txtname"{名称} runat="server" MaxLenth="20"{长度} readonly=true{主键} Width=45{}
  value="" textMode="textbox"{类型}></asp:textbox>
 
   <lxf:inputdate id="txtbegin" runat="server" width=34></lxf:inputdate>

   <asp:dropdownlist id="ddlcatage" runat="server" >
 <listitme select=true> assd</listitme>

   </asp:dropdownlist>

   <asp:label id="label1" runat="server"></asp;label>
   <asp:button id="button1" />

 我也没有想法了.....

 

 

 第三节: 混合类 model+idal的优化+存储过程

在我们看到的这些类中,有一些是已经用过的BASE类 , 另外一些是用的自定义的连接数据库的,连接方法, 这些虽然已经用类实现 ,但是缺乏优化,

字段 的前缀: 怎么说呢 , 在匈牙利命名法中 前缀是很重要的..但在.net的时代里,前缀i,n,str不是太重要的手段表示字段了,我想这个可以优化一下的.

清晰的简单的架构是比较易实现的, 所以这一版本中 可以实现 ,伪存储过程的字符串, (petshop4)中的表达方式.
paramater可以存放:ipara... upara .. 用sqldatareader返回insert的插入后的值,update 错误值

模块化的设计

insert - update -deletebypk - deletebyids- selectbypk-selectall-selectbycatagory-selectallbywhere-selectbypage(X,Y)-
getcount();
**************************
getcount_bywhere(string);
selectbywhere(string,X,Y)

***************************

administrator

public bool IsExist();
public bool ChangePwd(old,new);
public bool Login(name,password);
public

user
***************************
假删 -bDelete  &&&&&&&&&&&&&&&&&&&&&   ISDELETED = 0

NEWS
增加 public int addcount();     &&&&&&&&&&&&&&&&&&&&&   Count = Count+1
得到外键: public 从外键中到得集合 &&&&&&&&&&&&&&&&&&&&& ID &&&&&&&&&&&&&&&&&&&&& Name
[一对多]

 

model 从有外键的列中得到类...

生成器中的model有存储过程对生成器的需求分析:
model要求全部的列作为生成的对象,并且包括含外键对应的表 (目前为必须设定)
存储过程对生成器的要求:除了执行model的u i d,外,另外的生成可以自行支配生成器的列选择器.

 

视图---- 外连接 --- 生成
这一部分的生成 , 有待与用用户控件的方式生成:
技术点:用户控件,事件,DOM
(今天是2006-11-20 23:20:43 手冷呀)
代码有向生成方面技术:
  虽然从直观上可以用最简单,最笨的方式生成所希望的代码,但这个过程绝对不是我们所期待的... 而且我们
会绝不会在只生成这方面停滞, 必然会向重构\代码分析\这一系列的方向展开....

模型:
petshop三层建模, 从发展的角度去看,单说建模的技术就是一种技术性很强的东东.

代码:
  统一命名规则..  就是我们自己所采用的风格..
 

从模型    -  >     代码
  dom 可以实现 建模技术:  ---writer类--工厂模式
  另类的生成 xml+xslt  总体来说是一种基于高层上的建模技术,效率不可知,但对于底层的掌握不好

通过简单命令行实现    解释器模式---- 设计模式

从代码  -   >    模型   ->代码  这也可以看成是一种重构的过程
  可以用编译器实现 -- 编译原理  --技术正则表达式

**前天分析的编程高手, 一方面是自己独到的见解,别人可能要花上很长的一短时间才能看的明白
 第二方面,是能力的一个方面,就是粒度比较的大,这里并不是说他的整体上是杂乱无章的,而是说
他的结构是相当的有效,另一方面是指他的代码段从量上说是大的,从含盖的内容上可以是一个不是
太明晰的结构性的东西,但是却十分有效.(先不知道自己的想法是不是正确 , 我感觉是未来人类的
一种思维方式,7->14之类的东东.. 单位的复杂粒度变大,细节上的东东,用成型算法)

在一定程度上的定型: 世界处于一种深度的递归状态,自己的思想也是这样的,递归的过程,是量变
引起质变的过程, 所以说要把握一个度,一个从量变到质变的度,不可以太快的进行下一个的递归,
就像是人们必须生产高级汽车后才生产离心飞行器的初版, 我是一个递归很快的人...所以说就忘
记了细化一些东东,对原有东西的充分吸收.  放慢递归速度,加快积累速度.

  
2006-11-21 22:38:10
定死里面的东东 里面的const变量
rdr : sqldatareader
command.paramter["@XX"]里面的东东,都是column的原形
param
params
//感觉在程序里改一个方法名 getIpara_order 很是容易,, 但现生成是有麻烦的,因为它需要一个
//规则支持,, 而现在没有的原因造成的..
GetIParameters()  : 获取参数
SQL_INSERT:插入的sql
SqlIParameter
//=>:          生成的模型
strSQL
sda:sqldataadpter
私有字段:db.column.tolower
属性:大写第一个db.column
页面定义的类: obj
类的命名:____________________
参数主键的定义______
TextBox前缀:txt
DropDownList:ddl

星期三 2006-11-22 23:51:55
今天生成了一部代码生成简版的(单表).
已经完成的功能有,类主体的生成,insert update delete select all,select by pk,
基本界面控件,界面与类的互交等三大功能

... 功能还有待完善 需要大量的测试,
就是要做大量的网页后才可以进一步升级, 除了目前测试是最主要的矛盾外,
系统还有不少的缺陷: 控件类:日期,多选,单选的功能   在测试中完善.............
系统方法实现太少,  在测试中完善.............
系统不支持多表,视图,存储过程,   在下一版本中完善.............

星期五 2006-11-24 23:28:07
今天测试:
buglist :
Datatime ->DataTime   马虎 -------库的原因
MaxLength 记忆不准确MaxLength
没有control 脑力不足
m_content    .     ; ----- 不细心  --欠考虑
obj.M_datetime.Value.ToShortDateString ..欠考虑
this.m_id = rdr.GetInt32(0);  重复  没考虑..
 'AND' 附近有语法错误。  程序有问题 bug --考虑-关联 - , 的长度是,但是 and 是5

命名空间 考虑
通用类

命名空间 :可有 可无  可以通过配置参数确定 ------有待实现 >>>>>> 类名
命名法则:从页面取值,, 不自动生成...
通用方法 - 私有字段,共有属性, 通用类生成表genTable 提议静态 

约定  命名空间==string.Empty 就不生成.....

下一阶段的目标是:
1.改造select all的属性, 绑定到泛型上  ,列分析清楚
2. 尝试构造多表model ---
3. 进行数据库的已有存储过程的掉用 实现方法可配制化,同时可以动态增加方法.先不要
考虑:反序列等保持状态的问题.

* 自定义控件的数据库操作 .. 难点.(后期扩展)2006-11-25 2:49:47
over

2006-11-25 22:41:32
发现:用datareader 的时候 return 值 与 output值不能同时返回回来......

2006-11-26 11:26:33
睡的真舒服..
要考虑的东西,
① petshop的order是如何插入item的
② 生成的数据集是怎么处理 方法类型的 select insert delete等.
一句话 ,第一步总是用能行的办法实现....
其实在第几步之前 我想应该是前多实现几种死的常用方法,实现可配置....再进行第二步的实现

看了一会petshop说实话.和他其实是有一定的差别 从建模方式上差距就很大.

2006-11-28 22:17:47
过了两天 ... 开始测试了 ..
...少 public ....
测了不少的BUG呀.. ... 呜呜
想着快却总是出问题喽.
..从整体的角度讲, 自动机有必要生成一些框架结构性的东西,比如App_Code文件夹等等,这就要求有项
目的考虑方式了.
现在有两个问题需要考虑 ①就是要建立整体性的方案,如何组织文件管理,是否已经有必要开始建立一个
新的项目开进行代码的生成.如果是那样的话 ,又应该如何去管理这些文件?
②就一些细节而言,如adminM.aspx是否有必要进行模式化的生成,生成的话 需要考虑模型的生成原子粒度
与采用何用方式生成,就目前而言,小粒度,复杂的模块,采用逐语句生成,但是对于网页页面却不一定的
试用.采用粒度较大一点的替换,将会提升一定的效率,.....呵呵....有点道理吧......粒度更大的时候
就采用块块集成的东东(我都不知道是什么了).

   这样的话,就涉及到组织程序框架的问题了,,我打算采用以前的那种方式,总体来说是十分有效的:建立
模块库,是不能随便改动的..里面有我自己定义的框架模型,程序是基于框架模型再跑动的.....我想就是一个不错的主意,,  有点Xslt的味道了,当然可以用他的框架生成,只是自己的东西随意性比较的大,最好是先按自己的思想一步步发展到和xslt同等程度的思考...
  这时的我回想起了我的codeback程序2005年的时候吧 , 就是采用的这种思想去做的,当时做的还可以,只是到后来考虑到了各种数据的表达形式的时候,就有点不想弄了感觉了..(2006-11-29 1:9:55)
呵呵,真是有所期待呀, 我想着过不了多久,我的自动机将再进一个新的版本,这个版本就叫V1.1吧,听起来有点熟悉的感觉的,今天就到这里吧。
任务:
①完善生成的后台页面代码
②开始进行构建模板库
③开始进行项目组织管理(这个到后期的时候 整个系统将改用,Add-in技术实现以技术更多的功能)
2006-11-29 1:16:07
[放慢递归速度,加快积累速度]