亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > .NET > 正文

dotnet代碼自動生成機的實現

2024-07-21 02:23:38
字體:
來源:轉載
供稿:網友
在我們寫程序的時候,特別是數據庫應用程序的時候,經常會遇到這樣的情況:對于一個給定的表,寫出這個表對應的類(用一句時髦的話說是實現業務實體類),類的數據成員是所有的字段,并且類含有該表的添加修改刪除等操作。還有,對于一個給定的存儲過程,要完成根據存儲過程存取數據或別的數據庫操作。如下代碼就是我們通常要完成的:
1.表的業務實體化
private int iid ;
public int id
{
get
{
return iid ;
}
set
{
iid = value ;
}
}


private string strname ;
public string name
{
get
{
return strname ;
}
set
{
strname = value ;
}
}


private string strcode ;
public string code
{
get
{
return strcode ;
}
set
{
strcode = value ;
}
}


private string strdescription ;
public string description
{
get
{
return strdescription ;
}
set
{
strdescription = value ;
}
}


private int ifatherid ;
public int fatherid
{
get
{
return ifatherid ;
}
set
{
ifatherid = value ;
}
}


private int itype ;
public int type
{
get
{
return itype ;
}
set
{
itype = value ;
}
}


private int iuserid ;
public int userid
{
get
{
return iuserid ;
}
set
{
iuserid = value ;
}
}


ublic bool add()
{
sqlconnection conn = sqlconn.instance().connection ;

string strsql = "insert into book(id, name, code, description, fatherid, type, userid)"
+"values(@id, @name, @code, @description, @fatherid, @type, @userid)" ;

sqlcommand command = new sqlcommand(strsql,conn) ;

command.parameters.add("@id",sqldbtype.int ) ;
command.parameters["@id"].value = iid ;

command.parameters.add("@name",sqldbtype.nvarchar ,50) ;
if (strname!= null )
command.parameters["@name"].value = strname ;
else
command.parameters["@name"].value = dbnull.value ;

command.parameters.add("@code",sqldbtype.nvarchar ,255) ;
if (strcode!= null )
command.parameters["@code"].value = strcode ;
else
command.parameters["@code"].value = dbnull.value ;

command.parameters.add("@description",sqldbtype.nvarchar ,255) ;
if (strdescription!= null )
command.parameters["@description"].value = strdescription ;
else
command.parameters["@description"].value = dbnull.value ;

command.parameters.add("@fatherid",sqldbtype.int ) ;
command.parameters["@fatherid"].value = ifatherid ;

command.parameters.add("@type",sqldbtype.int ) ;
command.parameters["@type"].value = itype ;

command.parameters.add("@userid",sqldbtype.int ) ;
command.parameters["@userid"].value = iuserid ;

try
{
conn.open() ;
command.executenonquery() ;
return true ;
}
catch(exception e)
{
throw(new exception("error in the database"+e.message)) ;
}
finally
{
conn.close() ;
}
}
public bool modify()
{
sqlconnection conn = sqlconn.instance().connection ;
string strsql ="update book set id = @id, name = @name, code = @code, description = @description, fatherid = @fatherid, type = @type, userid = @userid "
+ " where id [email protected] " ;
sqlcommand command = new sqlcommand(strsql,conn) ;
command.parameters.add("@id",sqldbtype.int ) ;
command.parameters["@id"].value = iid ;

command.parameters.add("@name",sqldbtype.nvarchar ,50) ;
command.parameters["@name"].value = strname ;

command.parameters.add("@code",sqldbtype.nvarchar ,255) ;
command.parameters["@code"].value = strcode ;

command.parameters.add("@description",sqldbtype.nvarchar ,255) ;
command.parameters["@description"].value = strdescription ;

command.parameters.add("@fatherid",sqldbtype.int ) ;
command.parameters["@fatherid"].value = ifatherid ;

command.parameters.add("@type",sqldbtype.int ) ;
command.parameters["@type"].value = itype ;

command.parameters.add("@userid",sqldbtype.int ) ;
command.parameters["@userid"].value = iuserid ;

try
{
conn.open() ;
command.executenonquery() ;
return true ;
}
catch(exception e)
{
throw(new exception("error in the database"+e.message)) ;
}
finally
{
conn.close() ;
}
}

