只支持sqlserver呀,呵呵,我把代码贴给大家吧。 <HTML> <HEAD> <TITLE> 代码生成器 </TITLE> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"></HEAD> <style type="text/css"> <!-- body { margin-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; } td { font-size: 12px; } INPUT { FONT-FAMILY: 宋体; FONT-SIZE: 9pt; } INPUT.button { Height:20px; BACKGROUND-COLOR: #C6D7EF; COLOR: #000080; LINE-HEIGHT: 9pt; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 2px; PADDING-BOTTOM: 2px; CURSOR: hand; border-width:1px; border-style:solid; FONT-FAMILY: 宋体; FONT-SIZE: 9pt; } INPUT.input { BACKGROUND-COLOR: #ffffff; BORDER-STYLE:solid solid solid solid; border-width:1px 1px 1px 1px; border-color:#888888; HEIGHT:18px; LEFT: 0px; TOP: 0px; VERTICAL-ALIGN: center } .Corporation{ FONT-SIZE: 9pt; COLOR:RED; } .unnamed1 { color: #FFFFFF; background-color: #003399; font-weight: bold; } --> </style> <SCRIPT LANGUAGE="javaScript"> //根据字段的数据类型返回.net中相应的数据类型字符串 function getdonetType(s) { switch(s.toLowerCase( )) { case "bigint": return "Int64"; case "binary": return "System.Byte[]"; case "bit" : return "Boolean"; case "char" : return "String"; case "datetime" : return "System.DateTime"; case "decimal" : return "System.Decimal"; case "float" : return "System.Double"; case "image" : return "System.Byte[]"; case "int" : return "Int32"; case "money" : return "System.Decimal"; case "nchar" : return "String"; case "ntext" : return "String"; case "numeric" : return "System.Decimal"; case "nvarchar" : return "String"; case "real" : return "System.Single"; case "smalldatetime" : return "System.DateTime"; case "smallint" : return "Int16"; case "smallmoney" : return "System.Decimal"; case "sql_variant" : return "String"; case "text" : return "String"; case "timestamp" : return "System.DateTime"; case "tinyint" : return "System.Byte"; case "uniqueidentifier" : return "System.Guid"; case "varbinary" : return "System.Byte[]"; case "varchar" : return "String"; default : break; } return ""; } //根据字段的数据类型返回.net中相应的sqldb数据类型字符串 function getSqlType(s) { switch(s.toLowerCase( )) { case "bigint": return "System.Data.SqlDbType.BigInt"; case "binary": return "System.Data.SqlDbType.Binary"; case "bit" : return "System.Data.SqlDbType.Bit"; case "char" : return "System.Data.SqlDbType.Char"; case "datetime" : return "System.Data.SqlDbType.DateTime"; case "decimal" : return "System.Data.SqlDbType.Decimal"; case "float" : return "System.Data.SqlDbType.Float"; case "image" : return "System.Data.SqlDbType.Image"; case "int" : return "System.Data.SqlDbType.Int"; case "money" : return "System.Data.SqlDbType.Money"; case "nchar" : return "System.Data.SqlDbType.NChar"; case "ntext" : return "System.Data.SqlDbType.NText"; case "numeric" : return "System.Data.SqlDbType.Decimal"; case "nvarchar" : return "System.Data.SqlDbType.NVarChar"; case "real" : return "System.Data.SqlDbType.Real"; case "smalldatetime" : return "System.Data.SqlDbType.SmallDateTime"; case "smallint" : return "System.Data.SqlDbType.SmallInt"; case "smallmoney" : return "System.Data.SqlDbType.SmallMoney"; case "sql_variant" : return "System.Data.SqlDbType.Variant"; case "text" : return "System.Data.SqlDbType.Text"; case "timestamp" : return "System.Data.SqlDbType.Timestamp"; case "tinyint" : return "System.Data.SqlDbType.TinyInt"; case "uniqueidentifier" : return "System.Data.SqlDbType.UniqueIdentifier"; case "varbinary" : return "System.Data.SqlDbType.VarBinary"; case "varchar" : return "System.Data.SqlDbType.VarChar"; default : break; } return ""; } function get_p_isout(s){ if(s==1){return "ParameterDirection.Output"} else{return "ParameterDirection.Input"} } //根据字段类型返回此字段是否是数字类型,主要是在生成sql语句的时候数字字段不需要用单引号括住 function isnumber(s) { switch(s.toLowerCase( )) { case "bigint": return 1; case "binary": return 0; case "bit" : return 1; case "char" : return 0; case "datetime" : return 0; case "decimal" : return 1; case "float" : return 1; case "image" : return 0; case "int" : return 1; case "money" : return 1; case "nchar" : return 0; case "ntext" : return 0; case "numeric" : return 0; case "nvarchar" : return 0; case "real" : return 0; case "smalldatetime" : return 0; case "smallint" : return 1; case "smallmoney" : return 1; case "sqlvariant" : return 0; case "text" : return 0; case "timestamp" : return 1; case "tinyint" : return 1; case "uniqueidentifier" : return 0; case "varbinary" : return 0; case "varchar" : return 0; default : break; } return 1; } //根据字段类型返回此字段是否是字符串类型,主要是在生成sql语句的时候数字字段不需要用单引号括住 function isstring(s) { switch(s.toLowerCase( )) { case "bigint": return 0; case "binary": return 1; case "bit" : return 0; case "char" : return 1; case "datetime" : return 1; case "decimal" : return 0; case "float" : return 0; case "image" : return 1; case "int" : return 0; case "money" : return 0; case "nchar" : return 1; case "ntext" : return 1; case "numeric" : return 1; case "nvarchar" : return 1; case "real" : return 1; case "smalldatetime" : return 1; case "smallint" : return 0; case "smallmoney" : return 0; case "sqlvariant" : return 1; case "text" : return 1; case "timestamp" : return 0; case "tinyint" : return 0; case "uniqueidentifier" : return 1; case "varbinary" : return 1; case "varchar" : return 1; default : break; } } </SCRIPT>
<script language="VBScript"> '默认数据库链接字符串,因为有的地方所链接的数据库是不确定的,所以要定义一个CONNSTR_LEFT和CONNSTR_RIGHT Const CONNSTR = "Provider = Sqloledb; Trusted_Connection=yes;Initial Catalog =Master; Data Source = 127.0.0.1;" Const CONNSTR_LEFT = "Provider = Sqloledb; Trusted_Connection=yes; Initial Catalog =" Const CONNSTR_RIGHT = "; Data Source = 127.0.0.1;"'是否正在调试,设置为1就是调试模式,在调用Trace方法的时候可以输出警告框信息 Const ISDEBUG = 1 '当前所使用数据表的名称,选择表格下拉框的时候更新它的值 Dim tableName '当前正在使用的数据表的字段数组,选择表格下拉框的时候更新它的值 Dim arrcol() redim arrcol(0) '字段1数组,选择字段1下拉框的时候更新它的值 Dim arrcol1() redim arrcol1(0) '字段2数组,选择字段2下拉框的时候更新它的值 Dim arrcol2() redim arrcol2(0) '存储过程参数数组,选择存储过程下拉框的时候更新它的值 Dim arrSP() redim arrSP(0) '当前代码模板的路径,模板配置文件的根节点 Dim CodeTempleate,TempleateRoot '调试过程,在调试模式下可以弹出警告框信息 Sub Trace(s1,s2) If IsDebug Then divTraceOutput.innerHTML = divTraceOutput.innerHTML & s1 & s2 &"<br>" End If End Sub '显示错误 Sub ShowErr(err_) Dim strErr strErr="Description:"& err_.Description & vbcrlf _ & "HelpContext:"& err_.HelpContext & vbcrlf _ & "HelpFile:"& err_.HelpFile & vbcrlf _ & "Number:"& err_.Number & vbcrlf _ & "Source:"& err_.Source & vbcrlf _ & "很不幸,程序运行出错了,你可以发电子邮件到[email protected]来反馈此错误" msgbox(strErr) End Sub dim arrtype '当前正在处理的数组类型是字段还是存储过程参数 dim gobal_sp_name dim gobal_connstr '数据字段类,保存有字段的名字,数据类型,长度 class colField public colName,colType,colLength end class '存储过程的参数类,保存有参数的名字,数据类型,长度,是否是输出参数 Class Parameter public name,xtype,length,isout end class '更改代码模板路径,在选择模板下拉框的时候触发 Sub ChangeTempleate(strTemID) Dim Templeate,help,doc,root,divhelp set Templeate = TempleateRoot.selectSingleNode("//templeate[@id="&strTemID&"]") CodeTempleate = Templeate.Text Trace "对应的模板路径为:",CodeTempleate set doc = Createobject("Microsoft.XMLDOM") doc.load(CodeTempleate) set root = doc.documentElement set help = root.selectSingleNode("//help") divhelp = document.getElementsByName("help") divhelp.innerText = help.Text End Sub '绑定代码模板下拉框的值,在程序加载时触发 Sub BindListTemp() Dim doc,TempleateList,i,oSelect,oOption oSelect = document.getElementsByName("ListTempleate") oSelect.length = 0 Set doc = Createobject("Microsoft.XMLDOM") doc.load("Config.xml") Set TempleateRoot = doc.documentElement Set TempleateList = TempleateRoot.selectNodes("//templeate") For i = 0 to TempleateList.length - 1 set oOption = document.createElement("OPTION") oSelect.options.add(oOption) oOption.innerText = TempleateList(i).getAttribute("name") oOption.value = TempleateList(i).getAttribute("id") Next End Sub '使用可信任连接,连接并打开Master库,然后取出本地所有的数据库来填充数据库下拉框 sub openconnection() if ISDEBUG = 0 then on error resume next conn.ConnectionString = CONNSTR
conn.Open if err.number <> 0 then err.Clear ShowErr(err) end if dim sql,rs,oOption,oSelect oSelect = document.getElementsByName("ListDataBase") sql="select name from dbo.sysdatabases" if ISDEBUG = 0 then on error resume next set rs = conn.execute(sql) if err.number <> 0 then err.Clear ShowErr(err) end if do while not rs.eof set oOption = document.createElement("OPTION") oSelect.options.add(oOption) oOption.innerText = rs(0) oOption.value = rs(0) rs.MoveNext loop End sub '打开选择的数据库,在选择数据库下拉框的时候触发,并调用bindlist1方法来绑定两个字段下拉框 sub openconnectiondb(strDB) if ISDEBUG = 0 then on error resume next If conn.State = 1 Then conn.close conn.ConnectionString = CONNSTR_LEFT & strDB & CONNSTR_RIGHT gobal_connstr =CONNSTR_LEFT & strDB & CONNSTR_RIGHT conn.Open if err.number <> 0 then msgbox(err.description) err.Clear end if bindlist1 End sub '绑定数据表下拉框和存储过程下拉框,清除两个字段下拉框,并填充全局字段数组,和全局存储过程数组 sub bindlist1() dim sql,rs,oOption,oSelect oSelect = document.getElementsByName("ListDataTable") sql="select name from sysobjects where xtype = 'u' or xtype='v'" if ISDEBUG = 0 then on error resume next set rs = conn.execute(sql) '填充数据表下拉框 oSelect.length = 0 do while not rs.eof set oOption = document.createElement("OPTION") oSelect.options.add(oOption) oOption.innerText = rs(0) oOption.value = rs(0) rs.MoveNext loop '填充存储过程下拉框 oSelect = document.getElementsByName("ListSP") sql="select name from sysobjects where xtype = 'P' order by name" set rs = conn.execute(sql) oSelect.length = 0 do while not rs.eof set oOption = document.createElement("OPTION") oSelect.options.add(oOption) oOption.innerText = rs(0) oOption.value = rs(0) rs.MoveNext loop '清空两个字段下拉框 oSelect = document.getElementsByName("ListCol1") oSelect.length = 0 oSelect = document.getElementsByName("ListCol2") oSelect.length = 0 if err.number <> 0 then msgbox(err.Description) err.Clear end if end sub '系统初始化函数,在程序加载的时候运行,主要是打开数据库填充数据库下拉框并打开Config.xml填充模板下拉框 sub init() openconnection() BindListTemp() end sub '改变数据表,用表中的字段填充ListCol1和ListCol2两个下拉框以及全局数组arrcol sub ChangeDataTable() dim sql,rs,oOption,oSelect,oListColl,i oSelect = document.getElementsByName("ListDataTable") oListColl = document.getElementsByName("ListCol1") oListCol2 = document.getElementsByName("ListCol2") oListColl.length = 0 oListCol2.length = 0 tableName = oSelect.options(oSelect.selectedIndex).value sql="SELECT c.name as FieldName,t.name as FieldType, c.length as FieldLength FROM SYSCOLUMNS c inner join systypes t on c.xusertype=t.xusertype WHERE c.ID = OBJECT_ID('"&tableName&"')" set rs = conn.execute(sql) i =0 Trace "记录集的连接字符串" , rs.ActiveConnection.ConnectionString Trace "记录集状态:" , rs.State Trace "sql字符串" , sql if not(rs.bof and rs.eof) then do while not rs.eof set oOption = document.createElement("OPTION") oListColl.options.add(oOption) oOption.innerText = rs(0) oOption.value = rs(0) i = i+1 rs.MoveNext loop Else msgbox("这个表里没有字段") end if Trace "记录数目:" , i rs.movefirst Redim arrcol(i) rs.movefirst do while not rs.eof set oOption = document.createElement("OPTION") oListCol2.options.add(oOption) oOption.innerText = rs(0) oOption.value = rs(0) rs.MoveNext loop i = 0 rs.movefirst do while not rs.eof dim col set col = new colField col.colName = rs(0) col.colType = rs(1) '如果是text或ntext,decimal等,长度不能设置成默认值,应该设置成SQL参数对应的模式 select case rs(1) case "text","ntext","sql_variant","bigint","bit","datetime","float","image","money","real","smalldatetime","smallint","smallmoney","timestamp","tinyint","uniqueidentifier","int" col.colLength = "" case "decimal","numeric" col.colLength = "(" & rs(2) &",0)" case else col.colLength = "(" & rs(2) &")" end select set arrcol(i) = col i = i + 1 rs.movenext loop rs.close end sub '改变所选择的字段,在选择两个字段下拉框的时候触发,用来更新两个全局字段数组
function ChangeCol(drop,n) dim i,j,k j = 0 for i= 0 to (drop.length-1) if drop.options(i).selected then j = j + 1 end if next if n=1 then Erase arrcol1 redim arrcol1(j) end if if n=2 then Erase arrcol2 redim arrcol2(j) end if k = 0 if n =1 then for i= 0 to (drop.length-1) if drop.options(i).selected then for j = 0 to (ubound(arrcol) - 1) if arrcol(j).colname = drop.options(i).value then set arrcol1(k) = arrcol(j) end if next k = k + 1 end if next else for i= 0 to (drop.length-1) if drop.options(i).selected then for j = 0 to (ubound(arrcol) - 1) if arrcol(j).colname = drop.options(i).value then set arrcol2(k) = arrcol(j) end if next k = k + 1 end if next end if end function function ChangeSp(oSelect) dim sql,rs,i sql="select a.name as p_name,b.name as p_type,a.length as p_length,a.isoutparam as p_isout from syscolumns a, systypes b where a.xtype=b.xtype and b.name<>'sysname' and id = (select id from sysobjects where name = '"&oSelect.options(oSelect.selectedIndex).value&"')" Trace "存储过程信息语句",sql gobal_sp_name = oSelect.options(oSelect.selectedIndex).value set rs = conn.execute(sql) i = 0 do while not rs.eof i = i + 1 rs.movenext loop Erase arrsp redim arrsp(i) if i>0 then rs.movefirst i =0 do while not rs.eof dim param set param = new Parameter param.Name = mid(rs(0),2) '去掉左边的拳儿 param.xtype = rs(1) param.Length = rs(2) param.isout =rs(3) set arrsp(i) = param i = i + 1 rs.movenext loop end if rs.close set rs=nothing end function '显示代码函数 sub showcoad() '循环变量,循环变量,循环变量,是否有cyc属性,生成代码字符串,代码模板文档对象,文档的根节点,txt节点的cyc循环节点,临时字符串,txt的err节点,txt的arr节点,使用的全局数组 dim i,j,k,bcyc,strcode,doc,root,txtnote,cyc,str,attArr,arr strcode = "" '打开代码模板并取出所有的"txt"节点列表 set doc = Createobject("Microsoft.XMLDOM") doc.load(CodeTempleate) set root = doc.documentElement set txtnote = doc.getElementsByTagName("txt") '遍历节点列表 for i = 0 to txtnote.length -1 '测试当前txt节点的arr属性,并通过它确定本次循环中使用的全局字段数组是arrcol1还是arrcol2 attArr = txtnote(i).getAttribute("arr") if not isnull(attArr) then select Case attArr Case "arrcol1" arrtype="col" '设置全局变量arrtype arr = arrcol1 Case "arrcol2" arrtype="col" arr = arrcol2 Case "arrsp" arrtype="sp" arr = arrsp End Select Else arr = arrcol1 '默认使用arrcol1 end if '测试当前的txt节点的cyc属性,并通过它来确定本节点是否要循环它子节点,当cyc属性为1时,必须要含有arr属性 set cyc = txtnote(i).attributes.getNamedItem("cyc") if Not(cyc Is Nothing) then if cyc.value <> "1" then bcyc = false else bcyc = true end if else bcyc = false '默认为不循环 end if '如果本节点要循环子节点的话,就把当前节点的子节点循环处理 if bcyc then set tnote = txtnote(i).getElementsByTagName("t") '获取子节点t的节点列表 '遍历当前使用的字段数组 for j = 0 to ubound(arr) -1 str ="" '给临时字符串赋默认值 '遍历t子节点列表 for k =0 to tnote.length - 1 '调用ExecuteNouts函数处理子节点 str = str &ExecuteNouts(tnote(k),arr,arr(j),j) next '替换占位符 str = ReplaceStr(str,arr(j)) strcode = strcode & str next else str ="" str = txtnote(i).text str = replace(str,"$table",tableName) str = replace(str,"$sp_name",gobal_sp_name) str = replace(str,"$connstr",gobal_connstr) str = replace(str,"$collistlength",ubound(arr)) strcode = strcode & str end if next document.all("txtsql").value = strcode end sub '替换占位符
Private Function ReplaceStr(str_p,arr_j_p) if ISDEBUG = 0 then on error resume next select case arrtype case "col" str_p = replace(str_p,"$colName",arr_j_p.colname) str_p = replace(str_p,"$colType",arr_j_p.colType) str_p = replace(str_p,"$col_netype",getdonetType(arr_j_p.colType)) str_p = replace(str_p,"$col_SqlDb",getSqlType(arr_j_p.colType)) str_p = replace(str_p,"$colLength",arr_j_p.colLength) str_p = ReplaceUIstr(str_p,arr_j_p) case "sp" str_p = replace(str_p,"$sp_p_col_name",arr_j_p.name) str_p = replace(str_p,"$sp_p_col_netype",getdonetType(arr_j_p.xtype)) str_p = replace(str_p,"$sp_p_col_netdbtype",getSqlType(arr_j_p.xtype)) str_p = replace(str_p,"$sp_p_col_length",arr_j_p.length) str_p = replace(str_p,"$sp_p_col_isout",get_p_isout(arr_j_p.isout)) end select if err.number<> 0 then ShowErr(err) ReplaceStr = str_p End Function Private Function ReplaceUIstr(str_p,arr_j_p) Dim doc,UIRoot,DataBaseName,TableName,UI_field_list,oSelect,i,j oSelect = document.getElementsByName("ListDataBase") DataBaseName = oSelect.options(oSelect.selectedIndex).value oSelect = document.getElementsByName("ListDataTable") TableName = oSelect.options(oSelect.selectedIndex).value Set doc = Createobject("Microsoft.XMLDOM") doc.load("UITemplate/UI.xml") Set UIRoot = doc.documentElement '用xpath语法获取当前数据库的当前表的所有显示字段列表 Set UI_field_list = UIRoot.selectNodes ("//database[@name="""&DataBaseName&"""]/table[@name="""&TableName&"""]/field") For i = 0 to UI_field_list.length - 1 If arr_j_p.colname = UI_field_list(i).getAttribute("name") then Select Case UI_field_list(i).getAttribute("display") Case "input" str_p = replace(str_p,"$UI_colName","<input type=""text"" name="""&arr_j_p.colname&""">") Case "select" strTemp = "<select name="""&arr_j_p.colname&""">" For j = 0 To UI_field_list(i).childNodes.length-1 strTemp = strTemp & UI_field_list(i).childNodes(j).xml Next strTemp = strTemp & "</select>" str_p = replace(str_p,"$UI_colName",strTemp) End Select End If Next ReplaceUIstr = str_p End Function '处理循环节点t的私有函数 private Function ExecuteNouts(note_k_p,arr_p,arr_j_p,j_p) Dim t_att_exp,str_i t_att_exp = note_k_p.getAttribute("expression") '获取当前t节点的expression属性 if not isnull(t_att_exp) then select case(t_att_exp) case "nomax" if(j_p<>(ubound(arr_p)-1)) then str_i = str_i & note_k_p.text end if case "isnumber" if(isnumber(arr_j_p.colType)) then str_i = str_i & note_k_p.text end if case "isstring" if(isstring(arr_j_p.colType)) then str_i = str_i & note_k_p.text end if case "p_noout" if(arr_j_p.isout=0) then str_i = str_i & note_k_p.text end if case else str_i = str_i & note_k_p.text end select else str_i = str_i & note_k_p.text end if ExecuteNouts = str_i End Function </script> <BODY onload="vbscript:init"> <form> <table width="98%" border="0" cellspacing="0" cellpadding="0"> <tr> <td width="7%" rowspan="5" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="unnamed1">选择模板</td> </tr> <tr> <td><select name="ListTempleate" size="20" class="input" id="ListTempleate" onChange="ChangeTempleate(this.options(this.selectedIndex).value)"> </select></td> </tr> </table></td> <td width="11%" class="unnamed1">数据库</td> <td width="11%" class="unnamed1">数据表</td> <td width="16%" class="unnamed1">字段1</td> <td width="19%" class="unnamed1">字段2</td> <td width="36%" class="unnamed1">存储过程</td> </tr> <tr> <td valign="top"><select name="ListDataBase" size="10" class="input" id="ListDataBase" onChange="openconnectiondb(this.options(this.selectedIndex).value)"> </select></td> <td valign="top"><select name="ListDataTable" size="10" class="input" id="ListDataTable" onChange="ChangeDataTable()" > </select></td> <td width="16%" valign="top"><select name="ListCol1" size="10" multiple class="input" onChange="ChangeCol(this,1)" > </select></td> <td width="19%" valign="top"><select name="ListCol2" size="10" multiple class="input" onChange="ChangeCol(this,2)" > </select></td> <td width="36%" valign="top"><select name="ListSP" size="10" class="input" id="ListSP" onChange="ChangeSp(this)"> </select></td> </tr> <tr> <td colspan="5"><input name="ShowCode" type="button" class="button" onClick="showcoad()" value="生成代码"> <input type="button" name="showTrace" value="显示跟踪" class="button" onClick="divTraceOutput.style.display=divTraceOutput.style.display=='none'?'block':'none'"> <input type="button" name="CleanTrace" value="清除跟踪" class="button" onClick="divTraceOutput.innerHTML = ''"> </td> </tr> <tr> <td colspan="5"><textarea name="txtsql" cols="50" rows="10" class="input" id="txtsql" style="width:100%; "></textarea></td> </tr> <tr> <td colspan="5"><div class="unnamed1">代码帮助</div><textarea name="help" cols="50" rows="10" class="input" id="help" style="width:100%; ">------------------wawacoder代码生成器简介---------------------- 可以肯定,写这个小软件费了很多力气,但是也可以肯定,如果合理的用这个小软件会提高不少工作效率.大 家都用过codeplus和codesmith吧,其实在实际软件编码过程中,尤其是写数据库应用程序,有太多的代码是 枯燥的重复,一点儿技术含量也没有,有时候我们甚至为写这些重复的代码而烦恼.这个小软件也许会改变 你这种情况. 之所以用vbscript来写这个程序,本来是想写好了,用vb编译一下用来保护源码的,可是后来我改变主意了, 为了增强程序的灵活性和可扩展性,我决定把源码公开了,以便人们定义自己的代码生成器,只要你稍微会 一点脚本知识就行. 现在这个软件是测试版本(其实测试版本也不算),软件的界面我还没做,源码看上去还很乱,需要重构,灵活 性不强,好多参数是硬编码到程序里的,没有生成更多种语言的代码(我只会一点儿asp和c#,或许其它语言 的代码模板还得你们去写),使用说明还没写出来......总之,还有很多有待解决的问题.如果你感觉这个小软件很有潜力,或者狗屁不是,请给我发电子邮件到[email protected],我欢迎任何 建议和批评.</textarea> </div></td> </tr> </table> </form> <div id="divTraceOutput" style=" background-color:#999999; display:none; font-size:12px; color:#FFFFFF">下面是程序调试跟踪信息:<br></div> <div algin="center"> <div align="center" class="Corporation">版权所有 蛙蛙王子</div> </div> <div align="center"> <OBJECT classid="clsid:00000514-0000-0010-8000-00AA006D2EA4" id="conn"> </OBJECT> </div> </BODY> </HTML>
算了
<HTML>
<HEAD>
<TITLE> 代码生成器 </TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"></HEAD>
<style type="text/css">
<!--
body {
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
td {
font-size: 12px;
}
INPUT
{
FONT-FAMILY: 宋体;
FONT-SIZE: 9pt;
}
INPUT.button
{
Height:20px;
BACKGROUND-COLOR: #C6D7EF;
COLOR: #000080;
LINE-HEIGHT: 9pt;
PADDING-LEFT: 0px;
PADDING-RIGHT: 0px;
PADDING-TOP: 2px;
PADDING-BOTTOM: 2px;
CURSOR: hand;
border-width:1px;
border-style:solid;
FONT-FAMILY: 宋体;
FONT-SIZE: 9pt;
}
INPUT.input
{
BACKGROUND-COLOR: #ffffff;
BORDER-STYLE:solid solid solid solid;
border-width:1px 1px 1px 1px;
border-color:#888888;
HEIGHT:18px;
LEFT: 0px;
TOP: 0px;
VERTICAL-ALIGN: center
}
.Corporation{
FONT-SIZE: 9pt;
COLOR:RED;
}
.unnamed1 {
color: #FFFFFF;
background-color: #003399;
font-weight: bold;
}
-->
</style>
<SCRIPT LANGUAGE="javaScript">
//根据字段的数据类型返回.net中相应的数据类型字符串
function getdonetType(s)
{
switch(s.toLowerCase( ))
{
case "bigint":
return "Int64";
case "binary":
return "System.Byte[]";
case "bit" :
return "Boolean";
case "char" :
return "String";
case "datetime" :
return "System.DateTime";
case "decimal" :
return "System.Decimal";
case "float" :
return "System.Double";
case "image" :
return "System.Byte[]";
case "int" :
return "Int32";
case "money" :
return "System.Decimal";
case "nchar" :
return "String";
case "ntext" :
return "String";
case "numeric" :
return "System.Decimal";
case "nvarchar" :
return "String";
case "real" :
return "System.Single";
case "smalldatetime" :
return "System.DateTime";
case "smallint" :
return "Int16";
case "smallmoney" :
return "System.Decimal";
case "sql_variant" :
return "String";
case "text" :
return "String";
case "timestamp" :
return "System.DateTime";
case "tinyint" :
return "System.Byte";
case "uniqueidentifier" :
return "System.Guid";
case "varbinary" :
return "System.Byte[]";
case "varchar" :
return "String";
default : break;
}
return "";
}
//根据字段的数据类型返回.net中相应的sqldb数据类型字符串
function getSqlType(s)
{
switch(s.toLowerCase( ))
{
case "bigint":
return "System.Data.SqlDbType.BigInt";
case "binary":
return "System.Data.SqlDbType.Binary";
case "bit" :
return "System.Data.SqlDbType.Bit";
case "char" :
return "System.Data.SqlDbType.Char";
case "datetime" :
return "System.Data.SqlDbType.DateTime";
case "decimal" :
return "System.Data.SqlDbType.Decimal";
case "float" :
return "System.Data.SqlDbType.Float";
case "image" :
return "System.Data.SqlDbType.Image";
case "int" :
return "System.Data.SqlDbType.Int";
case "money" :
return "System.Data.SqlDbType.Money";
case "nchar" :
return "System.Data.SqlDbType.NChar";
case "ntext" :
return "System.Data.SqlDbType.NText";
case "numeric" :
return "System.Data.SqlDbType.Decimal";
case "nvarchar" :
return "System.Data.SqlDbType.NVarChar";
case "real" :
return "System.Data.SqlDbType.Real";
case "smalldatetime" :
return "System.Data.SqlDbType.SmallDateTime";
case "smallint" :
return "System.Data.SqlDbType.SmallInt";
case "smallmoney" :
return "System.Data.SqlDbType.SmallMoney";
case "sql_variant" :
return "System.Data.SqlDbType.Variant";
case "text" :
return "System.Data.SqlDbType.Text";
case "timestamp" :
return "System.Data.SqlDbType.Timestamp";
case "tinyint" :
return "System.Data.SqlDbType.TinyInt";
case "uniqueidentifier" :
return "System.Data.SqlDbType.UniqueIdentifier";
case "varbinary" :
return "System.Data.SqlDbType.VarBinary";
case "varchar" :
return "System.Data.SqlDbType.VarChar";
default : break;
}
return "";
}
function get_p_isout(s){
if(s==1){return "ParameterDirection.Output"} else{return "ParameterDirection.Input"}
}
//根据字段类型返回此字段是否是数字类型,主要是在生成sql语句的时候数字字段不需要用单引号括住
function isnumber(s)
{
switch(s.toLowerCase( ))
{
case "bigint":
return 1;
case "binary":
return 0;
case "bit" :
return 1;
case "char" :
return 0;
case "datetime" :
return 0;
case "decimal" :
return 1;
case "float" :
return 1;
case "image" :
return 0;
case "int" :
return 1;
case "money" :
return 1;
case "nchar" :
return 0;
case "ntext" :
return 0;
case "numeric" :
return 0;
case "nvarchar" :
return 0;
case "real" :
return 0;
case "smalldatetime" :
return 0;
case "smallint" :
return 1;
case "smallmoney" :
return 1;
case "sqlvariant" :
return 0;
case "text" :
return 0;
case "timestamp" :
return 1;
case "tinyint" :
return 1;
case "uniqueidentifier" :
return 0;
case "varbinary" :
return 0;
case "varchar" :
return 0;
default : break;
}
return 1;
}
//根据字段类型返回此字段是否是字符串类型,主要是在生成sql语句的时候数字字段不需要用单引号括住
function isstring(s)
{
switch(s.toLowerCase( ))
{
case "bigint":
return 0;
case "binary":
return 1;
case "bit" :
return 0;
case "char" :
return 1;
case "datetime" :
return 1;
case "decimal" :
return 0;
case "float" :
return 0;
case "image" :
return 1;
case "int" :
return 0;
case "money" :
return 0;
case "nchar" :
return 1;
case "ntext" :
return 1;
case "numeric" :
return 1;
case "nvarchar" :
return 1;
case "real" :
return 1;
case "smalldatetime" :
return 1;
case "smallint" :
return 0;
case "smallmoney" :
return 0;
case "sqlvariant" :
return 1;
case "text" :
return 1;
case "timestamp" :
return 0;
case "tinyint" :
return 0;
case "uniqueidentifier" :
return 1;
case "varbinary" :
return 1;
case "varchar" :
return 1;
default : break;
}
}
</SCRIPT>
'默认数据库链接字符串,因为有的地方所链接的数据库是不确定的,所以要定义一个CONNSTR_LEFT和CONNSTR_RIGHT
Const CONNSTR = "Provider = Sqloledb; Trusted_Connection=yes;Initial Catalog =Master; Data Source = 127.0.0.1;"
Const CONNSTR_LEFT = "Provider = Sqloledb; Trusted_Connection=yes; Initial Catalog ="
Const CONNSTR_RIGHT = "; Data Source = 127.0.0.1;"'是否正在调试,设置为1就是调试模式,在调用Trace方法的时候可以输出警告框信息
Const ISDEBUG = 1
'当前所使用数据表的名称,选择表格下拉框的时候更新它的值
Dim tableName
'当前正在使用的数据表的字段数组,选择表格下拉框的时候更新它的值
Dim arrcol()
redim arrcol(0)
'字段1数组,选择字段1下拉框的时候更新它的值
Dim arrcol1()
redim arrcol1(0)
'字段2数组,选择字段2下拉框的时候更新它的值
Dim arrcol2()
redim arrcol2(0)
'存储过程参数数组,选择存储过程下拉框的时候更新它的值
Dim arrSP()
redim arrSP(0)
'当前代码模板的路径,模板配置文件的根节点
Dim CodeTempleate,TempleateRoot
'调试过程,在调试模式下可以弹出警告框信息
Sub Trace(s1,s2)
If IsDebug Then
divTraceOutput.innerHTML = divTraceOutput.innerHTML & s1 & s2 &"<br>"
End If
End Sub
'显示错误
Sub ShowErr(err_)
Dim strErr
strErr="Description:"& err_.Description & vbcrlf _
& "HelpContext:"& err_.HelpContext & vbcrlf _
& "HelpFile:"& err_.HelpFile & vbcrlf _
& "Number:"& err_.Number & vbcrlf _
& "Source:"& err_.Source & vbcrlf _
& "很不幸,程序运行出错了,你可以发电子邮件到[email protected]来反馈此错误"
msgbox(strErr)
End Sub
dim arrtype '当前正在处理的数组类型是字段还是存储过程参数
dim gobal_sp_name
dim gobal_connstr
'数据字段类,保存有字段的名字,数据类型,长度
class colField
public colName,colType,colLength
end class
'存储过程的参数类,保存有参数的名字,数据类型,长度,是否是输出参数
Class Parameter
public name,xtype,length,isout
end class
'更改代码模板路径,在选择模板下拉框的时候触发
Sub ChangeTempleate(strTemID)
Dim Templeate,help,doc,root,divhelp
set Templeate = TempleateRoot.selectSingleNode("//templeate[@id="&strTemID&"]")
CodeTempleate = Templeate.Text
Trace "对应的模板路径为:",CodeTempleate
set doc = Createobject("Microsoft.XMLDOM")
doc.load(CodeTempleate)
set root = doc.documentElement
set help = root.selectSingleNode("//help")
divhelp = document.getElementsByName("help")
divhelp.innerText = help.Text
End Sub
'绑定代码模板下拉框的值,在程序加载时触发
Sub BindListTemp()
Dim doc,TempleateList,i,oSelect,oOption
oSelect = document.getElementsByName("ListTempleate")
oSelect.length = 0
Set doc = Createobject("Microsoft.XMLDOM")
doc.load("Config.xml")
Set TempleateRoot = doc.documentElement
Set TempleateList = TempleateRoot.selectNodes("//templeate")
For i = 0 to TempleateList.length - 1
set oOption = document.createElement("OPTION")
oSelect.options.add(oOption)
oOption.innerText = TempleateList(i).getAttribute("name")
oOption.value = TempleateList(i).getAttribute("id")
Next
End Sub
'使用可信任连接,连接并打开Master库,然后取出本地所有的数据库来填充数据库下拉框
sub openconnection()
if ISDEBUG = 0 then on error resume next
conn.ConnectionString = CONNSTR
conn.Open
if err.number <> 0 then
err.Clear
ShowErr(err)
end if
dim sql,rs,oOption,oSelect
oSelect = document.getElementsByName("ListDataBase")
sql="select name from dbo.sysdatabases"
if ISDEBUG = 0 then on error resume next
set rs = conn.execute(sql)
if err.number <> 0 then
err.Clear
ShowErr(err)
end if
do while not rs.eof
set oOption = document.createElement("OPTION")
oSelect.options.add(oOption)
oOption.innerText = rs(0)
oOption.value = rs(0)
rs.MoveNext
loop
End sub
'打开选择的数据库,在选择数据库下拉框的时候触发,并调用bindlist1方法来绑定两个字段下拉框
sub openconnectiondb(strDB)
if ISDEBUG = 0 then on error resume next
If conn.State = 1 Then conn.close
conn.ConnectionString = CONNSTR_LEFT & strDB & CONNSTR_RIGHT
gobal_connstr =CONNSTR_LEFT & strDB & CONNSTR_RIGHT
conn.Open
if err.number <> 0 then
msgbox(err.description)
err.Clear
end if
bindlist1
End sub
'绑定数据表下拉框和存储过程下拉框,清除两个字段下拉框,并填充全局字段数组,和全局存储过程数组
sub bindlist1()
dim sql,rs,oOption,oSelect
oSelect = document.getElementsByName("ListDataTable")
sql="select name from sysobjects where xtype = 'u' or xtype='v'"
if ISDEBUG = 0 then on error resume next
set rs = conn.execute(sql)
'填充数据表下拉框
oSelect.length = 0
do while not rs.eof
set oOption = document.createElement("OPTION")
oSelect.options.add(oOption)
oOption.innerText = rs(0)
oOption.value = rs(0)
rs.MoveNext
loop
'填充存储过程下拉框
oSelect = document.getElementsByName("ListSP")
sql="select name from sysobjects where xtype = 'P' order by name"
set rs = conn.execute(sql)
oSelect.length = 0
do while not rs.eof
set oOption = document.createElement("OPTION")
oSelect.options.add(oOption)
oOption.innerText = rs(0)
oOption.value = rs(0)
rs.MoveNext
loop
'清空两个字段下拉框
oSelect = document.getElementsByName("ListCol1")
oSelect.length = 0
oSelect = document.getElementsByName("ListCol2")
oSelect.length = 0
if err.number <> 0 then
msgbox(err.Description)
err.Clear
end if
end sub
'系统初始化函数,在程序加载的时候运行,主要是打开数据库填充数据库下拉框并打开Config.xml填充模板下拉框
sub init()
openconnection()
BindListTemp()
end sub
'改变数据表,用表中的字段填充ListCol1和ListCol2两个下拉框以及全局数组arrcol
sub ChangeDataTable()
dim sql,rs,oOption,oSelect,oListColl,i
oSelect = document.getElementsByName("ListDataTable")
oListColl = document.getElementsByName("ListCol1")
oListCol2 = document.getElementsByName("ListCol2")
oListColl.length = 0
oListCol2.length = 0
tableName = oSelect.options(oSelect.selectedIndex).value
sql="SELECT c.name as FieldName,t.name as FieldType, c.length as FieldLength FROM SYSCOLUMNS c inner join systypes t on c.xusertype=t.xusertype WHERE c.ID = OBJECT_ID('"&tableName&"')"
set rs = conn.execute(sql)
i =0
Trace "记录集的连接字符串" , rs.ActiveConnection.ConnectionString
Trace "记录集状态:" , rs.State
Trace "sql字符串" , sql
if not(rs.bof and rs.eof) then
do while not rs.eof
set oOption = document.createElement("OPTION")
oListColl.options.add(oOption)
oOption.innerText = rs(0)
oOption.value = rs(0)
i = i+1
rs.MoveNext
loop
Else
msgbox("这个表里没有字段")
end if
Trace "记录数目:" , i
rs.movefirst
Redim arrcol(i)
rs.movefirst
do while not rs.eof
set oOption = document.createElement("OPTION")
oListCol2.options.add(oOption)
oOption.innerText = rs(0)
oOption.value = rs(0)
rs.MoveNext
loop
i = 0
rs.movefirst
do while not rs.eof
dim col
set col = new colField
col.colName = rs(0)
col.colType = rs(1)
'如果是text或ntext,decimal等,长度不能设置成默认值,应该设置成SQL参数对应的模式
select case rs(1)
case "text","ntext","sql_variant","bigint","bit","datetime","float","image","money","real","smalldatetime","smallint","smallmoney","timestamp","tinyint","uniqueidentifier","int"
col.colLength = ""
case "decimal","numeric"
col.colLength = "(" & rs(2) &",0)"
case else
col.colLength = "(" & rs(2) &")"
end select
set arrcol(i) = col
i = i + 1
rs.movenext
loop
rs.close
end sub
'改变所选择的字段,在选择两个字段下拉框的时候触发,用来更新两个全局字段数组
dim i,j,k
j = 0
for i= 0 to (drop.length-1)
if drop.options(i).selected then
j = j + 1
end if
next
if n=1 then
Erase arrcol1
redim arrcol1(j)
end if
if n=2 then
Erase arrcol2
redim arrcol2(j)
end if
k = 0
if n =1 then
for i= 0 to (drop.length-1)
if drop.options(i).selected then
for j = 0 to (ubound(arrcol) - 1)
if arrcol(j).colname = drop.options(i).value then
set arrcol1(k) = arrcol(j)
end if
next
k = k + 1
end if
next
else
for i= 0 to (drop.length-1)
if drop.options(i).selected then
for j = 0 to (ubound(arrcol) - 1)
if arrcol(j).colname = drop.options(i).value then
set arrcol2(k) = arrcol(j)
end if
next
k = k + 1
end if
next
end if
end function
function ChangeSp(oSelect)
dim sql,rs,i
sql="select a.name as p_name,b.name as p_type,a.length as p_length,a.isoutparam as p_isout from syscolumns a, systypes b where a.xtype=b.xtype and b.name<>'sysname' and id = (select id from sysobjects where name = '"&oSelect.options(oSelect.selectedIndex).value&"')"
Trace "存储过程信息语句",sql
gobal_sp_name = oSelect.options(oSelect.selectedIndex).value
set rs = conn.execute(sql)
i = 0
do while not rs.eof
i = i + 1
rs.movenext
loop
Erase arrsp
redim arrsp(i)
if i>0 then
rs.movefirst
i =0
do while not rs.eof
dim param
set param = new Parameter
param.Name = mid(rs(0),2) '去掉左边的拳儿
param.xtype = rs(1)
param.Length = rs(2)
param.isout =rs(3)
set arrsp(i) = param
i = i + 1
rs.movenext
loop
end if
rs.close
set rs=nothing
end function
'显示代码函数
sub showcoad() '循环变量,循环变量,循环变量,是否有cyc属性,生成代码字符串,代码模板文档对象,文档的根节点,txt节点的cyc循环节点,临时字符串,txt的err节点,txt的arr节点,使用的全局数组
dim i,j,k,bcyc,strcode,doc,root,txtnote,cyc,str,attArr,arr
strcode = ""
'打开代码模板并取出所有的"txt"节点列表
set doc = Createobject("Microsoft.XMLDOM")
doc.load(CodeTempleate)
set root = doc.documentElement
set txtnote = doc.getElementsByTagName("txt")
'遍历节点列表
for i = 0 to txtnote.length -1
'测试当前txt节点的arr属性,并通过它确定本次循环中使用的全局字段数组是arrcol1还是arrcol2
attArr = txtnote(i).getAttribute("arr")
if not isnull(attArr) then
select Case attArr
Case "arrcol1"
arrtype="col" '设置全局变量arrtype
arr = arrcol1
Case "arrcol2"
arrtype="col"
arr = arrcol2
Case "arrsp"
arrtype="sp"
arr = arrsp
End Select
Else
arr = arrcol1 '默认使用arrcol1
end if
'测试当前的txt节点的cyc属性,并通过它来确定本节点是否要循环它子节点,当cyc属性为1时,必须要含有arr属性
set cyc = txtnote(i).attributes.getNamedItem("cyc")
if Not(cyc Is Nothing) then
if cyc.value <> "1" then
bcyc = false
else
bcyc = true
end if
else
bcyc = false '默认为不循环
end if
'如果本节点要循环子节点的话,就把当前节点的子节点循环处理
if bcyc then
set tnote = txtnote(i).getElementsByTagName("t") '获取子节点t的节点列表
'遍历当前使用的字段数组
for j = 0 to ubound(arr) -1
str ="" '给临时字符串赋默认值
'遍历t子节点列表
for k =0 to tnote.length - 1
'调用ExecuteNouts函数处理子节点
str = str &ExecuteNouts(tnote(k),arr,arr(j),j)
next
'替换占位符
str = ReplaceStr(str,arr(j))
strcode = strcode & str
next
else
str =""
str = txtnote(i).text
str = replace(str,"$table",tableName)
str = replace(str,"$sp_name",gobal_sp_name)
str = replace(str,"$connstr",gobal_connstr)
str = replace(str,"$collistlength",ubound(arr))
strcode = strcode & str
end if
next
document.all("txtsql").value = strcode
end sub
'替换占位符
if ISDEBUG = 0 then on error resume next
select case arrtype
case "col"
str_p = replace(str_p,"$colName",arr_j_p.colname)
str_p = replace(str_p,"$colType",arr_j_p.colType)
str_p = replace(str_p,"$col_netype",getdonetType(arr_j_p.colType))
str_p = replace(str_p,"$col_SqlDb",getSqlType(arr_j_p.colType))
str_p = replace(str_p,"$colLength",arr_j_p.colLength)
str_p = ReplaceUIstr(str_p,arr_j_p)
case "sp"
str_p = replace(str_p,"$sp_p_col_name",arr_j_p.name)
str_p = replace(str_p,"$sp_p_col_netype",getdonetType(arr_j_p.xtype))
str_p = replace(str_p,"$sp_p_col_netdbtype",getSqlType(arr_j_p.xtype))
str_p = replace(str_p,"$sp_p_col_length",arr_j_p.length)
str_p = replace(str_p,"$sp_p_col_isout",get_p_isout(arr_j_p.isout))
end select
if err.number<> 0 then ShowErr(err)
ReplaceStr = str_p
End Function
Private Function ReplaceUIstr(str_p,arr_j_p)
Dim doc,UIRoot,DataBaseName,TableName,UI_field_list,oSelect,i,j
oSelect = document.getElementsByName("ListDataBase")
DataBaseName = oSelect.options(oSelect.selectedIndex).value
oSelect = document.getElementsByName("ListDataTable")
TableName = oSelect.options(oSelect.selectedIndex).value
Set doc = Createobject("Microsoft.XMLDOM")
doc.load("UITemplate/UI.xml")
Set UIRoot = doc.documentElement
'用xpath语法获取当前数据库的当前表的所有显示字段列表
Set UI_field_list = UIRoot.selectNodes ("//database[@name="""&DataBaseName&"""]/table[@name="""&TableName&"""]/field")
For i = 0 to UI_field_list.length - 1
If arr_j_p.colname = UI_field_list(i).getAttribute("name") then
Select Case UI_field_list(i).getAttribute("display")
Case "input"
str_p = replace(str_p,"$UI_colName","<input type=""text"" name="""&arr_j_p.colname&""">")
Case "select"
strTemp = "<select name="""&arr_j_p.colname&""">"
For j = 0 To UI_field_list(i).childNodes.length-1
strTemp = strTemp & UI_field_list(i).childNodes(j).xml
Next
strTemp = strTemp & "</select>"
str_p = replace(str_p,"$UI_colName",strTemp)
End Select
End If
Next
ReplaceUIstr = str_p
End Function
'处理循环节点t的私有函数
private Function ExecuteNouts(note_k_p,arr_p,arr_j_p,j_p)
Dim t_att_exp,str_i
t_att_exp = note_k_p.getAttribute("expression") '获取当前t节点的expression属性
if not isnull(t_att_exp) then
select case(t_att_exp)
case "nomax"
if(j_p<>(ubound(arr_p)-1)) then
str_i = str_i & note_k_p.text
end if
case "isnumber"
if(isnumber(arr_j_p.colType)) then
str_i = str_i & note_k_p.text
end if
case "isstring"
if(isstring(arr_j_p.colType)) then
str_i = str_i & note_k_p.text
end if
case "p_noout"
if(arr_j_p.isout=0) then
str_i = str_i & note_k_p.text
end if
case else
str_i = str_i & note_k_p.text
end select
else
str_i = str_i & note_k_p.text
end if
ExecuteNouts = str_i
End Function
</script>
<BODY onload="vbscript:init">
<form>
<table width="98%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="7%" rowspan="5" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="unnamed1">选择模板</td>
</tr>
<tr>
<td><select name="ListTempleate" size="20" class="input" id="ListTempleate" onChange="ChangeTempleate(this.options(this.selectedIndex).value)">
</select></td>
</tr>
</table></td>
<td width="11%" class="unnamed1">数据库</td>
<td width="11%" class="unnamed1">数据表</td>
<td width="16%" class="unnamed1">字段1</td>
<td width="19%" class="unnamed1">字段2</td>
<td width="36%" class="unnamed1">存储过程</td>
</tr>
<tr>
<td valign="top"><select name="ListDataBase" size="10" class="input" id="ListDataBase" onChange="openconnectiondb(this.options(this.selectedIndex).value)">
</select></td>
<td valign="top"><select name="ListDataTable" size="10" class="input" id="ListDataTable" onChange="ChangeDataTable()" >
</select></td>
<td width="16%" valign="top"><select name="ListCol1" size="10" multiple class="input" onChange="ChangeCol(this,1)" >
</select></td>
<td width="19%" valign="top"><select name="ListCol2" size="10" multiple class="input" onChange="ChangeCol(this,2)" >
</select></td>
<td width="36%" valign="top"><select name="ListSP" size="10" class="input" id="ListSP" onChange="ChangeSp(this)">
</select></td>
</tr>
<tr>
<td colspan="5"><input name="ShowCode" type="button" class="button" onClick="showcoad()" value="生成代码">
<input type="button" name="showTrace" value="显示跟踪" class="button" onClick="divTraceOutput.style.display=divTraceOutput.style.display=='none'?'block':'none'"> <input type="button" name="CleanTrace" value="清除跟踪" class="button" onClick="divTraceOutput.innerHTML = ''">
</td>
</tr>
<tr>
<td colspan="5"><textarea name="txtsql" cols="50" rows="10" class="input" id="txtsql" style="width:100%; "></textarea></td>
</tr>
<tr>
<td colspan="5"><div class="unnamed1">代码帮助</div><textarea name="help" cols="50" rows="10" class="input" id="help" style="width:100%; ">------------------wawacoder代码生成器简介----------------------
可以肯定,写这个小软件费了很多力气,但是也可以肯定,如果合理的用这个小软件会提高不少工作效率.大
家都用过codeplus和codesmith吧,其实在实际软件编码过程中,尤其是写数据库应用程序,有太多的代码是
枯燥的重复,一点儿技术含量也没有,有时候我们甚至为写这些重复的代码而烦恼.这个小软件也许会改变
你这种情况.
之所以用vbscript来写这个程序,本来是想写好了,用vb编译一下用来保护源码的,可是后来我改变主意了,
为了增强程序的灵活性和可扩展性,我决定把源码公开了,以便人们定义自己的代码生成器,只要你稍微会
一点脚本知识就行.
现在这个软件是测试版本(其实测试版本也不算),软件的界面我还没做,源码看上去还很乱,需要重构,灵活
性不强,好多参数是硬编码到程序里的,没有生成更多种语言的代码(我只会一点儿asp和c#,或许其它语言
的代码模板还得你们去写),使用说明还没写出来......总之,还有很多有待解决的问题.如果你感觉这个小软件很有潜力,或者狗屁不是,请给我发电子邮件到[email protected],我欢迎任何
建议和批评.</textarea>
</div></td>
</tr>
</table>
</form>
<div id="divTraceOutput" style=" background-color:#999999; display:none; font-size:12px; color:#FFFFFF">下面是程序调试跟踪信息:<br></div>
<div algin="center">
<div align="center" class="Corporation">版权所有 蛙蛙王子</div>
</div>
<div align="center">
<OBJECT classid="clsid:00000514-0000-0010-8000-00AA006D2EA4" id="conn">
</OBJECT>
</div>
</BODY>
</HTML>