麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > .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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 91短视频免费 | 色妞视频男女视频 | 草莓福利社区在线 | 欧美成人一级片 | 成人短视频在线播放 | 日日操日日操 | 国产免费传媒av片在线 | 成人黄色小视频网站 | 在线日韩av电影 | 欧美三级欧美成人高清www | 精品人伦一区二区三区蜜桃网站 | 欧美一级黄色网 | h色网站在线观看 | 午夜热门福利 | 欧美精品一级 | 韩毛片 | 成人在线视频免费观看 | 最新久久免费视频 | 黄色99视频 | 91女上位 在线播放 性欧美日本 | 91九色免费视频 | 亚州综合网 | 日韩av在线资源 | 毛片视频网站在线观看 | 国产精品视频一区二区三区四区国 | 亚洲第一成人久久网站 | 久草在线观看福利视频 | 国产精品成人一区二区三区吃奶 | 九九热精品视频在线播放 | omofun 动漫在线观看 | 久久6国产 | 国产成人av免费看 | 国产人成免费爽爽爽视频 | 欧美视频网 | 国产亚洲精久久久久久蜜臀 | 女人久久久www免费人成看片 | 欧美精品99| 国产亚洲黑人性受xxxx精品 | 91精品国产综合久久久动漫日韩 | 国内精品久久久久影院不卡 | 国产一区视频免费观看 |