再看一下存儲過程:
public bool exesp_ddms_modify_trx(
int aiprsn_trx_no,
int aiult_incid_no,
int aiprsn_trx_status_cd,
datetime adttrx_cmpl_dt,
string astremail_addr)
{
sqlconnection conn = sqlconn.instance().connection ;

string strspname = "ddms_modify_trx" ;
sqlcommand command = new sqlcommand(strspname,conn) ;
command.commandtype = commandtype.storedprocedure ;

command.parameters.add("@prsn_trx_no",sqldbtype.smallint ) ;
command.parameters["@prsn_trx_no"].value= aiprsn_trx_no ;

command.parameters.add("@ult_incid_no",sqldbtype.int ) ;
command.parameters["@ult_incid_no"].value= aiult_incid_no ;

command.parameters.add("@prsn_trx_status_cd",sqldbtype.int ) ;
command.parameters["@prsn_trx_status_cd"].value= aiprsn_trx_status_cd ;

command.parameters.add("@trx_cmpl_dt",sqldbtype.datetime ) ;
if ( adttrx_cmpl_dt!= datetime.minvalue )
command.parameters["@trx_cmpl_dt"].value= adttrx_cmpl_dt ;
else
command.parameters["@trx_cmpl_dt"].value= dbnull.value ;

command.parameters.add("@email_addr",sqldbtype.varchar ,70) ;
if ( astremail_addr!= null )
command.parameters["@email_addr"].value= astremail_addr ;
else
command.parameters["@email_addr"].value= dbnull.value ;

try
{
conn.open() ;
command.executenonquery() ;
return true ;
}
catch(exception e)
{
throw(new exception("error in the database"+e.message)) ;
}
finally
{
conn.close() ;
}
}

上面處理表的代碼也挺長的,但那只是7個字段,如果一個表含有二三十個字段的話,恐怕代碼更長,同樣,檢查你寫好的代碼是否有錯誤也是一個痛苦的過程。
但是,寫這些代碼本身并沒有多少難度,而且很多工作都是重復的,這就不能不啟發我們通過一個程序來完成這些繁瑣易出錯的工作。
假如讓我們來設計一個程序完成上面的代碼,我們應該怎么做哪?

要完成上面的工作,我們首先應該找到我們要處理的表或存儲過程。
我們也可以通過編程實現:
1.列出所有的數據庫服務器
public static arraylist getserverlist()
{
arraylist alservers = new arraylist() ;
sqldmo.application sqlapp = new sqldmo.applicationclass() ;
try
{
sqldmo.namelist serverlist = sqlapp.listavailablesqlservers() ;
for(int i = 1;i<= serverlist.count;i++)
{
alservers.add(serverlist.item(i)) ;
}
}
catch(exception e)
{
throw(new exception("取數據庫服務器列表出錯:"+e.message)) ;
}
finally
{
sqlapp.quit() ;
}
return alservers ;
}
這樣,所有的數據庫服務器迷宮凝成都存在了arraylist里,我們可以用一個下拉列表來列出所有的服務器,讓用戶選擇他需要的一個。
2。得到選定服務器所有的數據庫列表
要完成這個工作,我們需要用戶輸入這個數據庫服務器的用戶名和密碼,代碼如下:
public static arraylist getdblist(string strservername,string strusername,string strpwd)
{
arraylist aldbs = new arraylist() ;
sqldmo.application sqlapp = new sqldmo.applicationclass() ;
sqldmo.sqlserver svr = new sqldmo.sqlserverclass() ;
try
{
svr.connect(strservername,strusername,strpwd) ;
foreach(sqldmo.database db in svr.databases)
{
if(db.name!=null)
aldbs.add(db.name) ;
}
}
catch(exception e)
{
throw(new exception("連接數據庫出錯:"+e.message)) ;
}
finally
{
svr.disconnect() ;
sqlapp.quit() ;
}
return aldbs ;
}
這樣就得到了數據庫的列表,你同樣可以讓用戶選擇一個數據庫。
3。列出選定數據庫所有的用戶表和存儲過程
在這一步我們不用sqldmo了,我們通過讀取選定數據庫的sysobjects表中的記錄實現,當然,完成這個工作需要如下信息:你選擇的數據庫服務器名,用戶名,密碼,數據庫名等信息:
public static arraylist gettablelist(string strservername,string strdbname,string strusername,string strpwd)
{
string strconstr = " data source="+ strservername +";initial catalog="+strdbname +
";password="+ strpwd+";persist security info=true;user id="+ strusername;
sqlconnection conn = new sqlconnection(strconstr) ;

arraylist altbs = new arraylist() ;

string strsql = "select * from sysobjects where (xtype='u' or xtype='p') and category<>2 order by name" ;
sqlcommand comm = new sqlcommand(strsql,conn) ;

sqldatareader sr = null ;
try
{
conn.open() ;
sr = comm.executereader() ;
while(sr.read())
{
string strname = sr["name"].tostring() ;
bool bltable = sr["xtype"].tostring().trim().toupper() == "u"?true:false ;
tableinfo tb = new tableinfo(strname,bltable) ;
altbs.add(tb) ;
}

}
catch(exception err)
{
throw(new exception("取表明列表出錯:"+err.message)) ;
}
finally
{
if (sr != null)
{
sr.close() ;
sr = null ;
}
conn.close() ;
}
return altbs ;
}
這樣我們就得到了所有的用戶表和存儲過程,注意這一句:
select * from sysobjects where (xtype='u' or xtype='p') and category<>2 order by name,這是關鍵的sql語句,其中xtype='u' 表示用戶表,xtype='p'表示存儲過程,category<>2表示不是系統存儲過程。


