Общий уровень доступа к данным в многослойной архитектуре - PullRequest
0 голосов
/ 18 августа 2011

Мне нужно создать общий слой доступа к данным для использования в моем последнем назначении в Software Engineering, но мой слой доступа к данным, который я создал в настоящее время, может автоматически генерировать оператор SQL CRUD (создание, чтение, обновление и удаление).Мне все еще нужно определить каждую таблицу в моей базе данных, и каждый раз, когда я меняю свою базу данных, мне нужно определить изменения в моем уровне доступа к данным.

Пожалуйста, посмотрите на пример моего кода и скажите мне, как изменить мойкод для улучшения моего уровня доступа:

class sqlConn
{
    //Local
    private String strConn = @"Data Source=.\SQLEXPRESS;" +
        @"AttachDbFilename='D:\JP Stuff\BELGIUM CAMPUS\3de Jaar\SOFTWARE ENGINEERING\ASSIGNMENT\Premier Service Solutions\Premier Service Solutions\DB\db_PSS_1.0.mdf';" +
        @"Integrated Security=True;" +
        @"User Instance=True";
    private SqlConnection conn;

    //Properties
    public SqlConnection Conn
    {
        get { return this.conn = new SqlConnection(this.strConn); }
    }

    //Constructor
    public sqlConn()
    {

    }
}




class sqlFactory : sqlConn
{
    //Constructor
    public sqlFactory()
        : base()
    {

    }

    //Insert Record into database
    public void Create(String[] dbData, List<String> strRow)
    {
        using (SqlConnection sqlCon = this.Conn)
        using (SqlCommand com = new SqlCommand("SELECT * FROM " + dbData[0], sqlCon))
        {
            SqlDataAdapter da = new SqlDataAdapter(com);
            SqlCommandBuilder sqlbuilder = new SqlCommandBuilder(da);

            DataSet ds = new DataSet();
            da.Fill(ds, dbData[0]);

            DataRow dr = ds.Tables[dbData[0]].NewRow();

            for (int i = 0; i < dbData.Count() - 2; i++)
            {
                dr[i + 1] = strRow[i];
            }

            ds.Tables[dbData[0]].Rows.Add(dr);
            da.Update(ds, dbData[0]);
        }
    }
}

 class dbDefinitions : sqlFactory
 {
    public static Dictionary<String, String[]> columns;

    static dbDefinitions()
    {
        columns = new Dictionary<String,String[]>();

        //tblCall Definition
        #region call
        String[] data = new String[]
        { 
            "tblCall", "call_ID_PK", "call_emp_ID_FK", 
            "call_Description", "call_Notes", "call_Start_Time", 
            "call_End_Time", "call_Job_FK"
        };
        columns.Add("call", data);
        #endregion
    }
}

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Это может не полностью ответить на ваш вопрос, но вы можете улучшить этот код несколькими способами.

Композиция против наследования

Во-первых, поймите и примените композицию к наследованию,Композиция - это отношение «имеет», тогда как наследование - это отношение «есть».

Например, если у класса Person есть свойство типа Phone, это его состав.

public class Person 
{
    public Phone Phone {get; set;}
}

Если класс Person происходит от класса Phone, это наследование.

public class Person : Phone
{
}

В вашем коде sqlFactory должен содержать sqlConn вместо того, чтобы наследовать от него.

Композиция дает большую гибкость, особенно потому, что C # не допускает множественное наследование.Подробнее читайте здесь: Предпочитаете ли вы композицию, а не наследование?

Внедрение SQL

Запрещается создавать операторы sql с использованием конкатенации строк, подобной этой.

"SELECT * FROM " + dbData[0]

Это создает потенциальную дыру в безопасности, которая допускает атаки SQL-инъекций.Вы должны всегда использовать параметризованные запросы, чтобы предотвратить это.

Чтение Совет / хитрость: защита от атак с использованием SQL-инъекций для понимания атак с использованием SQL-инъекций и способов их предотвращения.

Соглашение о кодировании

Практически общепринятым соглашением для именования классов среди разработчиков на C # является использование PascalCase, где первая буква каждого слова в имени класса пишется с заглавной буквы.Ваши классы будут SqlFactory, SqlConn и DbDefinition.

В этом руководстве приведены довольно часто используемые соглашения: Документ C # Стандарты кодирования

1 голос
/ 18 августа 2011

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

0 голосов
/ 18 августа 2011

Попробуйте определить информацию о схеме базы данных в XML-файле и прочитайте ее, чтобы создать операции CRUD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...