天天看點

實作SQL -> C# Class Code工具的問題

    繼續說明這個玩意兒不是OR

Mapping,因為它隻有Mapping而沒有任何的Relation。我覺得非要取個名字叫Object DataRow

Mapping還比較恰當。如果你在做資料庫方面的内容,而且還在自己拼接SQL語句來更新資料庫資料行的話,那麼這篇文章将非常适合你的胃口。

在各種各樣的項目中,中小型項目中是數量衆多的,很多這樣的項目需要資料庫,而又不會有十分複雜的表間依賴關系。在操作資料庫是的代碼也不是一成不變的,很多時候會有一些custom的内容需要加在代碼裡,想做一個大而全的AutoCode來通吃也非常的困難,我覺得更好的辦法是把分解SQL語言的功能子產品化,然後自己在項目中根具自己的需求來AutoCode就行了。

    在我的AutoCode裡,我把每個資料庫表的字段分解為:

實作SQL -> C# Class Code工具的問題

    public struct SqlField

實作SQL -> C# Class Code工具的問題

    {

實作SQL -> C# Class Code工具的問題

        public string Name;

實作SQL -> C# Class Code工具的問題

        public SqlDbType DbType;

實作SQL -> C# Class Code工具的問題

        public System.Type Type;

實作SQL -> C# Class Code工具的問題

        public int Length;

實作SQL -> C# Class Code工具的問題

        public string Sort;

實作SQL -> C# Class Code工具的問題

        public bool IsNull;

實作SQL -> C# Class Code工具的問題

    }

    分解的辦法也非常的簡單,就用正規表達式了:

實作SQL -> C# Class Code工具的問題

string strMatch = @"(\s*\[?(?<Name>\w+)\]?\s+\[?(?<DbType>\w+)\]?){1}(\s*\(?(?<Length>\d+(,\d+)?)\)?)?(\s+(?<Sort>COLLATE\s+\w+))?(\s+(?<IsNull>(NOT\s+)?NULL))?\s*\,";

實作SQL -> C# Class Code工具的問題

//                  ^---------------- Name + DbType ----------------^|<----------- Length ---------->|^---------- Sort ----------^|<--------- Is Null -------->|

實作SQL -> C# Class Code工具的問題

    // 在[宋體]下就能對齊這個pattern的這各部分的功能和其說明了 

    由于我的工具直接處理SQL語句,需要一個SqlType <-->CTS Type的映射表:

實作SQL -> C# Class Code工具的問題

#region SQL Type <--> CTS Type Mapping Table

實作SQL -> C# Class Code工具的問題

    // Sql data type mapping to .NET CTS type

實作SQL -> C# Class Code工具的問題

    m_Type = new Hashtable();

實作SQL -> C# Class Code工具的問題

    m_Type["bigint"]    = "System.Int64";

實作SQL -> C# Class Code工具的問題

    m_Type["binary"]    = "System.Byte[]";

實作SQL -> C# Class Code工具的問題

    m_Type["bit"]        = "System.Boolean";

實作SQL -> C# Class Code工具的問題

    m_Type["char"]        = "System.String";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["datetime"]    = "System.DateTime";

實作SQL -> C# Class Code工具的問題

    m_Type["decimal"]    = "System.Decimal";

實作SQL -> C# Class Code工具的問題

    m_Type["float"]        = "System.Double";

實作SQL -> C# Class Code工具的問題

    m_Type["image"]        = "System.Byte[]";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["int"]        = "System.Int32";

實作SQL -> C# Class Code工具的問題

    m_Type["money"]        = "System.Decimal";

實作SQL -> C# Class Code工具的問題

    m_Type["nchar"]        = "System.String";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["ntext"]        = "System.String";        //object

實作SQL -> C# Class Code工具的問題

    //m_Type["numeric"]    = "System.Decimal";

實作SQL -> C# Class Code工具的問題

    m_Type["nvarchar"]    = "System.String";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["real"]        = "System.Single";

實作SQL -> C# Class Code工具的問題

    m_Type["smalldatetime"]    = "System.DateTime";

實作SQL -> C# Class Code工具的問題

    m_Type["smallint"]        = "System.Int16";