下一步是取得選定表的所有字段或存儲過程的所有參數
我們從表syscolumns取得我們想要到的東西:
strtablename = tbinfo.name ;
string strsql = "select * from syscolumns where id=( " +
" select id from sysobjects where name='"+ strtablename + "')" ;

sqldataadapter sa = new sqldataadapter(strsql,conn) ;
dataset ds = new dataset() ;
sa.fill(ds) ;
這樣我們就把某個表(或存儲過程)的所有字段信息放到了結果集ds里。
在syscolumns 里有一個字段xtype,該字段表示列的數據類型,俺定義了兩個函數,能根據xtype的值得到對應的dotnet中的數據類型和sqldb數據類型:
private string gettype(int itype)
{
string strresult = "" ;
switch(itype)
{
case 34:
strresult = "byte[]" ;
break ;
case 35:
case 99:
case 167:
case 175:
case 231:
case 239:
strresult = "string" ;
break ;
case 48:
case 52:
case 56:
case 127:
strresult = "int" ;
break ;
case 58:
case 61:
strresult = "datetime" ;
break ;
case 59:
strresult = "single" ;
break ;
case 60:
case 106:
case 108:
case 122:
strresult = "decimal" ;
break ;
case 62:
strresult = "double" ;
break ;
case 104:
strresult = "bool" ;
break ;
default:
strresult = "none" ;//"unknow" ;
break ;
}
return strresult + " " ;
}

private string getsqldbtype(int itype)
{
string strresult = "" ;
switch(itype)
{
case 34:
strresult = "sqldbtype.image" ;
break ;
case 35:
strresult = "sqldbtype.text" ;
break ;
case 48:
strresult = "sqldbtype.tinyint" ;
break ;
case 52:
strresult = "sqldbtype.smallint" ;
break ;
case 56:
strresult = "sqldbtype.int" ;
break ;
case 58:
strresult = "sqldbtype.smalldatetime" ;
break ;
case 59:
strresult = "sqldbtype.real" ;
break ;
case 60:
strresult = "sqldbtype.money" ;
break ;
case 61:
strresult = "sqldbtype.datetime" ;
break ;
case 62:
strresult = "sqldbtype.float" ;
break ;
case 99:
strresult = "sqldbtype.ntext" ;
break ;
case 104:
strresult = "sqldbtype.bit" ;
break ;
case 106:
strresult = "sqldbtype.decimal" ;
break ;
case 108:
strresult = "sqldbtype.decimal" ;
break ;
case 122:
strresult = "sqldbtype.smallmoney" ;
break ;
case 127:
strresult = "sqldbtype.bigint" ;
break ;
case 165:
strresult = "sqldbtype.varbinary" ;
break ;
case 167:
strresult = "sqldbtype.varchar" ;
break ;
case 173:
strresult = "sqldbtype.binary" ;
break ;
case 175:
strresult = "sqldbtype.char" ;
break ;
case 189:
strresult = "sqldbtype.timestamp" ;
break ;
case 231:
strresult = "sqldbtype.nvarchar" ;
break ;
case 239:
strresult = "sqldbtype.nchar" ;
break ;
default:
strresult = "none" ;//"unknow" ;
break ;
}
return strresult + " " ;
}
當然,還有一個函數先介紹一下,后面有它的具體用法:
private string gettypeshort(int itype)
{
string strresult = "" ;
switch(gettype(itype).trim())
{
case "byte[]":
strresult = "img" ;
break ;
case "string":
strresult = "str" ;
break ;
case "int":
strresult = "i" ;
break ;
case "datetime":
strresult = "dt" ;
break ;
case "single":
strresult = "sig" ;
break ;
case "decimal":
strresult = "dec" ;
break ;
case "double":
strresult = "db" ;
break ;
case "bool":
strresult = "bl" ;
break ;
default:
strresult = "unknow" ;
break ;
}
return strresult ;
}

