Базы Данных Класса, Создатель


Обзор

Я написал класс, который будет создавать код C#. Выход один .файл CS для каждой таблицы в базе данных по умолчанию (базы данных определяется в интернете.файл config). Я ищу код комментарий на этот класс в покое, не на сгенерированный код. Этот DatabaseClassCreator класс использует DatabaseAccess класс для некоторых из его базы данных Access. В DatabaseAccess класса можно увидеть здесь , как я прошу код обзор этого класса, а также. Если вы не заинтересованы в том, чтобы DatabaseAccess класса, есть один статический метод ExecSQL, который возвращает один объект DataTable с результатами передаются в SQL.

Два Примечания:

  1. Он был разработан и используется для ASP.NET проект, который является причиной маркированный список.
  2. Этот класс должен работать в C# .Объем 2 среды, поэтому все это больше современные будет мне интересно, но обратите внимание на ваш ответ, если замечания/отзывы требуют более новые .Net версии.

/// <summary>
/// This class will create c# class files to access spesific
/// tables in a database.
/// </summary>
public static class DatabaseClassCreator
{
    /// <summary>
    /// Create class files for all the non-system tables in the current
    /// default database.
    /// </summary>
    /// <param name="OutputPath">The output location for the class files. This
    /// is a fully qualified path.</param>
    public static void CreateAllTables(string OutputPath)
    {
        BulletedList bl = new BulletedList();
        CreateAllTables(bl, OutputPath);
    }
    /// <summary>
    /// Create class files for all the non-system tables in the current
    /// default database.
    /// </summary>
    /// <param name="StatusBulletList">A BulletedList where status information can be
    /// added to.</param>
    /// <param name="OutputPath">The output location for the class files. This
    /// is a fully qualified path.</param>
    public static void CreateAllTables(BulletedList StatusBulletList, string OutputPath)
    {
        DataTable table = ListDatabaseTables();

        if (table == null)
        {
            ListItem liRowName = new ListItem();
            liRowName.Text = "Database Error";
            StatusBulletList.Items.Add(liRowName);
            return;
        }

        // Loop through the tables and create the accessor classes
        foreach (DataRow row in table.Rows)
        {
            if (row["TABLE_NAME"].ToString() != "syssegments" && row["TABLE_NAME"].ToString() != "sysconstraints")
            {
                ListItem liRowName = new ListItem();
                liRowName.Text = row["TABLE_NAME"].ToString();
                StatusBulletList.Items.Add(liRowName);
                CreateSingleTable(StatusBulletList, OutputPath, row["TABLE_NAME"].ToString());
            }
        }
    }

    /// <summary>
    /// Returns a DataTable containing all the table names in the default
    /// database.
    /// </summary>
    /// <returns>DataTable listing the table names.</returns>
    public static DataTable ListDatabaseTables()
    {
        string SQL;
        DataTable table = null;

        // Grab all the table names from the current database
        SQL = "SELECT TABLE_NAME FROM information_schema.tables WHERE NOT TABLE_NAME='sysdiagrams' AND TABLE_SCHEMA = 'dbo' AND TABLE_TYPE= 'BASE TABLE'";
        table = DatabaseAccess.ExecSQL(SQL);

        return table;
    }

