-
Notifications
You must be signed in to change notification settings - Fork 1
Создание собственного слоя БД
Для создания собственного слоя БД необходимо создать структуру БД, запустить сервер и настроить СУБД для того, чтобы она могла принимать запросы с приложения. Далее нужно, чтобы приложение распознавало БД и отправляло запросы, а БД, в свою очередь, обрабатывала их.
Примеры реализации БД в можете найти здесь:
https://github.com/dodev/RoadDataCollector/tree/master/Main/DBConnection/DummyDBConnection
https://github.com/dodev/RoadDataCollector/tree/master/Main/DBConnection/SecondDB
Для реализации слоя необходимо создать три интефейса и прописать настройки в файле "config.xml".
В под-проекте DBConnection создайте папку с именем добавляемого слоя + DBConnection. Например, MysqlDBConnection.
В эту папку добавляем три файла формата " .cs": реализации IDBConnection, IDBFactory, IQuery.
IDBConnection - класс, который выполняет всю работу по связи с БД: установление связи, отключение связи, выполнение запросов (https://github.com/dodev/RoadDataCollector/blob/master/Main/DBConnection/IDBConnection.cs).
/// <summary>
/// Интерфейс для работы с БД.
/// Хранит объект связи с БД.
/// </summary>
public interface IDBConnection : IDisposable
{
void Connect ();
void Disconnect ();
/// <summary>
/// Берет информации из query и с ней выполняет запрос к БД
/// </summary>
/// <returns><c>true</c>, if query was executed, <c>false</c> otherwise.</returns>
/// <param name="query">Query.</param>
bool ExecuteQuery (IQuery query);
/// <summary>
/// При ошибке метод вызивается чтобы уточнить проблемой.
/// Метод должен содержать сообщение передано классу БД.
/// </summary>
/// <returns>The last response.</returns>
string GetLastResponse ();
}
IDBFactory аналогичен для всех БД (https://github.com/dodev/RoadDataCollector/blob/master/Main/DBConnection/IDBFactory.cs).
public interface IDBFactory
{
/// <summary>
/// Передает конфигурационный объект фабрику.
/// </summary>
/// <param name="config">Config.</param>
void InitDBLayer (DBConfiguration config);
IDBConnection CreateConnection ();
/// <summary>
/// Дает имя класса адаптера для каждого IDevice.
/// </summary>
/// <param name="deviceName">the id of the device</param>
/// <returns>The adapters.</returns>
string GetAdapterTypeName (string deviceId);
}
Поэтому реализовать ее просто. Можно воспользоваться примерами, заменив только имена классов.
Для реализации IQuery нужно хорошо продумать о том, какая информация будет возвращаться этим интерфейсом и как в ней все будет заполняться. В данном приложении есть много примеров реализации: https://github.com/dodev/RoadDataCollector/blob/master/Main/DBConnection/DummyDBConnection/DummyQuery.cs
/// <summary>
/// Пример реализации IQuery для СУБД DummyDB (текстовой файл)
/// Генерируется строка содержащая запрос на вставки в БД
/// используя StringBuilder.
/// </summary>
public class DummyQuery : IQuery
{
string table;
IEnumerable<string> attributes;
IEnumerable<string> values;
/// <summary>
/// Конструктор может имет любую структуру, т.к. он не включен в интерфейса IQuery
/// Используйте его для добавления информации в объекте
/// </summary>
/// <param name="table">Table.</param>
/// <param name="attributes">Attributes.</param>
/// <param name="values">Values.</param>
public DummyQuery (string table, IEnumerable<string> attributes, IEnumerable<string> values)
{
this.table = table;
this.attributes = attributes;
this.values = values;
}
#region IQuery implementation
public object GetQueryData ()
{
StringBuilder sb = new StringBuilder ();
sb.Append ("INSERT INTO ");
sb.Append (table);
// перечисляем атрибуты
sb.Append (" (");
foreach (string attr in attributes)
sb.Append (attr + ", ");
sb.Remove (sb.Length - 2, 2); // удаляем послдные ", "
// перечисляем значения
sb.Append (") VALUES (");
foreach (string val in values)
sb.Append (val + ", ");
sb.Remove (sb.Length - 2, 2); // удаляем послдные ", "
sb.Append (")");
return sb.ToString ();
}
#endregion
}
https://github.com/dodev/RoadDataCollector/blob/master/Main/DBConnection/SecondDB/SecondDBQuery.cs
public class SecondDBQuery : IQuery
{
IEnumerable<string> values;
public SecondDBQuery (IEnumerable<string> values)
{
this.values = values;
}
#region IQuery implementation
public object GetQueryData ()
{
StringBuilder sb = new StringBuilder ();
sb.Append ("[");
foreach (string val in values)
sb.Append (val + ",");
sb.Remove (sb.Length - 1,1);
sb.Append ("]");
return sb.ToString ();
}
#endregion
}
https://github.com/dodev/RoadDataCollector/blob/master/Main/DBConnection/SecondDB/SecondDBQuery.cs
public class SecondDBQuery : IQuery
{
IEnumerable<string> values;
public SecondDBQuery (IEnumerable<string> values)
{
this.values = values;
}
#region IQuery implementation
public object GetQueryData ()
{
StringBuilder sb = new StringBuilder ();
sb.Append ("[");
foreach (string val in values)
sb.Append (val + ",");
sb.Remove (sb.Length - 1,1);
sb.Append ("]");
return sb.ToString ();
}
#endregion
}
В файле "config.xml" найдите тэг ArrayOfDBConfiguration. Внутри этого тэга необходимо прописать нужные настройки для созданной БД. https://github.com/dodev/RoadDataCollector/blob/master/Main/Main/config.xml#L13
<ArrayOfDBConfiguration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DBConfiguration>
<Address>test</Address>
<Name>dummy_db</Name>
<User>dodo</User>
<Password>dodo</Password>
<Assembly>DBConnection</Assembly>
<Namespace>DBConnection</Namespace>
<FactoryType>DummyDBFactory</FactoryType>
<SerializedAdapters>
<string>dummy_device</string>
<string>DummyDeviceDummyDBAdapter</string>
<string>clock_device</string>
<string>ClockDeviceDummyDBAdapter</string>
</SerializedAdapters>
</DBConfiguration>
<DBConfiguration>
<Address>test</Address>
<Name>dummy_db</Name>
<User>dodo</User>
<Password>dodo</Password>
<Assembly>DBConnection</Assembly>
<Namespace>DBConnection</Namespace>
<FactoryType>SecondDBFactory</FactoryType>
<SerializedAdapters>
<string>dummy_device</string>
<string>DummyDeviceSecondDBAdapter</string>
<string>clock_device</string>
<string>ClockDeviceSecondDBAdapter</string>
</SerializedAdapters>
</DBConfiguration>
<!--<DBConfiguration>
<Address>Server=.\SQLExpress;AttachDbFilename=|DataDirectory|\localDB\LocalDB.mdf;Database=RDC_LDBC;Trusted_Connection=Yes;</Address>
<Assembly>DBConnection</Assembly>
<Namespace>DBConnection</Namespace>
<FactoryType>localDBFactory</FactoryType>
<SerializedAdapters>
<string>dummy_device</string>
<string>DummyDeviceLocalDBAdapter</string>
</SerializedAdapters>
</DBConfiguration>-->
</ArrayOfDBConfiguration>
Каждый тэг DBConfiguration представляет собой конфигурации одного слоя БД. Подробнее рассмотрим поля этого тэга. Поля Adress, Name, User, Password - поля используемые для соединения с БД.
- Address - адрес сервера.
- Nme - имя БД в СУБД.
- User - имя пользователя.
- Password - пароль для пользователя.
Поля Assembly, Namespace, FactoryTape - используются для загрузки фабрики данного слоя.
- Assembly - сборка.
- Namespace - namespace.
- FactoryTape - имя класса фабрики.
Необходимо прописать адаптеры для этой БД в тэге SerializedAdapters (см. https://github.com/dodev/RoadDataCollector/wiki/%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0#3-----configxml).
Настройки каждого адаптера состоят из двух строк:
-
в первой строчке внутри тэга string пишется уникальный идентификатор устройства, который был присвоен ему ранее внутри тэга DeviceConfiguration
-
во второй строчке внутри тэга string пишется имя адаптера для данной БД и для данного устройства.
Например (https://github.com/dodev/RoadDataCollector/blob/master/Main/Main/config.xml#L22)
<SerializedAdapters>
<string>dummy_device</string>
<string>DummyDeviceDummyDBAdapter</string>
<string>clock_device</string>
<string>ClockDeviceDummyDBAdapter</string>
</SerializedAdapters>
О создании адаптеров более подробно можно прочитать здесь -> https://github.com/dodev/RoadDataCollector/wiki/%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0#2-------istorageadapter
Все необходимые шаги выполнены. Сохраните файл и запустите приложение. Удачной работы