|
  
- 帖子
- 6176
- 积分
- 1165
- 技术分
- 293
- 来自
- 不看PM的
- 在线时间
- 2175 小时
- 注册时间
- 2002-5-9
|
16#
发表于 2005-6-22 00:48
| 只看该作者
第二次编写,可以生成模型类和数据访问类,在数据访问类上的备注字段和主键的判断还需要推敲确定,现在是我根据Connection.openSchema方法遍历出的字段属性比较判断出来的。如果时间和技术允许,我希望能把另外的事件处理类,前台表现类(包括表单生成,数据列表页,详细显示页)一并生成,这将大大减轻程序员的编码时间和难度,前提是这个框架设计是健壮,安全且合理的,这就需要大家来一起测试改进。目前用VC做个界面的计划也在进行中 <style> * {font:12px Tahoma} table{width:760px} </style> <% ’On Error Resume Next Class Generator Private IDataPath Private IConnectionString Private IDataDir Private IDalDir Private IBllDir Private IEventDir
Private FSO Private File Private Conn Private cmd Private Rs Private Cat
Public Property Let DataPath(ByVal Value) IDataPath = Value IConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(IDataPath) End Property Public Property Get DataPath() DataPath = IDataPath End Property
Public Property Let ConnectionString(ByVal Value) IConnectionString = Value End Property Public Property Get ConnectionString() ConnectionString = IConnectionString End Property
Public Property Let DataDir(ByVal Value) DetectDir(Value) IDataDir = Value End Property Public Property Get DataDir() DataDir = IDataDir End Property
Public Property Let DalDir(ByVal Value) DetectDir(Value) IDalDir = Value End Property Public Property Get DalDir() DalDir = IDalDir End Property
Public Property Let BllDir(ByVal Value) DetectDir(Value) IBllDir = Value End Property Public Property Get BllDir() BllDir = IBllDir End Property
Public Property Let EventDir(ByVal Value) DetectDir(Value) IEventDir = Value End Property Public Property Get EventDir() EventDir = IEventDir End Property
Public Sub Generate() Dim Tables, i, L Tables = ReadTable() L = UBound(Tables) For i=0 To L Call Process(Tables(i)) Next End Sub
Public Sub GenerateByTable(ByVal Table) Call Process(Table) End Sub
Private Sub Class_Initialize() Set Conn = Server.CreateObject("ADODB.Connection") Set Rs = Server.CreateObject("ADODB.RecordSet") Set FSO = Server.CreateObject("Scripting.FileSystemObject") Set Cat = Server.CreateObject("ADOX.Catalog") Set Cmd = Server.CreateObject("ADODB.Command") DataDir = "DataClass/" DalDir = "DalClass/" BllDir = "BllClass/" EventDir = "Action/" End Sub
Private Sub Class_Terminate() CloseConn() CloseRs() Set Cat = Nothing Set Cmd = Nothing Set FSO = Nothing Set File = Nothing End Sub
Private Sub Process(ByVal Table) Set Rs = ReadColumn(Table) ’Call ProcessData(Rs) ’Call ProcessDal(Rs) Call ProcessBll(Rs) ’Call ProcessEvent(Rs) End Sub
Private Sub ProcessData(ByRef Rs) Rs.Filter = "ORDINAL_POSITION=1" If Rs.EOF Then Exit Sub Dim n : n = 0 Dim Table : Table = Rs("TABLE_NAME") Dim TmpString : TmpString = "<%" & vbCrLf & "Class Data" & Table & vbCrLf & vbCrLf Dim Def, Pro Do n = n + 1 Rs.Filter = "ORDINAL_POSITION=" & n If Rs.EOF Then Exit Do Def = Def & vbTab & "Private I" & Rs("COLUMN_NAME") & vbCrLf Pro = Pro & vbCrLf & vbTab & "’" & Rs("COLUMN_NAME") & vbCrLf &_ vbTab & "Public Property Let " & Rs("COLUMN_NAME") & "(ByVal Value)" & vbCrLf & vbTab &_ vbTab & "I" & Rs("COLUMN_NAME") & " = Value" &_ vbCrlf & vbTab & "End Property" &_ vbCrlf & vbTab & "Public Property Get " & Rs("COLUMN_NAME") & "()" &_ vbCrLf & vbTab & vbTab & Rs("COLUMN_NAME") & " = I" & Rs("COLUMN_NAME") &_ vbCrlf & vbTab & "End Property" & vbCrlf Loop TmpString = TmpString & Def & Pro &_ vbCrlf & vbTab & "Private Sub Class_Initialize()" &_ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbTab & "Private Sub Class_Terminate()" &_ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbCrLf& "End Class" & vbCrLf & "%" & Chr(62) Call SaveDataClass(Table, TmpString) End Sub
Private Sub ProcessDal(ByRef Rs) Rs.Filter = "ORDINAL_POSITION=1" If Rs.EOF Then Exit Sub Dim n : n = 0 Dim Table : Table = Rs("TABLE_NAME") Dim LTable : LTable = LCase(Table) Dim TmpString : TmpString = "<!--#include virtual=""/" & DataDir & Table & ".asp""-->" & vbCrLf & "<%" & vbCrLf & "Class Dal" & Table & vbCrLf & vbCrLf & vbTab & "Private db" & vbCrLf & vbTab & "Private " & LTable & vbCrLf Dim Def, Pro Dim PK, Columns, ColumnName, LongTextField, soSql Do n = n + 1 Rs.Filter = "ORDINAL_POSITION=" & n If Rs.EOF Then Exit Do ColumnName = Rs("COLUMN_NAME") If CInt(Rs("COLUMN_FLAGS")) = 90 AND CInt(Rs("DATA_TYPE")) = 3 Then PK = ColumnName If CInt(Rs("COLUMN_FLAGS")) = 234 AND CInt(Rs("DATA_TYPE")) = 130 AND Rs("CHARACTER_OCTET_LENGTH") = "0" Then LongTextField = LongTextField & "," & ColumnName Columns = Columns & "," & ColumnName If n = 1 Then soSql = vbTab & vbTab & " ." & ColumnName & " = rs(""" & ColumnName & """)" & vbCrLf Else soSql = soSql & vbTab & vbTab & " ." & ColumnName & " = rs(""" & ColumnName & """)" & vbCrLf End If Pro = Pro & vbCrLf & vbTab & "’" & ColumnName & vbCrLf &_ vbTab & "Public Property Let " & ColumnName & "(ByVal Value)" & vbCrLf & vbTab &_ vbTab & LTable & "." & ColumnName & " = Value" &_ vbCrlf & vbTab & "End Property" &_ vbCrlf & vbTab & "Public Property Get " & ColumnName & "()" &_ vbCrLf & vbTab & vbTab & ColumnName & " = " & LTable & "." & ColumnName &_ vbCrlf & vbTab & "End Property" & vbCrlf Loop Columns = Replace(Columns, "," & PK & ",", "") If LongTextField <> "" Then LongTextField = Mid(LongTextField, 2) Dim arr : arr = Split(LongTextField, ",") Dim arrLen : arrLen = UBound(arr) Dim arrI For arrI=0 To arrLen soSql = Replace(soSql, "." & arr(arrLen) & " = rs(""" & arr(arrLen) & """)", "Dim tmp" & arr(arrLen) & " : tmp" & arr(arrLen) & " = rs(""" & arr(arrLen) & """)" & vbCrLf & " ." & arr(arrLen) & " = tmp" & arr(arrLen)) Next End If Dim SelectOneSp, SelectTopSp, SelectAllSp, InsertSp, UpdateSp, DeleteSp, BatchDeleteSp
SelectOneSp = vbTab &"Public Function SelectOne()" & vbCrLf &_ vbTab & vbTab & "Dim rs : Set rs = db.ExecuteSp(""" & Table & "_SelectOne"", " & PK & ")" & vbCrLf &_ vbTab & vbTab & "If Not (rs.BOF OR rs.EOF) Then" & vbCrLf &_ vbTab & vbTab & " With Me" & vbCrLf &_ soSql & _ vbTab & vbTab & " End With" & vbCrLf &_ vbTab & vbTab & " SelectOne = True" & vbCrLf &_ vbTab & vbTab & "Else" & vbCrLf &_ vbTab & vbTab & " SelectOne = False" & vbCrLf &_ vbTab & vbTab & "End If" & vbCrLf &_ vbTab &"End Function"
SelectTopSp = vbTab &"Public Function SelectTop()" & vbCrLf &_ vbTab & vbTab & "Set SelectTop = db.ExecuteDataTableSp(""" & Table & "_SelectTop"", Null)" & vbCrLf &_ vbTab &"End Function"
SelectAllSp = vbTab &"Public Function SelectAll()" & vbCrLf &_ vbTab & vbTab & "Set SelectAll = db.ExecuteDataTableSp(""" & Table & "_SelectAll"", Null)" & vbCrLf &_ vbTab & "End Function"
InsertSp = vbTab &"Public Function Insert()" & vbCrLf &_ vbTab & vbTab & PK & " = db.InsertSp(""" & Table & "_Insert"", Array(" & Join(Split(Columns, ","), ", ") & "))" & vbCrLf &_ vbTab & vbTab &"Insert = " & PK & vbCrLf &_ vbTab &"End Function"
UpdateSp = vbTab &"Public Function Update()" & vbCrLf &_ vbTab & vbTab & "Update = db.ExecuteNonQuerySp(""" & Table & "_Update"", Array(" & Join(Split(Columns, ","), ", ") & ", " & PK & ")) > 0" & vbCrLf &_ vbTab &"End Function"
DeleteSp = vbTab &"Public Function Delete()" & vbCrLf &_ vbTab & vbTab & "Delete = db.ExecuteNonQuerySp(""" & Table & "_Delete"", " & PK & ") > 0" & vbCrLf &_ vbTab &"End Function"
BatchDeleteSp = vbTab &"Public Function BatchDelete(ByVal " & PK & "s)" & vbCrLf &_ vbTab & vbTab & "BatchDelete = db.ExecuteNonQuery(""DELETE * FROM [" & Table & "] WHERE " & PK & " IN ("" & " & PK & "s & "")"")" & vbCrLf &_ vbTab &"End Function"
TmpString = TmpString & Pro &_ vbCrlf & SelectOneSp & vbCrLf &_ vbCrlf & SelectTopSp & vbCrLf &_ vbCrlf & SelectAllSp & vbCrLf &_ vbCrlf & InsertSp & vbCrLf &_ vbCrlf & UpdateSp & vbCrLf &_ vbCrlf & DeleteSp & vbCrLf &_ vbCrlf & BatchDeleteSp & vbCrLf &_ vbCrlf & vbTab & "Private Sub Class_Initialize()" &_ vbCrlf & vbTab & vbTab & "Set db = New Oledb" & _ vbCrlf & vbTab & vbTab & "Set " & LTable & " = New Data" & Table & _ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbTab & "Private Sub Class_Terminate()" &_ vbCrlf & vbTab & vbTab & "Set db = Nothing" & _ vbCrlf & vbTab & vbTab & "Set " & LTable & " = Nothing" & _ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbCrLf& "End Class" & vbCrLf & "%" & Chr(62) Call SaveDalClass(Table, TmpString) Call CreateSp(Table, PK, Columns) ’Response.Write "<div>" & PK & ":" & Columns & ":" & LongTextField & "</div>" End Sub
Private Sub ProcessBll(ByRef Rs) Rs.Filter = "ORDINAL_POSITION=1" If Rs.EOF Then Exit Sub Dim n : n = 0 Dim Table : Table = Rs("TABLE_NAME") Dim LTable : LTable = LCase(Table) Dim TmpString : TmpString = "<!--#include virtual=""/" & DalDir & Table & ".asp""-->" & vbCrLf & "<%" & vbCrLf & "Class Bll" & Table & vbCrLf & vbCrLf & vbTab & "Private v" & vbCrLf & vbTab & "Private e" & vbCrLf & vbTab & "Private " & LTable & vbCrLf Dim Def, Pro Dim PK Do n = n + 1 Rs.Filter = "ORDINAL_POSITION=" & n If Rs.EOF Then Exit Do If CInt(Rs("COLUMN_FLAGS")) = 90 Then PK = Rs("COLUMN_NAME") Pro = Pro & vbCrLf & vbTab & "’" & Rs("COLUMN_NAME") & vbCrLf &_ vbTab & "Public Property Let " & Rs("COLUMN_NAME") & "(ByVal Value)" & vbCrLf & vbTab &_ vbTab & LTable & "." & Rs("COLUMN_NAME") & " = Value" &_ vbCrlf & vbTab & "End Property" &_ vbCrlf & vbTab & "Public Property Get " & Rs("COLUMN_NAME") & "()" &_ vbCrLf & vbTab & vbTab & Rs("COLUMN_NAME") & " = " & LTable & "." & Rs("COLUMN_NAME") &_ vbCrlf & vbTab & "End Property" & vbCrlf Loop TmpString = TmpString & Pro &_ vbCrlf & vbTab & "Public Sub Throw()" &_ vbCrlf & vbTab & " e.Throw()" &_ vbCrlf & vbTab & "End Sub" & vbCrlf &_ vbCrlf & vbTab & "Private Sub Class_Initialize()" &_ vbCrlf & vbTab & vbTab & "Set v = New Validator" & _ vbCrlf & vbTab & vbTab & "Set e = New Exception" & _ vbCrlf & vbTab & vbTab & "Set " & LTable & " = New Data" & Table & _ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbTab & "Private Sub Class_Terminate()" &_ vbCrlf & vbTab & vbTab & "Set v = Nothing" & _ vbCrlf & vbTab & vbTab & "Set e = Nothing" & _ vbCrlf & vbTab & vbTab & "Set " & LTable & " = Nothing" & _ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbCrLf& "End Class" & vbCrLf & "%" & Chr(62) Call SaveBllClass(Table, TmpString) End Sub
Private Sub ProcessEvent(ByRef Rs) Rs.Filter = "ORDINAL_POSITION=1" If Rs.EOF Then Exit Sub Dim n : n = 0 Dim Table : Table = Rs("TABLE_NAME") Dim LTable : LTable = LCase(Table) Dim TmpString : TmpString = "<!--#include virtual=""/Inc/Package.asp""-->" & vbCrLf & "<!--#include virtual=""/" & BllDir & Table & ".asp""-->" & vbCrLf & "<%" & vbCrLf & "Class Data" & Table & vbCrLf & vbCrLf & vbTab & "Private db" & vbCrLf & vbTab & "Private " & LTable & vbCrLf Dim Def, Pro Dim PK Do n = n + 1 Rs.Filter = "ORDINAL_POSITION=" & n If Rs.EOF Then Exit Do If CInt(Rs("COLUMN_FLAGS")) = 90 Then PK = Rs("COLUMN_NAME") Pro = Pro & vbCrLf & vbTab & "’" & Rs("COLUMN_NAME") & vbCrLf &_ vbTab & "Public Property Let " & Rs("COLUMN_NAME") & "(ByVal Value)" & vbCrLf & vbTab &_ vbTab & LTable & "." & Rs("COLUMN_NAME") & " = Value" &_ vbCrlf & vbTab & "End Property" &_ vbCrlf & vbTab & "Public Property Get " & Rs("COLUMN_NAME") & "()" &_ vbCrLf & vbTab & vbTab & Rs("COLUMN_NAME") & " = " & LTable & "." & Rs("COLUMN_NAME") &_ vbCrlf & vbTab & "End Property" & vbCrlf Loop TmpString = TmpString & Pro &_ vbCrlf & vbTab & "Private Sub Class_Initialize()" &_ vbCrlf & vbTab & vbTab & "Set db = New Oledb" & _ vbCrlf & vbTab & vbTab & "Set " & LTable & " = New Data" & Table & _ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbTab & "Private Sub Class_Terminate()" &_ vbCrlf & vbTab & vbTab & "Set db = Nothing" & _ vbCrlf & vbTab & vbTab & "Set " & LTable & " = Nothing" & _ vbCrlf & vbTab & "End Sub" &_ vbCrlf & vbCrLf& "End Class" & vbCrLf & "%" & Chr(62) Call SaveEventClass(Table, TmpString) End Sub
Private Sub SaveDataClass(ByVal Table, ByRef Content) Call Save(DataDir, Table, Content) End Sub
Private Sub SaveDalClass(ByVal Table, ByRef Content) Call Save(DalDir, Table, Content) End Sub
Private Sub SaveBllClass(ByVal Table, ByRef Content) Call Save(BllDir, Table, Content) End Sub
Private Sub SaveEventClass(byVal Table, ByRef Content) Call Save(EventDir, Table, Content) End Sub
Private Sub Save(ByVal Dir, ByVal FileName, ByRef Content) Dim Path : Path = Server.MapPath(Dir & FileName & ".asp") Set File = FSO.OpenTextFile(Path, 2, true) File.Write Content Response.Write("<li>" & Path & "</li>") End Sub
Private Sub DetectDir(DirName) Dim Path : Path = Server.MapPath(DirName) If Not FSO.FolderExists(Path) Then FSO.CreateFolder(Path) End If End Sub
Private Sub OpenConn() If Conn.State = adStateClosed Then Conn.Open ConnectionString End If End Sub
Private Sub CloseConn() If Conn.State <> adStateClose Then Conn.Close() Set Conn = Nothing End If End Sub
Private Sub CloseRs() If Rs.State <> adStateClose Then Rs.Close() Set Rs = Nothing End If End Sub
Private Sub CreateSp(ByVal Table, ByVal Key, ByVal Columns) Call CreateSelectOneSp(Table, Key, Columns) Call CreateSelectTopSp(Table, Key, Columns) Call CreateSelectAllSp(Table, Key, Columns) Call CreateInsertSp(Table, Key, Columns) Call CreateUpdateSp(Table, Key, Columns) Call CreateDeleteSp(Table, Key, Columns) End Sub
Private Sub CreateSelectOneSp(ByVal Table, ByVal Key, ByVal Columns) Call CreateProcedure(Table & "_SelectOne", "SELECT " & Key & "," & Columns & " FROM [" & Table & "] WHERE " & Key & " = [@" & Key & "]") End Sub
Private Sub CreateSelectTopSp(ByVal Table, ByVal Key, ByVal Columns) Call CreateProcedure(Table & "_SelectTop", "SELECT TOP 10 " & Key & "," & Columns & " FROM [" & Table & "]") End Sub
Private Sub CreateSelectAllSp(ByVal Table, ByVal Key, ByVal Columns) Call CreateProcedure(Table & "_SelectAll", "SELECT " & Key & "," & Columns & " FROM [" & Table & "]") End Sub
Private Sub CreateInsertSp(ByVal Table, ByVal Key, ByVal Columns) Call CreateProcedure(Table & "_Insert", "SELECT " & Key & "," & Columns & " FROM [" & Table & "]") End Sub
Private Sub CreateUpdateSp(ByVal Table, ByVal Key, ByVal Columns) Dim ar : ar = Split(Columns, ",") Dim sql : sql = "UPDATE [" & Table & "] SET " Dim i, l : l = UBound(ar) For i = 0 To l If i = l Then sql = sql & Table & "." & ar(i) & " = [@" & ar(i) & "] " Else sql = sql & Table & "." & ar(i) & " = [@" & ar(i) & "], " End If Next sql = sql & "WHERE " & Table & "." & Key & " = [@" & Key & "]" Call CreateProcedure(Table & "_Update", sql) End Sub
Private Sub CreateDeleteSp(ByVal Table, ByVal Key, ByVal Columns) Call CreateProcedure(Table & "_Delete", "DELETE * FROM [" & Table & "] WHERE " & Key & " = [@" & Key & "]") End Sub
Private Function ReadTable() Dim TmpTable OpenConn() Set Rs = Conn.openSchema(20, Array(Empty, Empty, Empty,"TABLE")) Rs.MoveFirst() Do While Not Rs.EOF TmpTable = TmpTable & "," & Rs("TABLE_NAME") Rs.MoveNext() Loop ReadTable = Split(Mid(TmpTable, 2), ",") End Function
Private Function ReadColumn(ByVal TableName) OpenConn() Set ReadColumn = Conn.openSchema(4, Array(Empty, Empty, TableName, Empty)) End Function
Private Sub CreateProcedure(ByVal SpName, ByVal SpSql) OpenConn() Set cmd.ActiveConnection = Conn cmd.CommandText = SpSql Set Cat.ActiveConnection = Conn Cat.Procedures.Append SpName, Cmd End Sub
End Class
Dim g : Set g = New Generator g.DataPath = "data.mdb" g.GenerateByTable("News") ’g.CreateTable Set g = Nothing %>
|
|