    /// <summary>
    /// Output a class file for the requested table in the current default database
    /// </summary>
    /// <param name="OutputPath">The output location for the class files. This
    /// is a fully qualified path.</param>
    /// <param name="TableName">The table name</param>
    public static void CreateSingleTable(string OutputPath, String TableName)
    {
        BulletedList bl = new BulletedList();
        CreateSingleTable(bl, OutputPath, TableName);
    }
    /// <summary>
    /// Output a class file for the requested table in the current default database
    /// </summary>
    /// <param name="OutputPath">The output location for the class files. This
    /// is a fully qualified path.</param>
    /// <param name="StatusBulletList">A BulletedList where status information can be
    /// added to.</param>
    /// <param name="TableName">The table name</param>
    public static void CreateSingleTable(BulletedList StatusBulletList, string OutputPath, String TableName)
    {
        string SQL;
        IDataReader reader = null;
        DataTable schema = null;
        List<TableFieldInfo> fields = new List<TableFieldInfo>();

        // Grab the current table
        SQL = "SELECT TOP 1 * FROM " + TableName;
        reader = ExecSQLReader("", SQL);

        // Get the table schema
        if (reader != null)
            schema = reader.GetSchemaTable();

        // Grab the field information we need
        if (schema != null)
        {
            foreach (DataRow myField in schema.Rows)
            {
                TableFieldInfo f = new TableFieldInfo();
                f.name = myField["ColumnName"].ToString();
                f.type = myField["ProviderSpecificDataType"].ToString();
                f.allowNull = bool.Parse(myField["AllowDBNull"].ToString());
                f.readOnly = bool.Parse(myField["IsReadOnly"].ToString());
                f.maxSize = int.Parse(myField["ColumnSize"].ToString());
                fields.Add(f);

                string info = "---> " + f.name + " (" + f.type + ")";
                if (f.readOnly)
                    info += " (RO)";
                else
                    info += " (RW)";
                if (f.allowNull)
                    info += " (Null)";
                StatusBulletList.Items.Add(new ListItem(info));
            }
        }
        else
        {
            ListItem liRowName = new ListItem();
            liRowName.Text = "Schema Error";
            StatusBulletList.Items.Add(liRowName);
        }

        // Clean the table name for the filesystem and c# names
        TableName = TableName.Replace('(', '_').Replace(')', '_').Replace('~', '_'); ;

        // Open the file
        string filename = OutputPath + "\\DBT_" + TableName + ".cs";
        StreamWriter sw = new StreamWriter(filename);

        // Add File Comments
        sw.WriteLine("// ");
        sw.WriteLine("// This file is auto generated based on the database");
        sw.WriteLine("// DO NOT MODIFY THIS FILE, EVER");
        sw.WriteLine("// Inherit this class and make changes there");
        sw.WriteLine("// DO NOT MODIFY THIS FILE, CHANGES WILL BE LOST");
        sw.WriteLine("// ");
        sw.WriteLine("");

        // Add Using statements
        sw.WriteLine("using System;");
        sw.WriteLine("using System.Collections.Generic;");
        sw.WriteLine("using System.Data;");
        sw.WriteLine("using System.Data.SqlClient;");
        sw.WriteLine("");

        // Open the class
        sw.WriteLine("public class DBT" + TableName + " : DatabaseAccess");
        sw.WriteLine("{");

        // Add accessors
        foreach (TableFieldInfo f in fields)
        {
            if (getType(f.type) == "int")
                sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = -1;");
            else if (getType(f.type) == "float")
                sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = -1;");
            else if (getType(f.type) == "DateTime")
                sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = new DateTime(1753, 1, 1);");
            else if (getType(f.type) == "byte[]")
                sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = new byte[1];");
            else
                sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + ";");

            sw.WriteLine("\tpublic " + getType(f.type) + " " + f.name);
            sw.WriteLine("\t{");
            sw.WriteLine("\t\tget { return _" + f.name + "; }");
            string protect = "";
            if (f.readOnly)
                protect = "protected ";

            if (f.maxSize == 0 || getType(f.type) != "string")
                sw.WriteLine("\t\t" + protect + "set { _" + f.name + " = value; }");
            else
            {
                sw.WriteLine("\t\t" + protect + "set");
                sw.WriteLine("\t\t{");
                sw.WriteLine("\t\t\tif(value.Length <= " + f.maxSize.ToString() + ")");
                sw.WriteLine("\t\t\t\t_" + f.name + " = value;");
                sw.WriteLine("\t\t\telse");
                sw.WriteLine("\t\t\t\t_" + f.name + " = value.Substring(0, " + (f.maxSize).ToString() + ");");
                sw.WriteLine("\t\t}");
            }
            sw.WriteLine("\t}");
            sw.WriteLine("");
        }

        // Add the Constructors
        sw.WriteLine("\tprivate string _connectionString = \"\";");
        sw.WriteLine("\tpublic DBT" + TableName + "()");
        sw.WriteLine("\t{");
        sw.WriteLine("\t}");
        sw.WriteLine("");
        sw.WriteLine("\tpublic DBT" + TableName + "(string ConnectionString)");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\t_connectionString = ConnectionString;");
        sw.WriteLine("\t}");
        sw.WriteLine("");
        sw.WriteLine("\tpublic DBT" + TableName + "(int itemID)");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\tthis.Select(itemID);");
        sw.WriteLine("\t}");
        sw.WriteLine("");
        sw.WriteLine("\tpublic DBT" + TableName + "(string ConnectionString, int itemID)");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\t_connectionString = ConnectionString;");
        sw.WriteLine("\t\tthis.Select(itemID);");
        sw.WriteLine("\t}");
        sw.WriteLine("");

