Skip to content

Создание собственного слоя БД

MarMaishka edited this page Apr 21, 2013 · 7 revisions

Создание собственного слоя БД

Для создания собственного слоя БД необходимо создать структуру БД, запустить сервер и настроить СУБД для того, чтобы она могла принимать запросы с приложения. Далее нужно, чтобы приложение распознавало БД и отправляло запросы, а БД, в свою очередь, обрабатывала их.

Примеры реализации БД в можете найти здесь:

https://github.com/dodev/RoadDataCollector/tree/master/Main/DBConnection/DummyDBConnection

https://github.com/dodev/RoadDataCollector/tree/master/Main/DBConnection/SecondDB

Для реализации слоя необходимо создать три интефейса и прописать настройки в файле "config.xml".

1. Реализация интерфейсов

В под-проекте 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
}

2. Настройки в файле "config.xml"

В файле "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 - поля используемые для соединения с БД.

  1. Address - адрес сервера.
  2. Nme - имя БД в СУБД.
  3. User - имя пользователя.
  4. Password - пароль для пользователя.

Поля Assembly, Namespace, FactoryTape - используются для загрузки фабрики данного слоя.

  1. Assembly - сборка.
  2. Namespace - namespace.
  3. 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).

Настройки каждого адаптера состоят из двух строк:

  1. в первой строчке внутри тэга string пишется уникальный идентификатор устройства, который был присвоен ему ранее внутри тэга DeviceConfiguration

  2. во второй строчке внутри тэга 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

Все необходимые шаги выполнены. Сохраните файл и запустите приложение. Удачной работы