現在有了上面的介紹和函數基礎,我們可以逐步實現我們的目標了:
1.生成數據實體類的數據成員
大家看一下,對于一個字段id,整形,我們這樣定義:
private int iid ;
public int id
{
get
{
return iid ;
}
set
{
iid = value ;
}
}
其中iid表示數據類型+字段名稱,其中字段名稱的第一個字母大寫,代碼實現如下:
private string buildmember(dataset ds)
{
stringbuilder sb = new stringbuilder() ;
foreach(datarow dr in ds.tables[0].rows)
{
int itype = (byte)dr["xtype"] ;
string strtype = gettype(itype) ;
string strname = dr["name"].tostring() ;
strname = upfirstchar(strname) ;
string strshorttype = gettypeshort(itype) ;
string strprivateline = "private " + strtype + strshorttype +strname +" ;/r/n" ;
sb.append(strprivateline) ;
string strpublicline = "public " + strtype + strname +" /r/n" ;
sb.append(strpublicline) ;
sb.append("{/r/n") ;
sb.append("/tget/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/treturn " +strshorttype +strname+ " ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("/tset/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/t" +strshorttype +strname+ " = value ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("}/r/n") ;
sb.append("/r/n") ;
sb.append("/r/n") ;
}
return sb.tostring();
}

參數dataset ds中的ds是通過上一頁的sa.fill(ds)得到的,dr["name"]表示字段名稱,dr["xtype"] 是字段類型。
upfirstchar函數負責把字符串的第一個字母大寫:
private string upfirstchar(string strvalue)
{
return strvalue.substring(0,1).toupper() + strvalue.substring(1,strvalue.length - 1) ;
}
這樣就生成了數據實體的數據成員。
2。生成add方法
add方法生成起來有點難度,可以參考第一頁的程序,我們這里是通過參數的方法來實現add的。有一點要注意,就是在對參數賦值時要考慮參數值為空的情況。代碼實現如下:
private string buildaddfunction(dataset ds)
{
stringbuilder sb = new stringbuilder() ;

sb.append("public bool add()/r/n") ;
sb.append("{/r/n") ;
sb.append("/tsqlconnection conn = sqlconn.instance().connection ;/r/n") ;
sb.append("/r/n") ;
string strinsert = "/"insert into " + strtablename + "(";
string strfiledlist = "" ;
string strparamlist = "" ;
foreach(datarow dr in ds.tables[0].rows)
{
string strname = dr["name"].tostring() ;
strfiledlist = strfiledlist + strname + ", " ;
strparamlist = strparamlist + "@" + strname + ", " ;
}
strfiledlist = strfiledlist.trim().trimend(',') ;
strparamlist = strparamlist.trim().trimend(',') ;
sb.append("/tstring strsql = " + strinsert + strfiledlist+ ")/"/r/n") ;
sb.append("/t+/"values(" + strparamlist+ ")/" ;/r/n") ;
sb.append("/r/n") ;
sb.append("/tsqlcommand command = new sqlcommand(strsql,conn) ;/r/n") ;
sb.append("/r/n") ;
foreach(datarow dr in ds.tables[0].rows)
{
string strname = dr["name"].tostring() ;
string strsqltype = getsqldbtype((byte)dr["xtype"]) ;
string strshorttype = gettypeshort((byte)dr["xtype"]) ;
string strvaluename = strshorttype + upfirstchar(strname) ;
int ilen = (int16)dr["prec"] ;

string strlen = "" ;
if (strshorttype == "str")
strlen = strlen + "," + ilen ;
string strcommandname = "/tcommand.parameters.add(/"@" + strname + "/"," + strsqltype + strlen+ ") ;/r/n" ;

string strcommandvalue = "/tcommand.parameters[/"@" + strname + "/"].value = " + strvaluename + " ;/r/n" ;
string strcommandnullvalue = "/tcommand.parameters[/"@" + strname + "/"].value = dbnull.value ;/r/n" ;

sb.append(strcommandname) ;
if (strshorttype == "dt")
sb.append("/tif (" + strvaluename + "!= datetime.minvalue )/r/n") ;
else if (strshorttype == "str")
sb.append("/tif (" + strvaluename + "!= null )/r/n") ;
else if (strshorttype == "img")
sb.append("/tif (" + strvaluename + "!= null )/r/n") ;
else
sb.append("") ;
sb.append(strcommandvalue) ;
if (strshorttype == "dt" ||strshorttype == "str"||strshorttype == "img")
{
sb.append("/telse/r/n") ;
sb.append(strcommandnullvalue) ;
}
sb.append("/r/n") ;
}

sb.append(addcatchstring()) ;

sb.append("}/r/n") ;
return sb.tostring();
}


3。edit,delete的實現方法類似與add,就不詳細說了,edit方法代碼如下:
private string buildmodifyfunction(dataset ds)
{
stringbuilder sb = new stringbuilder() ;

sb.append("public bool modify()/r/n") ;
sb.append("{/r/n") ;
sb.append("/tsqlconnection conn = sqlconn.instance().connection ;/r/n") ;
string strmodify = "string strsql =/"update " + strtablename + " set ";

string strparamlist = "" ;
foreach(datarow dr in ds.tables[0].rows)
{
string strname = dr["name"].tostring() ;
strparamlist = strparamlist + strname + " = @" + strname + ", " ;
}
strparamlist = strparamlist.trim().trimend(',') ;
sb.append("/t" + strmodify + strparamlist + " /"/r/n") ;
sb.append("/t+ /" where id [email protected] /" ;/r/n") ;

sb.append("/tsqlcommand command = new sqlcommand(strsql,conn) ;/r/n") ;

foreach(datarow dr in ds.tables[0].rows)
{
string strname = dr["name"].tostring() ;
string strsqltype = getsqldbtype((byte)dr["xtype"]) ;
string strshorttype = gettypeshort((byte)dr["xtype"]) ;
string strvaluename = strshorttype + upfirstchar(strname) ;
int ilen = (int16)dr["prec"] ;

string strlen = "" ;
if (strshorttype == "str")
strlen = strlen + "," + ilen ;

string strcommandname = "/tcommand.parameters.add(/"@" + strname + "/"," + strsqltype + strlen + ") ;/r/n" ;
string strcommandvalue = "/tcommand.parameters[/"@" + strname + "/"].value = " + strvaluename + " ;/r/n" ;
sb.append(strcommandname) ;
sb.append(strcommandvalue) ;
sb.append("/r/n") ;
}

sb.append(addcatchstring()) ;

sb.append("}/r/n") ;
return sb.tostring();
}

4。生成存儲過程的執行方法和返回結果方法。存儲過程的參數也在syscolumns表里有詳細的說明,里面還記錄了每個參數是不是傳出參數,不過在這個函數里我沒有考慮參數的方向,當然,要考慮進去也不是很麻煩。
private string buildspexec(dataset ds)
{
stringbuilder sb = new stringbuilder() ;
string strfuncparam = "" ;

foreach(datarow dr in ds.tables[0].rows)
{
int itype = (byte)dr["xtype"] ;
string strname = upfirstchar(dr["name"].tostring().trimstart('@')) ;
string strtype = gettype(itype) ;
string strsqltype = getsqldbtype(itype) ;
string strshorttype = gettypeshort(itype) ;
strfuncparam = strfuncparam + "/r/n/t/t" + strtype + " a" + strshorttype + strname + ",";
}
strfuncparam = strfuncparam.trimend(',') ;
string strdef = "public bool exesp_" + strtablename + "(" + strfuncparam + ")/r/n";
sb.append(strdef) ;
sb.append("{/r/n") ;
sb.append("/tsqlconnection conn = sqlconn.instance().connection ;/r/n") ;
sb.append("/r/n") ;
sb.append("/tstring strspname = /"" + strtablename + "/" ;/r/n") ;
sb.append("/tsqlcommand command = new sqlcommand(strspname,conn) ;/r/n");
sb.append("/tcommand.commandtype = commandtype.storedprocedure ;/r/n") ;
sb.append("/r/n") ;

foreach(datarow dr in ds.tables[0].rows)
{
int itype = (byte)dr["xtype"] ;
string strparaname = dr["name"].tostring() ;
string strname = upfirstchar(strparaname.trimstart('@')) ;
string strsqltype = getsqldbtype(itype) ;
string strshorttype = gettypeshort(itype) ;
string strvalue = " a" + strshorttype + strname ;
int ilen = (int16)dr["prec"] ;

string strlen = "" ;
if (strshorttype == "str")
strlen = strlen + "," + ilen ;

string strcommandadd = "/tcommand.parameters.add(/"" + strparaname + "/"," + strsqltype + strlen + ") ;/r/n";
string strcommandvalue = "/tcommand.parameters[/"" + strparaname + "/"].value=" + strvalue + " ;/r/n";
string strcommandnull = "/tcommand.parameters[/"" + strparaname + "/"].value= dbnull.value ;/r/n";
sb.append(strcommandadd) ;
if (strshorttype == "dt")
sb.append("/tif (" + strvalue + "!= datetime.minvalue )/r/n/t") ;
else if (strshorttype == "str")
sb.append("/tif (" + strvalue + "!= null )/r/n/t") ;
else if (strshorttype == "img")
sb.append("/tif (" + strvalue + "!= null )/r/n/t") ;
else
sb.append("") ;
sb.append(strcommandvalue) ;
if (strshorttype == "dt" ||strshorttype == "str"||strshorttype == "img")
{
sb.append("/telse/r/n/t") ;
sb.append(strcommandnull) ;
}
sb.append("/r/n") ;
}
sb.append(addcatchstring()) ;

sb.append("}/r/n") ;
return sb.tostring() ;
}

對于存儲過程生成結果集的函數如下:
private string buildspgetdata(dataset ds)
{
stringbuilder sb = new stringbuilder() ;
string strfuncparam = "" ;

foreach(datarow dr in ds.tables[0].rows)
{
int itype = (byte)dr["xtype"] ;
string strname = upfirstchar(dr["name"].tostring().trimstart('@')) ;
string strtype = gettype(itype) ;
string strsqltype = getsqldbtype(itype) ;
string strshorttype = gettypeshort(itype) ;
strfuncparam = strfuncparam + "/r/n/t/t" + strtype + " a" + strshorttype + strname + ",";
}
strfuncparam = strfuncparam.trimend(',') ;
string strdef = "public dataset querysp_" + strtablename + "(" + strfuncparam + ")/r/n";
sb.append(strdef) ;
sb.append("{/r/n") ;
sb.append("/tsqlconnection conn = sqlconn.instance().connection ;/r/n") ;
sb.append("/r/n") ;
sb.append("/tstring strspname = /"" + strtablename + "/" ;/r/n") ;
sb.append("/tsqlcommand command = new sqlcommand(strspname,conn) ;/r/n");
sb.append("/tcommand.commandtype = commandtype.storedprocedure ;/r/n") ;
sb.append("/r/n") ;

foreach(datarow dr in ds.tables[0].rows)
{
int itype = (byte)dr["xtype"] ;
string strparaname = dr["name"].tostring() ;
string strname = upfirstchar(strparaname.trimstart('@')) ;
string strsqltype = getsqldbtype(itype) ;
string strshorttype = gettypeshort(itype) ;
string strvalue = " a" + strshorttype + strname ;
int ilen = (int16)dr["prec"] ;

string strlen = "" ;
if (strshorttype == "str")
strlen = strlen + "," + ilen ;

string strcommandadd = "/tcommand.parameters.add(/"" + strparaname + "/"," + strsqltype + strlen + ") ;/r/n";
string strcommandvalue = "/tcommand.parameters[/"" + strparaname + "/"].value=" + strvalue + " ;/r/n";
string strcommandnull = "/tcommand.parameters[/"" + strparaname + "/"].value= dbnull.value ;/r/n";
sb.append(strcommandadd) ;
if (strshorttype == "dt")
sb.append("/tif (" + strvalue + "!= datetime.minvalue )/r/n/t") ;
else if (strshorttype == "str")
sb.append("/tif (" + strvalue + "!= null )/r/n/t") ;
else if (strshorttype == "img")
sb.append("/tif (" + strvalue + "!= null )/r/n/t") ;
else
sb.append("") ;
sb.append(strcommandvalue) ;
if (strshorttype == "dt" ||strshorttype == "str"||strshorttype == "img")
{
sb.append("/telse/r/n/t") ;
sb.append(strcommandnull) ;
}
sb.append("/r/n") ;
}

sb.append("/tsqldataadapter sdaresult = new sqldataadapter(command) ;/r/n") ;
sb.append("/tdataset ds = new dataset() ;/r/n") ;


sb.append(addcatchquerystring()) ;

sb.append("}/r/n") ;
return sb.tostring() ;

}
下面是生成結果集的執行結果:
public dataset querysp_ddms_getbank(
int aiprsn_id)
{
sqlconnection conn = sqlconn.instance().connection ;

string strspname = "ddms_getbank" ;
sqlcommand command = new sqlcommand(strspname,conn) ;
command.commandtype = commandtype.storedprocedure ;

command.parameters.add("@prsn_id",sqldbtype.int ) ;
command.parameters["@prsn_id"].value= aiprsn_id ;

sqldataadapter sdaresult = new sqldataadapter(command) ;
dataset ds = new dataset() ;
try
{
sdaresult.fill(ds) ;
}
catch(exception e)
{
throw(new exception("error in the database"+e.message)) ;
}
finally
{
sdaresult.dispose() ;
}
return ds ;
}

還有兩個函數在程序中用到了,如下所示:
private string addcatchstring()
{
stringbuilder sb = new stringbuilder() ;
sb.append("/ttry/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/tconn.open() ;/r/n") ;
sb.append("/t/tcommand.executenonquery() ;/r/n") ;
sb.append("/t/treturn true ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("/tcatch(exception e)/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/tthrow(new exception(/"error in the database/"+e.message)) ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("/tfinally/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/tconn.close() ;/r/n") ;
sb.append("/t}/r/n") ;
return sb.tostring() ;
}

private string addcatchquerystring()
{
stringbuilder sb = new stringbuilder() ;
sb.append("/ttry/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/tsdaresult.fill(ds) ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("/tcatch(exception e)/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/tthrow(new exception(/"error in the database/"+e.message)) ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("/tfinally/r/n") ;
sb.append("/t{/r/n") ;
sb.append("/t/tsdaresult.dispose() ;/r/n") ;
sb.append("/t}/r/n") ;
sb.append("/treturn ds ;/r/n") ;
return sb.tostring() ;
}

順便說一下,文章開頭的一段代碼就是用這個程序生成的,當然,這種方法還有待完善的地方,希望大家指正。

最大的網站源碼資源下載站,

上一篇:連接Corba和dotNet

下一篇:Dot Net的調試 - 3

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品伦子伦免费视频| 欧美片一区二区三区| 亚洲女人被黑人巨大进入| 国产噜噜噜噜噜久久久久久久久| 午夜美女久久久久爽久久| 高清日韩电视剧大全免费播放在线观看| 宅男66日本亚洲欧美视频| 国产精彩精品视频| 亚洲国产一区自拍| 欧美日韩国产中字| 久久亚洲精品一区二区| 91精品视频大全| 日韩av有码在线| 高清在线视频日韩欧美| 欧美午夜女人视频在线| 中文字幕自拍vr一区二区三区| 爱福利视频一区| 欧美在线视频免费| 欧美一区二粉嫩精品国产一线天| 91久久久久久久一区二区| 亲爱的老师9免费观看全集电视剧| 国产精品27p| 欧洲日韩成人av| 久久亚洲国产成人| 欧洲亚洲免费在线| 亚洲xxxx18| 91干在线观看| 欧美日韩精品在线| 国产精品成人一区二区| 精品高清美女精品国产区| 精品毛片三在线观看| 欧美性在线观看| 狠狠躁夜夜躁久久躁别揉| 亚洲美女av在线播放| 久久精品视频亚洲| 97人人爽人人喊人人模波多| 欧美一区亚洲一区| 亚洲mm色国产网站| 亚洲一区美女视频在线观看免费| 国产成人精品免费视频| www国产精品视频| 亚洲精品视频在线观看视频| 亚洲成人免费在线视频| 一本大道香蕉久在线播放29| 九九视频直播综合网| 亚洲一区二区三区sesese| 日韩免费在线电影| 国产精品久久久91| 亚洲加勒比久久88色综合| 成人黄色免费网站在线观看| 日韩av资源在线播放| 日本91av在线播放| 91国内免费在线视频| 精品女厕一区二区三区| 亚洲国产中文字幕久久网| 国产精品一区二区三| 中文字幕一区二区三区电影| 琪琪亚洲精品午夜在线| 欧美日韩亚洲一区二| 日韩高清电影免费观看完整版| 国模精品视频一区二区| 欧美日本亚洲视频| 国产精品视频永久免费播放| 国产精品第二页| 日韩中文字幕在线看| www高清在线视频日韩欧美| 色香阁99久久精品久久久| 国产精品免费一区二区三区都可以| 欧美日韩福利电影| 日韩av免费在线| 欧美日本在线视频中文字字幕| 国产亚洲aⅴaaaaaa毛片| 欧美午夜宅男影院在线观看| 中文字幕成人在线| 欧美成人在线网站| 在线观看国产欧美| 亚洲国产欧美一区二区丝袜黑人| 91极品女神在线| 国产在线观看91精品一区| 久久久久久尹人网香蕉| 国产成人av在线| 日韩中文字幕在线观看| 最近免费中文字幕视频2019| 亚洲国产成人精品电影| 伊人久久五月天| www.亚洲男人天堂| 欧美裸体xxxx极品少妇| 2025国产精品视频| 亚洲男子天堂网| 隔壁老王国产在线精品| 国产中文字幕日韩| 91理论片午午论夜理片久久| 欧美在线性爱视频| 日本三级韩国三级久久| 欧美日韩性视频| 欧美xxxwww| 国产精品久久久91| 亚洲一区二区三区sesese| 中文日韩在线观看| 久久久久久久久91| 欧美高清视频在线播放| 97久久伊人激情网| 亚洲精品国产欧美| 国外成人免费在线播放| 精品亚洲一区二区三区四区五区| 国产va免费精品高清在线| 亚洲精品理论电影| 国产亚洲精品91在线| 国产一区深夜福利| 国产精品电影网站| 日韩欧美国产激情| 正在播放欧美一区| 亚洲男人的天堂在线播放| 成人444kkkk在线观看| 日韩精品视频在线观看免费| 国产精品欧美一区二区| 欧美高清视频免费观看| 中文字幕视频一区二区在线有码| 欧美激情欧美激情| 国产日韩在线视频| 在线亚洲国产精品网| 久久全国免费视频| 精品人伦一区二区三区蜜桃免费| 色久欧美在线视频观看| 国产精品尤物福利片在线观看| 精品久久久久久久久久久久久| 亚洲国产欧美久久| 亚洲欧洲日本专区| 亚洲人成伊人成综合网久久久| 国产91精品久久久久| 国产成人91久久精品| 91精品一区二区| 欧美日韩国产激情| 1769国内精品视频在线播放| 国产综合色香蕉精品| 第一福利永久视频精品| 亚洲黄色av女优在线观看| 亚洲区免费影片| 精品久久久久久久久久久| 精品无码久久久久久国产| 91亚洲国产精品| 久久精品视频中文字幕| 日韩精品在线观看一区| 国产亚洲精品91在线| 一本色道久久88综合日韩精品| 中文字幕日韩av综合精品| 国产精品视频不卡| 91av在线免费观看| 国产剧情日韩欧美| 亚洲精品乱码久久久久久金桔影视| 国产亚洲欧洲高清| 欧美午夜视频一区二区| 中文字幕亚洲无线码在线一区| 国产精品高精视频免费| 国产三级精品网站| 国产综合久久久久久| 欧美黄色小视频| 97碰在线观看| 欧美视频在线观看免费网址| 国产在线视频2019最新视频| 亚洲精品动漫久久久久| 亚洲精品999| 97精品视频在线播放| 亚洲久久久久久久久久久|