        // Add the insert method
        StatusBulletList.Items.Add(new ListItem("<--- public void Insert()"));
        sw.WriteLine("\tpublic void Insert()");
        sw.WriteLine("\t{");
        foreach (TableFieldInfo f in fields)
        {
            if (f.readOnly == true)
            {
                sw.WriteLine("\t\tif(_" + f.name + " != -1)");
                sw.WriteLine("\t\t\treturn;");
                sw.WriteLine("");
            }
        }
        sw.Write("\t\tstring SQL = \"INSERT INTO " + TableName + " (");
        int count = fields.Count;
        foreach (TableFieldInfo f in fields)
        {
            count--;
            if (f.readOnly != true)
            {
                string fieldName = f.name;
                if (fieldName.ToUpper() == "DEFAULT")
                    fieldName = "[" + fieldName + "]";

                if (count != 0)
                    sw.Write(fieldName + ", ");
                else
                    sw.Write(fieldName);
            }
        }
        sw.Write(") VALUES (");
        count = fields.Count;
        foreach (TableFieldInfo f in fields)
        {
            count--;
            if (f.readOnly != true)
            {
                if (count != 0)
                    sw.Write("@" + f.name + ", ");
                else
                    sw.Write("@" + f.name);
            }
        }
        sw.WriteLine("); SELECT SCOPE_IDENTITY() AS ID;\";");
        sw.WriteLine("\t\tList<SqlParameter> parms = new List<SqlParameter>();");
        sw.WriteLine("\t\tDataTable table = null;");
        sw.WriteLine("");
        foreach (TableFieldInfo f in fields)
        {
            if (f.readOnly != true)
            {
                if (getType(f.type) == "DateTime")
                {
                    sw.WriteLine("\t\tif(_" + f.name + " != new DateTime(1753, 1, 1))");
                    sw.WriteLine("\t\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", _" + f.name + "));");
                    sw.WriteLine("\t\telse");
                    sw.WriteLine("\t\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", null));");
                }
                else
                {
                    sw.WriteLine("\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", _" + f.name + "));");
                }
            }
        }
        sw.WriteLine("");
        sw.WriteLine("\t\tif (_connectionString == \"\")");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\ttable = ExecSQL(SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t\telse");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\ttable = ExecSQL(_connectionString, SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t\tif (table != null && table.Rows.Count == 1)");
        sw.WriteLine("\t\t{");
        foreach (TableFieldInfo f in fields)
        {
            if (f.readOnly == true)
                sw.WriteLine("\t\t\t_" + f.name + " = int.Parse(table.Rows[0][\"ID\"].ToString());");
        }
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t}");
        sw.WriteLine("");


        // Add the update method
        StatusBulletList.Items.Add(new ListItem("<--- public void Update()"));
        sw.WriteLine("\tpublic void Update()");
        sw.WriteLine("\t{");
        sw.Write("\t\tstring SQL = \"UPDATE " + TableName + " SET ");
        count = fields.Count;
        foreach (TableFieldInfo f in fields)
        {
            count--;
            if (f.readOnly != true)
            {
                string fieldName = f.name;
                if (fieldName.ToUpper() == "DEFAULT")
                    fieldName = "[" + fieldName + "]";

                if (count != 0)
                    sw.Write(fieldName + "=@" + f.name + ", ");
                else
                    sw.Write(fieldName + "=@" + f.name + " ");
            }
        }
        sw.Write("WHERE ");
        foreach (TableFieldInfo f in fields)
        {
            string fieldName = f.name;
            if (fieldName.ToUpper() == "DEFAULT")
                fieldName = "[" + fieldName + "]";

            if (f.readOnly == true)
                sw.Write(fieldName + "=@" + f.name);
        }
        sw.WriteLine(";\";");
        sw.WriteLine("\t\tList<SqlParameter> parms = new List<SqlParameter>();");
        sw.WriteLine("");
        foreach (TableFieldInfo f in fields)
        {
            if (getType(f.type) == "DateTime")
            {
                sw.WriteLine("\t\tif(_" + f.name + " != new DateTime(1753, 1, 1))");
                sw.WriteLine("\t\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", _" + f.name + "));");
                sw.WriteLine("\t\telse");
                sw.WriteLine("\t\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", null));");
            }
            else
            {
                sw.WriteLine("\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", _" + f.name + "));");
            }
        }
        sw.WriteLine("");
        sw.WriteLine("\t\tif (_connectionString == \"\")");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\tExecSQL(SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t\telse");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\tExecSQL(_connectionString, SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t}");
        sw.WriteLine("");

        // Add the select method
        bool CanSelect = false;
        foreach (TableFieldInfo f in fields)
        {
            if (f.readOnly == true && CanSelect == false)
            {
                StatusBulletList.Items.Add(new ListItem("<--- public bool Select(" + getType(f.type) + " " + f.name + ")"));
                sw.WriteLine("\tpublic bool Select(" + getType(f.type) + " " + f.name + ")");
                CanSelect = true;
            }
        }
        if (CanSelect == true)
        {
            sw.WriteLine("\t{");
            foreach (TableFieldInfo f in fields)
            {
                if (f.readOnly == true)
                    sw.WriteLine("\t\tstring SQL = \"SELECT * FROM " + TableName + " WHERE " + f.name + "=@" + f.name + "\";");
            }
            sw.WriteLine("\t\tList<SqlParameter> parms = new List<SqlParameter>();");
            sw.WriteLine("");
            foreach (TableFieldInfo f in fields)
            {
                if (f.readOnly == true)
                {
                    sw.WriteLine("\t\tSqlParameter parm" + f.name + " = new SqlParameter(\"@" + f.name + "\", " + f.name + ");");
                    sw.WriteLine("\t\tparms.Add(parm" + f.name + ");");
                }
            }
            sw.WriteLine("");
            sw.WriteLine("\t\tDataTable table = null;");
            sw.WriteLine("\t\tif (_connectionString == \"\")");
            sw.WriteLine("\t\t{");
            sw.WriteLine("\t\t\ttable = ExecSQL(SQL, parms);");
            sw.WriteLine("\t\t}");
            sw.WriteLine("\t\telse");
            sw.WriteLine("\t\t{");
            sw.WriteLine("\t\t\ttable = ExecSQL(_connectionString, SQL, parms);");
            sw.WriteLine("\t\t}");
            sw.WriteLine("\t\tif (table != null && table.Rows.Count == 1)");
            sw.WriteLine("\t\t{");
            sw.WriteLine("\t\t\tDataRow row = table.Rows[0];");
            sw.WriteLine("");
            foreach (TableFieldInfo f in fields)
            {
                if (getType(f.type) == "string")
                    sw.WriteLine("\t\t\t_" + f.name + " = row[\"" + f.name + "\"].ToString();");
                else if (getType(f.type) == "int")
                {
                    //sw.WriteLine("\t\t\t_" + f.name + " = int.Parse(row[\"" + f.name + "\"].ToString());");
                    sw.WriteLine("\t\t\tif(!int.TryParse(row[\"" + f.name + "\"].ToString(), out _" + f.name + "))");
                    sw.WriteLine("\t\t\t\t_" + f.name + " = -1;");
                }
                else if (getType(f.type) == "float")
                {
                    //sw.WriteLine("\t\t\t_" + f.name + " = int.Parse(row[\"" + f.name + "\"].ToString());");
                    sw.WriteLine("\t\t\tif(!float.TryParse(row[\"" + f.name + "\"].ToString(), out _" + f.name + "))");
                    sw.WriteLine("\t\t\t\t_" + f.name + " = -1;");
                }
                else if (getType(f.type) == "bool")
                {
                    //sw.WriteLine("\t\t\t_" + f.name + " = int.Parse(row[\"" + f.name + "\"].ToString());");
                    sw.WriteLine("\t\t\tif(!bool.TryParse(row[\"" + f.name + "\"].ToString(), out _" + f.name + "))");
                    sw.WriteLine("\t\t\t\t_" + f.name + " = false;");
                }
                else if (getType(f.type) == "DateTime")
                {
                    sw.WriteLine("\t\t\tif(row[\"" + f.name + "\"].ToString() != \"\")");
                    sw.WriteLine("\t\t\t\tDateTime.TryParse(row[\"" + f.name + "\"].ToString(), out _" + f.name + ");");
                    sw.WriteLine("\t\t\telse");
                    sw.WriteLine("\t\t\t\t_" + f.name + " = new DateTime(1753, 1, 1);");
                }
                else if (getType(f.type) == "byte[]")
                {
                    sw.WriteLine("\t\t\tif (row[\"Img\"].ToString() != \"\")");
                    sw.WriteLine("\t\t\t\t_" + f.name + " = (byte[])row[\"" + f.name + "\"];");
                }
                else
                    sw.WriteLine("\t\t\t//_" + f.name + " = row[\"" + f.name + "\"];");
            }
            sw.WriteLine("\t\t\treturn true;");
            sw.WriteLine("\t\t}");
            sw.WriteLine("\t\telse");
            sw.WriteLine("\t\t{");
            sw.WriteLine("\t\t\treturn false;");
            sw.WriteLine("\t\t}");
            sw.WriteLine("\t}");
            sw.WriteLine("");
        }

        // Add the SelectWhere method
        StatusBulletList.Items.Add(new ListItem("<--- public static DataTable SelectWhere(string WhereClause, List<SqlParameter> parms)"));
        sw.WriteLine("\tpublic static DataTable SelectWhere(string WhereClause, List<SqlParameter> parms)");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\treturn SelectWhere(WhereClause, parms, \"\");");
        sw.WriteLine("\t}");
        sw.WriteLine("\tpublic static DataTable SelectWhere(string WhereClause, List<SqlParameter> parms, string connectionString)");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\tstring SQL = \"SELECT * FROM " + TableName + " WHERE \" + WhereClause;");
        sw.WriteLine("");
        sw.WriteLine("\t\tDataTable table = null;");
        sw.WriteLine("\t\tif (connectionString == \"\")");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\ttable = ExecSQL(SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t\telse");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\ttable = ExecSQL(connectionString, SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t\treturn table;");
        sw.WriteLine("\t}");
        sw.WriteLine("");


        // Add the delete method
        if (CanSelect == true)
        {
            StatusBulletList.Items.Add(new ListItem("<--- public void Delete()"));
            sw.WriteLine("\tpublic void Delete()");
            sw.WriteLine("\t{");
            foreach (TableFieldInfo f in fields)
            {
                if (f.readOnly == true)
                {
                    sw.WriteLine("\t\tif(_" + f.name + " == -1)");
                    sw.WriteLine("\t\t\treturn;");
                    sw.WriteLine("");
                }
            }
            foreach (TableFieldInfo f in fields)
            {
                if (f.readOnly == true)
                    sw.WriteLine("\t\tstring SQL = \"DELETE FROM " + TableName + " WHERE " + f.name + "=@" + f.name + "\";");
            }
            sw.WriteLine("\t\tList<SqlParameter> parms = new List<SqlParameter>();");
            sw.WriteLine("");
            foreach (TableFieldInfo f in fields)
            {
                if (f.readOnly == true)
                {
                    sw.WriteLine("\t\tparms.Add(new SqlParameter(\"@" + f.name + "\", " + f.name + "));");
                }
            }
            sw.WriteLine("");
            sw.WriteLine("\t\tif (_connectionString == \"\")");
            sw.WriteLine("\t\t{");
            sw.WriteLine("\t\t\tExecSQL(SQL, parms);");
            sw.WriteLine("\t\t}");
            sw.WriteLine("\t\telse");
            sw.WriteLine("\t\t{");
            sw.WriteLine("\t\t\tExecSQL(_connectionString, SQL, parms);");
            sw.WriteLine("\t\t}");
            sw.WriteLine("\t}");
            sw.WriteLine("");
        }

        // Add the Table method
        StatusBulletList.Items.Add(new ListItem("<--- public static DataTable Table()"));
        sw.WriteLine("\tpublic static DataTable Table()");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\treturn Table(\"\");");
        sw.WriteLine("\t}");
        sw.WriteLine("\tpublic static DataTable Table(string connectionString)");
        sw.WriteLine("\t{");
        sw.WriteLine("\t\tstring SQL = \"SELECT * FROM " + TableName + ";\";");
        sw.WriteLine("\t\tList<SqlParameter> parms = new List<SqlParameter>();");
        sw.WriteLine("");
        sw.WriteLine("\t\tif (connectionString == \"\")");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\treturn ExecSQL(SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t\telse");
        sw.WriteLine("\t\t{");
        sw.WriteLine("\t\t\treturn ExecSQL(connectionString, SQL, parms);");
        sw.WriteLine("\t\t}");
        sw.WriteLine("\t}");

        // Close the class
        sw.WriteLine("}");

        // Close the file
        sw.Close();
    }

    public static IDataReader ExecSQLReader(string DatabaseName, string SQL)
    {
        // Database access variables
        Database database = null;
        DbCommand command = null;
        IDataReader reader = null;

        try
        {
            if (DatabaseName != "")
                database = DatabaseFactory.CreateDatabase(DatabaseName);
            else
                database = DatabaseFactory.CreateDatabase();
            command = database.GetSqlStringCommand(SQL);
            reader = database.ExecuteReader(command);
        }
        catch (Exception e)
        {
            // Remove stupid warning
            Exception x = e;
            e = x;
        }

        return reader;
    }

    private static string getType(string DBType)
    {
        string ret = DBType;

        if (DBType == "System.Data.SqlTypes.SqlString")
            ret = "string";
        else if (DBType == "System.Data.SqlTypes.SqlInt16")
            ret = "Int16";
        else if (DBType == "System.Data.SqlTypes.SqlInt32")
            ret = "int";
        else if (DBType == "System.Data.SqlTypes.SqlFloat")
            ret = "float";
        else if (DBType == "System.Data.SqlTypes.SqlDouble")
            ret = "float";
        else if (DBType == "System.Data.SqlTypes.SqlDecimal")
            ret = "float";
        else if (DBType == "System.Data.SqlTypes.SqlBoolean")
            ret = "bool";
        else if (DBType == "System.Data.SqlTypes.SqlDateTime")
            ret = "DateTime";
        else if (DBType == "System.Data.SqlTypes.SqlByte")
            ret = "byte";
        else if (DBType == "System.Data.SqlTypes.SqlBinary")
            ret = "byte[]";

        return ret;
    }

    private class TableFieldInfo
    {
        public string name;
        public string type;
        public bool allowNull;
        public bool readOnly;
        public int maxSize;
    }
}