實作SQL -> C# Class Code工具的問題

    m_Type["smallmoney"]    = "System.Decimal";

實作SQL -> C# Class Code工具的問題

    m_Type["variant"]    = "System.Object";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["text"]        = "System.String";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["timestamp"]    = "System.Byte[]";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["tinyint"]    = "System.Byte";

實作SQL -> C# Class Code工具的問題

    m_Type["uniqueidentifier"]    = "System.Guid";//object

實作SQL -> C# Class Code工具的問題

    m_Type["varbinary"]    = "System.Byte[]";        //object

實作SQL -> C# Class Code工具的問題

    m_Type["varchar"]    = "System.String";        //object

實作SQL -> C# Class Code工具的問題

#endregion

    在SqlDataReader裡面本來有一個映射表,

SqlDataReader.MetaData[int

index].metaType.SqlType對應SqlDataReader.MetaData[int

index].metaType.TypeName,可是MetaData屬性不是public的,讀不出來,郁悶。 

    通過周遊正規表達式的所有Match,獲得一個SqlField數組:

實作SQL -> C# Class Code工具的問題

#region 生成SqlField數組的代碼

實作SQL -> C# Class Code工具的問題

            Match m = Regex.Match(strFields, strMatch, RegexOptions.IgnoreCase);

實作SQL -> C# Class Code工具的問題

            while( m.Success )

實作SQL -> C# Class Code工具的問題

            {

實作SQL -> C# Class Code工具的問題

                SqlField sc = new SqlField();

實作SQL -> C# Class Code工具的問題

                sc.Name = m.Groups["Name"].Value;

實作SQL -> C# Class Code工具的問題

                string strDbType = m.Groups["DbType"].Value.ToLower();

實作SQL -> C# Class Code工具的問題

                if ( strDbType == "sql_variant" ) strDbType = "variant";

實作SQL -> C# Class Code工具的問題

                if ( strDbType == "numeric" ) strDbType = "decimal";

實作SQL -> C# Class Code工具的問題

                sc.DbType = (SqlDbType)Enum.Parse(typEnum, strDbType, true);

實作SQL -> C# Class Code工具的問題

                string strLength = m.Groups["Length"].Value;

實作SQL -> C# Class Code工具的問題

                if ( strLength.Length == 0 )

實作SQL -> C# Class Code工具的問題

                {

實作SQL -> C# Class Code工具的問題

                    sc.Length = 0;

實作SQL -> C# Class Code工具的問題

                }

實作SQL -> C# Class Code工具的問題

                else

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    try

實作SQL -> C# Class Code工具的問題

                    {

實作SQL -> C# Class Code工具的問題

                        sc.Length = int.Parse(m.Groups["Length"].Value);

實作SQL -> C# Class Code工具的問題

                    }

實作SQL -> C# Class Code工具的問題

                    catch

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                        sc.Length = 0;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                sc.Type = System.Type.GetType(m_Type[strDbType].ToString());

實作SQL -> C# Class Code工具的問題

                sc.Sort = m.Groups["Sort"].Value;

實作SQL -> C# Class Code工具的問題

                sc.IsNull = (m.Groups["IsNull"].Value.ToLower() == "null");

實作SQL -> C# Class Code工具的問題

                alstFields.Add(sc);

實作SQL -> C# Class Code工具的問題

                //strSql = strSql.Replace(m.Value, "");

實作SQL -> C# Class Code工具的問題

                m = m.NextMatch();

實作SQL -> C# Class Code工具的問題

            }

實作SQL -> C# Class Code工具的問題

            m_Fields = (SqlField [])alstFields.ToArray(typeof(SqlField));

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

#region Sql2Class

實作SQL -> C# Class Code工具的問題

using System;

實作SQL -> C# Class Code工具的問題

using System.Collections;

實作SQL -> C# Class Code工具的問題

using System.Text;

實作SQL -> C# Class Code工具的問題

using System.Data;

實作SQL -> C# Class Code工具的問題

using System.Data.SqlClient;

實作SQL -> C# Class Code工具的問題

using System.Text.RegularExpressions;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

namespace CodeConvert

實作SQL -> C# Class Code工具的問題

