Класс доступа к базе данных


Я ищу какие-либо комментарии или отзывы в моем классе доступ к базе данных. Безопасность и скорость-это две вещи меня больше всего беспокоит.

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

using Microsoft.Practices.EnterpriseLibrary.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;

/// <summary>
/// This is the base class for database access classes. This is the only
/// class that should directly talk to the database. Every class or page
/// that neads to access the database should be refering to this or a
/// derived class.
/// </summary>
public class DatabaseAccess
{
    static string LastDatabaseName = "";
    static Database database = null;
    static int errorCount = 0;

    /// <summary>
    /// Execute a SQL statement on the default database
    /// </summary>
    /// <param name="SQL">The SQL statement to execute</param>
    /// <returns>DataTable of selected results</returns>
    public static DataTable ExecSQL(string SQL)
    {
        List<SqlParameter> Parameters = new List<SqlParameter>();
        return ExecSQL("", SQL, Parameters);
    }
    /// <summary>
    /// Execute a SQL statement on the default database
    /// </summary>
    /// <param name="SQL">The SQL statement to execute</param>
    /// <param name="Parameters">The parameters for the SQL statement</param>
    /// <returns>DataTable of selected results</returns>
    public static DataTable ExecSQL(string SQL, List<SqlParameter> Parameters)
    {
        return ExecSQL("", SQL, Parameters);
    }
    /// <summary>
    /// Execute a SQL statement on the requested database
    /// </summary>
    /// <param name="DatabaseName">The database to execute the SQL on</param>
    /// <param name="SQL">The SQL statement to execute</param>
    /// <returns>DataTable of selected results</returns>
    public static DataTable ExecSQL(string DatabaseName, string SQL)
    {
        List<SqlParameter> Parameters = new List<SqlParameter>();
        return ExecSQL(DatabaseName, SQL, Parameters);
    }
    /// <summary>
    /// Execute a SQL statement on the requested database
    /// </summary>
    /// <param name="DatabaseName">The database to execute the SQL on</param>
    /// <param name="SQL">The SQL statement to execute</param>
    /// <param name="Parameters">The parameters for the SQL statement</param>
    /// <returns>DataTable of selected results</returns>
    public static DataTable ExecSQL(string DatabaseName, string SQL, List<SqlParameter> Parameters)
    {
        // Database access variables
        // Database database = null;
        DbCommand command = null;
        DataTable table = new DataTable();

        if (DatabaseName != LastDatabaseName || database == null)
        {
            if (database != null)
                database = null;

            if (DatabaseName != "")
                database = DatabaseFactory.CreateDatabase(DatabaseName);
            else
                database = DatabaseFactory.CreateDatabase();
        }
        LastDatabaseName = DatabaseName;

        command = database.GetSqlStringCommand(SQL);
        foreach (SqlParameter p in Parameters)
        {
            database.AddInParameter(command, p.ParameterName, p.DbType, p.Value);
        }

        try
        {
            if (!SQL.StartsWith("UPDATE") && !SQL.StartsWith("DELETE"))
                table = database.ExecuteDataSet(command).Tables[0];
            else
                database.ExecuteNonQuery(command);

            errorCount = 0;
        }
        catch (SystemException e)
        {
            errorCount++;

            if (errorCount < 2)
            {
                CMSLog.Exception(e);
                CMSLog.Info(SQL);
                CMSUtil.setSession("Exception", e.Message);
                CMSUtil.setSession("ExceptionExtra", e.StackTrace);
                HttpContext.Current.Response.Redirect("~/CMS/SiteError.aspx");
            }
            else
            {
                HttpContext.Current.AddError(new Exception("Looping DB Error: " + e.Message));
            }
        }

        return table;
    }
}

Простой пример использования класса:

string strValue = "Some Untrusted Value";
List<SqlParameter> parms = new List<SqlParameter>();
parms.Add(new SqlParameter("Value", strValue));

string sql = "SELECT * FROM TableName WHERE FieldName=@Value";
DataTable tblResults = DatabaseAccess.ExecSQL(sql, parms);


8909
5
задан 23 мая 2011 в 11:05 Источник Поделиться
Комментарии
2 ответа

Несколько быстрых идей:


  • Проверка орфографии.

  • Используйте строку.Пустое Вместо "" для улучшения читаемости и производительности.

  • Всегда используйте модификаторы видимости - например, поля отсутствие типичного "частного" сайта. Пример частный статический базе данных = значение null;

  • Пересмотреть свой выбор, чтобы пойти с статическим классом. Статические классы-это знать, за причинение головной боли, таких как проблемы с потоками. Подробнее здесь чтобы начать с, если вы не уверены. Просто убирая все "статические" ключевые слова сделает класс как использовать.

  • Используйте нижний регистр для локальных переменных и параметров. Например: "var-параметры = новый список();"

  • Что касается ошибки-счет-логику я даже не знаю с чего начать... :-/ наверное, все дело может быть сделано каким-то другим способом.

  • Рассмотрим именования ExecSQL - SQL-команды могут быть как вставляет и выбирает, а также другие типы команд, в то время как этот класс относится с выберите

  • Рекомендуется использовать интерфейс IEnumerable вместо списка поскольку вы только повторяя список.

Если вы используете C# 3.0 или позже


  • Используйте ВАР ключевое слово, если целевой тип является избыточным. Пример Списка Параметры = новый список();

4
ответ дан 24 мая 2011 в 01:05 Источник Поделиться

1)

    if (DatabaseName != LastDatabaseName || database == null)
{
if (database != null)
database = null;

if (DatabaseName != "")
database = DatabaseFactory.CreateDatabase(DatabaseName);
else
database = DatabaseFactory.CreateDatabase();
}

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

    if (DatabaseName != LastDatabaseName || database == null)
{
database = DatabaseName != "" ?
DatabaseFactory.CreateDatabase(DatabaseName) :
DatabaseFactory.CreateDatabase();
}

2) определим переменные ближе к первому месту назначения. команда переменная определяется 10 строк кода, прежде чем он назначен, а также имеет определенную ценность, которая не используется вообще.

3) Похоже, ты один вернуться правила. Я лично не думаю, что это правило следует соблюдать (по крайней мере в C#). Например, вы присваиваете объект DataTable переменной в случае выбора и делать ничего больше, только вернув ее. Но я (как хранитель кода) вижу ты его назначения, и я уже читать метод до конца. Просто вернуть объект DataTable прямо здесь - это дать мне понять, что ничего делать с ним потом - это сэкономит мое время.

4) в случае вставка или обновление отчетности вы возвращаете пустой объект DataTable. Я хотел бы вернуть значение null , чтобы отличить его от выберите оператора или DataTable с одной ячейку, которая будет содержать количество обновленных записей (на данный момент ты принимаешь эту информацию).

5) весь код не понятный, что значит, что это не так легко читается, что означает, что это не легко ремонтопригодны. Я бы никогда не догадаться, что для того, чтобы добавить параметр в команду надо искать какой-то способ в базе данных класса.

6) я никогда не ожидал, что такой метод создания баз данных. Это не понятный вообще.

1
ответ дан 24 мая 2011 в 04:05 Источник Поделиться