3482
8
задан 24 мая 2011 в 11:05 Источник Поделиться
Комментарии
1 ответ

1) Как уже упоминалось Т4 может быть лучшим решением, хотя я не уверен, будет ли он доступен для предыдущих версий против.

2) я хотел бы избежать, используя строковое поле "выходной путь" параметры потоков , как правило, более удобна.

3) отдельные презентации и бизнес-логики кода. Имея маркированный список параметр в таком классе, кажется, совершенно неправильно для меня.

4) я думаю, что вы не должны даже взять этот маркированный список (или что-то подобное) в качестве параметра. Этот журнал сообщения является выход из ваших методов, а не вход, поэтому нет смысла принимать его в качестве параметра. Вернуть его и снять перегрузки метода, которые не нужны.

5) именования - обычные правила ниже верблюд чехол для параметров.

6) определить переменные ближе к своим первым заданием и не присваивают им никакого значения, если это значение будет перезаписано в любом случае. Это в основном о CreateSingleTable способ. ListDatabaseTables также имеет 5 строк кода, вместо максимум 3 нужно.

7) я бы ListDatabaseTables() метод более строго типизированным. Возвращает объект DataTable дает мне абсолютно никакой идеи, как использовать его.

8) я предпочитаю писать такие конструкции:

            if (f.readOnly)