{

實作SQL -> C# Class Code工具的問題

    /// <summary>

實作SQL -> C# Class Code工具的問題

    /// Summary description for SqlToCSharp.

實作SQL -> C# Class Code工具的問題

    /// </summary>

實作SQL -> C# Class Code工具的問題

    public class Sql2Class

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private SqlFieldCollection m_SqlFields;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        public Sql2Class(string strSqlCode)

實作SQL -> C# Class Code工具的問題

        {

實作SQL -> C# Class Code工具的問題

            m_SqlFields = new SqlFieldCollection(strSqlCode);

實作SQL -> C# Class Code工具的問題

            CreateClass();

實作SQL -> C# Class Code工具的問題

        }

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        public Sql2Class(SqlFieldCollection sfc)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            m_SqlFields = sfc;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string CreateClass()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            if ( m_SqlFields.FieldsCount == 0 ) return "";

實作SQL -> C# Class Code工具的問題

            StringBuilder strbCode = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbCode.Append("/// <summary>\r\n/// Automatically Code for Table '");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(m_SqlFields.TableName);

實作SQL -> C# Class Code工具的問題

            strbCode.Append("',\r\n/// by Birdshome AutoCode Engine V.1.0\r\n/// Copyright (C) 2004.1 Birdshome, HIT\r\n/// Create at : ");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));

實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n/// </summary>\r\npublic class ");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n{\r\n");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(DefineVariables(m_SqlFields.Fields));

實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n\tprivate static string m_TableName = \"");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbCode.Append("\";\r\n\r\n");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(DefineAttributes(m_SqlFields.Fields));

