Сегодня я решил выложить новую версию своей библиотеки. Написал 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(); |
Здесь я использую Dictionary. Как вариант для ассоциативного массива, можно было использовать Hashtable, но у последнего есть проблема. При добавлении в коллекцию, элементы выстраиваются в произвольном порядке. Поэтому доступ по индексу невозможен, так как порядок меняется. Почему это происходит, я не разбирался.
Далее, я убрал метод CreateDatabase, потому что он был предназначен для тестирования класса. Заменил простым ExecuteNonQuery, который получает строку запроса и просто ее выполняет. Если выполнено успешно, возвращается 0, иначе 1.
Класс dbFacade стал patrial. Это значит, что если вам необходимо написать свои методы для работы с базой данных, то вы просто добавляете новый файл в проект и называете его dbFacade, соответственно с модификатором patrial. Последующие обновления файла dbFacade.cs не затронут ваш код, потому что он будет находиться в другом файле. Я считаю это очень удобным. Буду стараться писать новые версии с обратной поддержкой.
Давайте рассмотрим несколько примеров использования библиотеки.
1 |
dbFacade db = new dbFacade(); |
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) |
8 |
list.Add(item["id"].ToString()); |
12 |
dt = db.FetchAll("Input", "WHERE idGraph = 5"); |
14 |
Select query = new Select(); |
15 |
query.From("tablename").Columns(new string[] {"title", "status"}).Where("status = 1").Group("status").Order("title DESC").Limit(20); |
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); |
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); |
33 |
db.Delete("buffer", " WHERE id = 2"); |
37 |
ParametersCollection paramss = new ParametersCollection(); |
38 |
paramss.Add("pid", 67, DbType.Int32); |
39 |
db.Update("common", paramss, new string[] {"id = " + id} ,""); |