info += " (RO)";
else
info += " (RW)";

как:

info += f.readOnly ? " (RO)" : " (RW)";

Это ММО показывает более четко, что вы собираетесь добавить что-то , чтобы информация в любом случае и этого что-то зависит от isReadonly значение.

9) я бы заменил это:

string info = "---> " + f.name + " (" + f.type + ")";
if (f.readOnly)
info += " (RO)";
else
info += " (RW)";
if (f.allowNull)
info += " (Null)";

с этого:

string info = string.Format("---> {0} ({1}) ({2}){3}"
, f.name
, f.type
, f.readOnly? "RO" : "RW"
, f.allowNull ? " (NULL)" : string.Empty);

Это показывает более ясно, какой формат будет информация переменных. Также это имеет только одно назначение, которое лучше, чем делать += на строку несколько раз.

10) ув.Метода WriteLine("// наследовать этот класс и внести изменения там"); я бы предпочел расширение существующего класса вместо наследования. Или, по крайней мере, вы должны разрешить его продления. Для того, чтобы разрешить эту созданных классов, как правило, определяется как частичное.

11) много повторов здесь:

        if (getType(f.type) == "int")
sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = -1;");
else if (getType(f.type) == "float")
sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = -1;");
else if (getType(f.type) == "DateTime")
sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = new DateTime(1753, 1, 1);");
else if (getType(f.type) == "byte[]")
sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + " = new byte[1];");
else
sw.WriteLine("\tprivate " + getType(f.type) + " _" + f.name + ";");