實作SQL -> C# Class Code工具的問題

            strbCode.Append(@"

實作SQL -> C# Class Code工具的問題

    public " + m_SqlFields.TableName + @"()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        SqlCmd = new System.Data.SqlClient.SqlCommand();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    public " + m_SqlFields.TableName + @"(int id) : this()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        if ( id <= 0 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            throw new System.Exception(""The value of id must be greater than zero."");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        m_" + m_SqlFields.Identity.Name + @" = id;

實作SQL -> C# Class Code工具的問題

        Load();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    public " + m_SqlFields.TableName + @"(string field, string @value) : this()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        if ( field == null || field.Length == 0 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            throw new System.NullReferenceException(""field"");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        if ( @value == null || field.Length == 0 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            throw new System.NullReferenceException(""@value"");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        Load(field, @value);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    protected void Load()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        if ( m_" + m_SqlFields.Identity.Name + @" <= 0 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            throw new System.Exception(""The value of m_ID must be greater than zero."");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        Load(m_" + m_SqlFields.Identity.Name + @");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    protected void Load(int id)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        string strSql = ""Select * From [{0}] Where ([ID] = {1})"";

實作SQL -> C# Class Code工具的問題

        RunSql(string.Format(strSql, m_TableName, id));

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    protected void Load(string field, string @value)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        if ( @value.IndexOf('\'') != -1 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            @value = @value.Replace(""'"", ""''"");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        string strSql = ""Select * From [{0}] Where ([{1}] = '{2}')"";

實作SQL -> C# Class Code工具的問題

        RunSql(string.Format(strSql, m_TableName, field, @value));

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    private void RunSql(string strSql)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        SqlCmd.Connection = GetSqlConnection();

實作SQL -> C# Class Code工具的問題

        SqlCmd.CommandText = strSql;

實作SQL -> C# Class Code工具的問題

        System.Data.SqlClient.SqlDataReader drFields;

實作SQL -> C# Class Code工具的問題

        drFields = SqlCmd.ExecuteReader();

實作SQL -> C# Class Code工具的問題

        try

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            ReadData(drFields);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        catch(System.Exception exp)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            throw exp;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        finally

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            drFields.Close();

實作SQL -> C# Class Code工具的問題

            drFields = null;

實作SQL -> C# Class Code工具的問題

            SqlCmd.Connection.Close();

實作SQL -> C# Class Code工具的問題

            SqlCmd.Parameters.Clear();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbCode.Append(GetReadDataFunction(m_SqlFields.Fields).Replace("\r\n", "\n").Replace("\n", "\r\n"));

實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n\t/// <summary>\r\n\t/// Save datas\r\n\t/// </summary>\r\n\tpublic void Save()\r\n\t{\r\n\t\tSave(m_");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(m_SqlFields.Identity.Name);

實作SQL -> C# Class Code工具的問題

            strbCode.Append(");\r\n\t}\r\n");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(GetSaveFunction(m_SqlFields.Fields));

實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(GetSaveAsFunction(m_SqlFields.Fields));

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbCode.Append(GetCopyToFunction(m_SqlFields.Fields));

實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n\r\n\t~");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbCode.Append("()\r\n\t{\r\n\t\tSqlCmd.Dispose();\r\n\t}\r\n\r\n\t/// <summary>\r\n\t/// Create and return the database connection\r\n\t/// </summary>\r\n\t/// <returns>the opened database connection</returns>\r\n\tprotected static System.Data.SqlClient.SqlConnection GetSqlConnection()\r\n\t{\r\n\t\tstring strConn = \"SqlConnectionString\";\r\n\t\tstrConn = System.Configuration.ConfigurationSettings.AppSettings[strConn];\r\n\t\tSystem.Data.SqlClient.SqlConnection SqlConn;\r\n\t\tSqlConn = new System.Data.SqlClient.SqlConnection(strConn);\r\n\t\tSqlConn.Open();\r\n\t\treturn SqlConn;\r\n\t}\r\n");

實作SQL -> C# Class Code工具的問題

            strbCode.Append(GetExtraFunctions());

實作SQL -> C# Class Code工具的問題

            strbCode.Append("\r\n}");

實作SQL -> C# Class Code工具的問題

            return strbCode.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string DefineVariables(SqlField [] fields)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            StringBuilder strbVariables = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbVariables.Append("\tprivate ");

實作SQL -> C# Class Code工具的問題

            strbVariables.Append(m_SqlFields.Identity.Type.ToString());

實作SQL -> C# Class Code工具的問題

            strbVariables.Append(" m_");

實作SQL -> C# Class Code工具的問題

            strbVariables.Append(m_SqlFields.Identity.Name);

實作SQL -> C# Class Code工具的問題

            strbVariables.Append(";\r\n");

實作SQL -> C# Class Code工具的問題

            for( int i=0 ; i < fields.Length ; i++ )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbVariables.Append("\tprivate ");

實作SQL -> C# Class Code工具的問題

                strbVariables.Append((fields[i]).Type.ToString());

實作SQL -> C# Class Code工具的問題

                strbVariables.Append(" m_");

實作SQL -> C# Class Code工具的問題

                strbVariables.Append((fields[i]).Name);

實作SQL -> C# Class Code工具的問題

                strbVariables.Append(";\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbVariables.Append("\tprivate System.Data.SqlClient.SqlCommand SqlCmd;\r\n\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbVariables.Append("\tprivate bool bSet");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbVariables.Append("\t= false;\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            return strbVariables.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string DefineAttributes(SqlField [] fields)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            string strName, strType;

實作SQL -> C# Class Code工具的問題

            StringBuilder strbAttributes = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbAttributes.Append("\tpublic ");

實作SQL -> C# Class Code工具的問題

            strbAttributes.Append(m_SqlFields.Identity.Type.ToString());

實作SQL -> C# Class Code工具的問題

            strbAttributes.Append(" " + m_SqlFields.Identity.Name);

實作SQL -> C# Class Code工具的問題

            strbAttributes.Append("\r\n\t{\r\n\t\tget\r\n\t\t{\r\n\t\t\treturn m_");

實作SQL -> C# Class Code工具的問題

            strbAttributes.Append(m_SqlFields.Identity.Name);

實作SQL -> C# Class Code工具的問題

            strbAttributes.Append(";\r\n\t\t}\r\n\t}\r\n");

實作SQL -> C# Class Code工具的問題

            System.Type type;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strName = (fields[i]).Name;

實作SQL -> C# Class Code工具的問題

                type = (fields[i]).Type;

實作SQL -> C# Class Code工具的問題

                strType = type.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbAttributes.Append("\r\n\tpublic ");

實作SQL -> C# Class Code工具的問題

                strbAttributes.Append(strType);

實作SQL -> C# Class Code工具的問題

                strbAttributes.Append(" ");

實作SQL -> C# Class Code工具的問題

                strbAttributes.Append(strName);

實作SQL -> C# Class Code工具的問題

                strbAttributes.Append("\r\n\t{\r\n\t\tget\r\n\t\t{\r\n\t\t\treturn m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbAttributes.Append(";\r\n\t\t}\r\n\t\tset\r\n\t\t{\r\n\t\t\t");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                if ( type == typeof(System.Byte) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Int16) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Int32) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Int64) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Single) )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append("if ( m_");

實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(strName);

實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(" == 0 || m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(" != value )\r\n\t\t\t{\r\n\t\t\t\tm_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(" = value;\r\n\t\t\t\tbSet");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(" = true;\r\n\t\t\t}\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                if ( type == typeof(System.Byte[]) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Object) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.String) )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append("if ( value != null && m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                if ( type == typeof(System.Boolean) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.DateTime) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Decimal) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Double) 

實作SQL -> C# Class Code工具的問題

                    || type == typeof(System.Guid) )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append("m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(" = value;\r\n\t\t\tbSet");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbAttributes.Append(" = true;\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbAttributes.Append("\t\t}\r\n\t}\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            return strbAttributes.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string GetReadDataFunction(SqlField [] fields)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            StringBuilder strbReadData = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbReadData.AppendFormat(@"

實作SQL -> C# Class Code工具的問題

    private void ReadData(System.Data.SqlClient.SqlDataReader drFields)

實作SQL -> C# Class Code工具的問題

    {{

實作SQL -> C# Class Code工具的問題

        bool bLoadSuccess = false;

實作SQL -> C# Class Code工具的問題

        if ( drFields.Read() )

實作SQL -> C# Class Code工具的問題

        {{

實作SQL -> C# Class Code工具的問題

            object obj{0} = drFields[""{0}""];

實作SQL -> C# Class Code工具的問題

            m_{0} = (System.Int32)obj{0};

實作SQL -> C# Class Code工具的問題

", m_SqlFields.Identity.Name);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            string strName;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbReadData.AppendFormat(@"

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            if ( !( obj{0} is System.DBNull ) )

實作SQL -> C# Class Code工具的問題

            {{

實作SQL -> C# Class Code工具的問題

                m_{0} = ({1})obj{0};

實作SQL -> C# Class Code工具的問題

            }}", strName, (fields[i]).Type.ToString());

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbReadData.Append(@"

實作SQL -> C# Class Code工具的問題

            bLoadSuccess = true;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        bool bNonUnique = drFields.Read();

實作SQL -> C# Class Code工具的問題

        if ( bNonUnique || !bLoadSuccess )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            string strMessage = ""The identity isn't unique."";

實作SQL -> C# Class Code工具的問題

            throw new System.Exception(strMessage);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            return strbReadData.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string GetSaveFunction(SqlField [] fields)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            StringBuilder strbSave = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbSave.Append("\r\n\t/// <summary>\r\n\t/// Save the datas of row which ID equal iIdentity.\r\n\t/// </summary>\r\n\t/// <param name=\"iIdentity\"></param>\r\n\tprivate void Save(int iIdentity)\r\n\t{\r\n\t\tif ( iIdentity <= 0 )\r\n\t\t{\r\n\t\t\tSaveAs();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tSystem.Text.StringBuilder strbSql;\r\n\t\tstrbSql = new System.Text.StringBuilder();\r\n\t\tstrbSql.Append(\"Update [\" + m_TableName + \"] Set\");\r\n\t\tSystem.Data.SqlClient.SqlParameterCollection spc;\r\n\t\tspc = SqlCmd.Parameters;\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                SqlField sc = fields[i];

實作SQL -> C# Class Code工具的問題

                strName = sc.Name;

實作SQL -> C# Class Code工具的問題

                strbSave.Append("\t\tif ( bSet");

實作SQL -> C# Class Code工具的問題

                strbSave.Append(strName);

實作SQL -> C# Class Code工具的問題

                strbSave.Append(" )\r\n\t\t{\r\n\t\t\tstrbSql.Append(\", [");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append("] = @");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append("\");\r\n\t\t\tspc.Add(\"@");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append("\", System.Data.SqlDbType.");

實作SQL -> C# Class Code工具的問題

                strbSave.Append(sc.DbType.ToString());

實作SQL -> C# Class Code工具的問題

                if ( sc.Length > 0 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbSave.Append(", ");

實作SQL -> C# Class Code工具的問題

                    strbSave.Append(sc.Length);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append(");\r\n\t\t\tspc[\"@");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append("\"].Value = m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append(";\r\n\t\t\tbSet");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSave.Append(" = false;\r\n\t\t}\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSave.Append("\t\tif( spc.Count > 0 )\r\n\t\t{\r\n\t\t\tspc.Add(\"@");

實作SQL -> C# Class Code工具的問題

            strbSave.Append(m_SqlFields.Identity.Name);

實作SQL -> C# Class Code工具的問題

            strbSave.Append("\", System.Data.SqlDbType.");

實作SQL -> C# Class Code工具的問題

            strbSave.Append(m_SqlFields.Identity.DbType.ToString());

實作SQL -> C# Class Code工具的問題

            strbSave.Append(");\r\n\t\t\tspc[\"@");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSave.Append("\"].Value = m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSave.Append(";\r\n\t\t\tstrbSql.Append(\" Where ([");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSave.Append("] = @");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSave.Append(")\");\r\n\t\t\tstrbSql.Replace(\" Set,\", \" Set \");\r\n\t\t\tSqlCmd.CommandText = strbSql.ToString();\r\n\t\t\tSqlCmd.Connection = GetSqlConnection();\r\n\t\t\tSqlCmd.ExecuteNonQuery();\r\n\t\t\tSqlCmd.Connection.Close();\r\n\t\t\tSqlCmd.Parameters.Clear();\r\n\t\t\tm_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSave.Append(" = iIdentity;\r\n\t\t}\r\n\t}\r\n");

實作SQL -> C# Class Code工具的問題

            return strbSave.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string GetSaveAsFunction(SqlField [] fields)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            StringBuilder strbSaveAs = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbSaveAs.Append("\t/// <summary>\r\n\t/// Save the datas of current row to the new data row.\r\n\t/// </summary>\r\n\tpublic void SaveAs()\r\n\t{\r\n\t\tSystem.Data.SqlClient.SqlParameterCollection spc;\r\n\t\tspc = SqlCmd.Parameters;\r\n\t\tSystem.Text.StringBuilder strbValues;\r\n\t\tstrbValues = new System.Text.StringBuilder();\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append("\r\n\t\tif ( bSet");

實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append(strName);

實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append(" )\r\n\t\t{\r\n\t\t\tstrbValues.Append(\", @");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append("\");\r\n\t\t\tspc.Add(\"@");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append("\", System.Data.SqlDbType.");

實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append(sc.DbType.ToString());

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                    strbSaveAs.Append(", ");

實作SQL -> C# Class Code工具的問題

                    strbSaveAs.Append(sc.Length);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append(");\r\n\t\t\tspc[\"@");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append("\"].Value = m_");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append(";\r\n\t\t\tbSet");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbSaveAs.Append(" = false;\r\n\t\t}");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbSaveAs.Append(@"

實作SQL -> C# Class Code工具的問題

        string strFields, strValues;

實作SQL -> C# Class Code工具的問題

        if ( strbValues.Length > 3 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            SqlCmd.Connection = GetSqlConnection();

實作SQL -> C# Class Code工具的問題

            strValues = strbValues.ToString().Substring(2);

實作SQL -> C# Class Code工具的問題

            strFields = strbValues.Replace("", @"", ""], ["").ToString();

實作SQL -> C# Class Code工具的問題

            strFields = strFields.Substring(3);

實作SQL -> C# Class Code工具的問題

            SqlCmd.CommandText = ""Insert Into ["" + m_TableName + ""] ("" + strFields

實作SQL -> C# Class Code工具的問題

                + ""]) Values("" + strValues + "")\r\n Select SCOPE_IDENTITY() AS [SCOPE_IDENTITY]"";

實作SQL -> C# Class Code工具的問題

            object obj = SqlCmd.ExecuteScalar();

實作SQL -> C# Class Code工具的問題

            if ( obj == null || obj is System.DBNull )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                throw new Exception(""Save item failed."");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            m_" + m_SqlFields.Identity.Name + @" = System.Convert.ToInt32(obj);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            return strbSaveAs.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string GetCopyToFunction(SqlField [] fields)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            StringBuilder strbCopyTo = new StringBuilder();

實作SQL -> C# Class Code工具的問題

            strbCopyTo.Append("\t/// <summary>\r\n\t/// Copy the row to destination row which ID equal iDesID.\r\n\t/// </summary>\r\n\t/// <param name=\"iDesID\"></param>\r\n\tpublic void CopyTo(int iDesID)\r\n\t{\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

                strbCopyTo.Append("\t\tbSet");

實作SQL -> C# Class Code工具的問題

                strbCopyTo.Append((fields[i]).Name);

實作SQL -> C# Class Code工具的問題

                strbCopyTo.Append("\t= true;\r\n");

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strbCopyTo.Append("\r\n\t\tSave(iDesID);\r\n\t}");

實作SQL -> C# Class Code工具的問題

            return strbCopyTo.ToString();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        private string GetExtraFunctions()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            string strCode = @"

實作SQL -> C# Class Code工具的問題

    private static int GetValue(string strSql)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        System.Data.SqlClient.SqlCommand SqlCmd;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        object obj = SqlCmd.ExecuteScalar();

實作SQL -> C# Class Code工具的問題

        SqlCmd.Connection.Close();

實作SQL -> C# Class Code工具的問題

        if ( obj == null || obj is System.DBNull )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            return -1;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        return (int)obj;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    public static int GetMaxID()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        string strSql = ""Select Max(ID) From [{0}]"";

實作SQL -> C# Class Code工具的問題

        return GetValue(string.Format(strSql, m_TableName));

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    public static bool IsValueExist(string strUnique, string strValue, int iExceptID)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        string strSql = ""Select Count(*) From [{0}] Where ([{1}] = @Value)"";

實作SQL -> C# Class Code工具的問題

        strSql = string.Format(strSql, m_TableName, strUnique);

實作SQL -> C# Class Code工具的問題

        SqlCmd.Parameters.Add(""@Value"", System.Data.SqlDbType.NVarChar).Value = strValue;

實作SQL -> C# Class Code工具的問題

        if ( iExceptID >= 0 )

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            strSql = string.Format(""{0} AND ([" + m_SqlFields.Identity.Name + @"] <> '{1}')"", strSql, iExceptID);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        int iCount = (int)SqlCmd.ExecuteScalar();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        return !(iCount == 0);

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

    public static bool IsValueExist(string strUnique, string strValue)

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        return IsValueExist(strUnique, strValue, -1);

實作SQL -> C# Class Code工具的問題

    }";

實作SQL -> C# Class Code工具的問題

            return strCode;

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

        public string Convert()

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

            return CreateClass().Replace("\r\n", "\n").Replace("\n", "\r\n").Trim();

實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題
實作SQL -> C# Class Code工具的問題

}

實作SQL -> C# Class Code工具的問題

同時我也根據項目需要寫了幾個Sql2Aspx.cs和Sql2AspxCS.cs來生成表單代碼,後面這兩的通用性就更低了,不過都需要SqlField裡的資料來支援轉換生成。這些轉換中也沒有使用CodeDom,而完全使用字元串拼接,甚至直接一段一段的代碼寫裡面,這樣做就是為了需要有更改的時候友善,寫成CodeDom方式那就完蛋了,時間長了要看半天才能找到要在什麼地方做改動。

    關于這種Mapping的好處就是自己對資料庫通路代碼的可控性很強,有問題可以根據自己的需求馬上改,而不用去适應一些并不在目前情況下使用的東西,效率也可以做到最好,同時由于代碼是自動生成,也不會有太多的重複勞動。操作資料庫條目也巨友善,IDE裡能做到Sql

Field的IntelliSence。   

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。