信息分成三类:数据源、控件、绑定信息
{XX}表示要被实际值替换的部分。
数据源:用Hidden,Name=DS${ID}${Updatable},value={SQL}${Keys}$~{kv1},{kv2},...~{kv3},{kv4}
控件:NAME={ID},value={value}
控件附加属性:NAME=PRO${ControlID},Value={P1$P2$P3}
绑定信息:每个绑定控件生成一个,用Hidden,Name=DB${ControlID}${Ind}${DS},Value={DF}${dataType}
DS$为数据源ID的固定开头,DB$为绑定ID的固定的开头,用于识别。
{ID}表示本控件的ID值,{SQL}表示数据源的SQL值,{Keys}表示数据源Keys值,{kvx}表示对应的Key的数据。
{value}表示控件的值。
{ControlID}表示绑定信息对应的Control的ID值,{DS}表示对应的数据源,{DF}表示对应的数据字段,{Ind}表示对应的行索引,{dataType}表示对应字段的数据类型。
保存时的处理:
1.把request.form中的数据分到三个hashtable中,htDataSource存Name以"DS$"以开头"$1"结尾的的key和Value,htDataBind存Name以"DB$"开头的key和Value,htControl存剩下的key和Value。
2.处理htDataSource中的每个元素的SQL,用正则得到其TableName,其keys和KeysValues,以htDataSource的键为键,TableName和(keys,KeysValues结构数组)构成的结构,生成名为htTable的hashtable。
3.处理htTable中的每一个元素eleA:
3.1对eleA.key,查找Value中{DS}为eleA.Key的{ID}的元素eleB,得到eleB.DF和eleB.Ind;根据eleB.Key的{ControlID}得到htControl中的元素eleC,得到eleC.Value 。
3.2如果eleB.Ind>eleA.Value.KeysValues.Count,则生成Insert语句:组合所有的eleB.DF和eleC.Value,加上eleA.TableName生成Insert;否则,生成Update语句,组合所有的eleB.DF和eleC.Value生成Set子句,eleC.Keys及eleC.KeysValues(ind)生成Where子句,加上eleA.TableName生成Update XXX set XXX Where XXX。