Она должна быть разделена на по меньшей мере двух блоков:

а) написать отдельный + тип
б) определить значение по умолчанию и писать (если таковые имеются)

12) у вас есть новый объект datetime(1753, 1, 1); повторять несколько раз в коде. Я бы рассматривал эту строку в качестве магической строки и я считаю, что она должна быть выделена в постоянное.

13) имя_поля.ToUpper() == "по умолчанию". строку.Равна(...) имеет параметр, чтобы игнорировать регистр.

14) вы просто написали свою собственную строку.Присоединяйтесь к(...) здесь:

    count = fields.Count;
foreach (TableFieldInfo f in fields)
{
count--;
if (f.readOnly != true)
{
if (count != 0)
sw.Write("@" + f.name + ", ");
else
sw.Write("@" + f.name);
}
}

15) если (Ф.толькочтение == истина && в соответствии места использования == ложь) я не думаю, что это тот случай, когда типа bool переменная должна быть по сравнению с истинным или ложным. Я бы предпочел, если (Ф.только для чтения && !В соответствии места использования)

16) не пишите Бога методов/классов и не инстанцировать объекты Богу. CreateSingleTable - это, безусловно, Божий метод - это почти 500 строк кода !!! Хищники придут к вам, как только они покончат с Гото писателей. Сломать этот метод в ~5-10 небольших методов.

