• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        dotnet代碼自動生成機的完成

        dotnet代碼自動生成機的完成

        更新時間:2022-05-13 文章作者:未知 信息來源:網絡 閱讀次數:

        在我們寫程序的時候,特別是數據庫應用程序的時候,經常會遇到這樣的情況:對于一個給定的表,寫出這個表對應的類(用一句時髦的話說是實現業務實體類),類的數據成員是所有的字段,并且類含有該表的添加修改刪除等操作。還有,對于一個給定的存儲過程,要完成根據存儲過程存取數據或別的數據庫操作。如下代碼就是我們通常要完成的:
        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 =@id " ;
        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 =@id \" ;\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() ;
        }

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

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 国产精品亚洲成在人线| 久久久久免费看黄A片APP| 亚洲精品NV久久久久久久久久| 亚洲精品人成网线在线播放va| 91在线视频免费看| 亚洲伊人久久精品| 67194成是人免费无码| 亚洲日本在线电影| 免费在线看片网站| 中文字幕永久免费| 亚洲av无码国产精品色午夜字幕| 99久久免费看国产精品| ww亚洲ww在线观看国产| 日韩免费高清一级毛片在线| 免费无遮挡无遮羞在线看| 国内精品99亚洲免费高清| 日韩电影免费在线观看| 亚洲日本视频在线观看| 黄网址在线永久免费观看 | 亚洲成年人电影在线观看| 最新欧洲大片免费在线| 亚洲1区2区3区精华液| 久久久久亚洲AV无码专区网站| 成人性生交大片免费看好| 亚洲国产超清无码专区| 国产hs免费高清在线观看| 水蜜桃视频在线观看免费播放高清 | 精品日韩99亚洲的在线发布| 亚洲AV成人精品日韩一区18p| CAOPORN国产精品免费视频| 亚洲精品第五页中文字幕| 国产禁女女网站免费看| 玖玖在线免费视频| 亚洲欧洲日韩国产一区二区三区| 亚洲日本一区二区三区在线不卡| 国产va在线观看免费| 亚洲av成人片在线观看| 亚洲AV无码乱码国产麻豆穿越| 免费毛片在线播放| 中文字幕亚洲免费无线观看日本| 国产成人精品日本亚洲语音 |