• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

Новая версия dbFacade и примеры использования

Сегодня я решил выложить новую версию своей библиотеки. Написал 4 основных обновления.
1. Insert возвращает id последней добавленной строки.
2. Добавлены методы, возвращающие одну строку в виде ассоциативного массива полей.
3. Убран метод CreateDatabase, вместо него используется ExecuteNonQuery для создания таблиц и для всего остального, что невозможно реализовать методами, представленными в библиотеке.
4. Класс dbFacade получил модификатор patrial.

Обо всем по порядку.
Метод Insert добавляет новую строку в таблицу и возвращает идентификатор этой строки. В SQLite есть готовая функция, которая выполняет нужное действие – last_insert_rowid(). После выполнения запроса вставки, просто выполняется эта функция.

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

1 Select query = new Select();
2 query.From("buffer", new string[] { "buffer_text" }).Where("id = 5");
3 string text = db.FetchOneRow(query)["buffer_text"].ToString();

или

1 Select query = new Select();
2 query.From("buffer", new string[] { "buffer_text", "title" }).Where("id = 5");
3 Dictionary<string,object>  dict = new Dictionary<string,object>();
4 dict = db.FetchOneRow(query);
5 string bt = dict["buffer_text"].ToString();
6 string tt = dict[1].ToString(); //тоже самое что и dict["title"].ToString()

Здесь я использую Dictionary. Как вариант для ассоциативного массива, можно было использовать Hashtable, но у последнего есть проблема. При добавлении в коллекцию, элементы выстраиваются в произвольном порядке. Поэтому доступ по индексу невозможен, так как порядок меняется. Почему это происходит, я не разбирался.

Далее, я убрал метод CreateDatabase, потому что он был предназначен для тестирования класса. Заменил простым ExecuteNonQuery, который получает строку запроса и просто ее выполняет. Если выполнено успешно, возвращается 0, иначе 1.

Класс dbFacade стал patrial. Это значит, что если вам необходимо написать свои методы для работы с базой данных, то вы просто добавляете новый файл в проект и называете его dbFacade, соответственно с модификатором patrial. Последующие обновления файла dbFacade.cs не затронут ваш код, потому что он будет находиться в другом файле. Я считаю это очень удобным. Буду стараться писать новые версии с обратной поддержкой.

Давайте рассмотрим несколько примеров использования библиотеки.

1 dbFacade db = new dbFacade();
2 ...
3 //выборка
4 ArrayList list = new ArrayList();
5 DataTable dt = db.FetchByColumn("buffer", new string[] { "id", "buffer_text", "text_format" }, "", "ORDER BY id DESC LIMIT 10");
6 foreach (DataRow item in dt.Rows)
7 {
8     list.Add(item["id"].ToString());
9     ...
10 }
11 ...
12 dt = db.FetchAll("Input", "WHERE idGraph = 5");
13 ...
14 Select query = new Select();
15 query.From("tablename").Columns(new string[] {"title", "status"}).Where("status = 1").Group("status").Order("title DESC").Limit(20);
16 db.Execute(query);
17 ...        
18  
19 //вставка
20 ParametersCollection paramss = new ParametersCollection();
21 paramss.Add("text_format", textFormat.ToString(), DbType.Int32);
22 paramss.Add("buffer_text", text, DbType.String);
23 db.Insert("buffer", paramss);
24 ...
25 ParametersCollection parameters = new ParametersCollection();
26 parameters.Add("x", 0, DbType.Decimal);
27 parameters.Add("Fx", 0, DbType.Decimal);
28 parameters.Add("idGraph", 4, DbType.Int16);
29 int lastId = db.Insert("Input", parameters);
30 ...
31 //удаление
32 db.Delete("buffer"); //удаляет все из таблицы
33 db.Delete("buffer", " WHERE id = 2"); //удаляет где id равен 2
34 ...
35  
36 //обновление
37 ParametersCollection paramss = new ParametersCollection();
38 paramss.Add("pid", 67, DbType.Int32);
39 db.Update("common", paramss, new string[] {"id = " + id} ,"");