17)

private static string getType(string DBType)
{
string ret = DBType;

if (DBType == "System.Data.SqlTypes.SqlString")
ret = "string";
else if (DBType == "System.Data.SqlTypes.SqlInt16")
ret = "Int16";
else if (DBType == "System.Data.SqlTypes.SqlInt32")
ret = "int";
else if (DBType == "System.Data.SqlTypes.SqlFloat")
ret = "float";
else if (DBType == "System.Data.SqlTypes.SqlDouble")
ret = "float";
else if (DBType == "System.Data.SqlTypes.SqlDecimal")
ret = "float";
else if (DBType == "System.Data.SqlTypes.SqlBoolean")
ret = "bool";
else if (DBType == "System.Data.SqlTypes.SqlDateTime")
ret = "DateTime";
else if (DBType == "System.Data.SqlTypes.SqlByte")
ret = "byte";
else if (DBType == "System.Data.SqlTypes.SqlBinary")
ret = "byte[]";

return ret;
}

Вместо таких конструкциях я обычно использую коллекции, которые содержат соответствия между состоянием входного и желаемого результата. Я хотел бы заменить свой 10 условия:

Dictionary<string, string> dbTypeToDotNetTypeMappings =
new Dictionary<string, string>();

dbTypeToDotNetTypeMappings.Add("System.Data.SqlTypes.SqlString", "string");
// ...
dbTypeToDotNetTypeMappings.Add("System.Data.SqlTypes.SqlBinary", "byte[]");

string mappedType;
if (dbTypeToDotNetTypeMappings.TryGetValue(dbType, out mappedType))
return mappedType;

return dbType;

Это показывает более ясно то, что у вас много похожих вход->выход преобразования. Также она позволяет перемещать эти условия в коде, в файл конфигурации например.

18) метод gettype() должна быть более строгой типизацией. Это должно быть тип -> тип отображения вместо строка -> строка.

19)

    catch (Exception e)
{
// Remove stupid warning
Exception x = e;
e = x;
}

Лучший способ избавиться от предупреждения лесозаготовки исключение. В противном случае использование директивы#pragma:

#pragma warning disable 168
catch (Exception e)
#pragma warning restore 168
{

}

10
ответ дан 25 мая 2011 в 09:05 Источник Поделиться