Загрузка...

C# | Бот для группы ВК. Логгирование + БД - [2 часть]

Тема в разделе C# создана пользователем Shellar 21 мар 2019. (поднята 8 мар 2019) 997 просмотров

  1. Shellar
    Shellar Автор темы 21 мар 2019 Заблокирован(а)
    Решил совместить две части в одну.

    В этой теме я покажу вам как работать с базой данных и записывать в нее данные.
    Нам так же понадобится библиотека SQLite, ее найти вы можете в Nuget. Установку показывать не буду.
    Прописываем подключение
    Код
    using System.Data.SQLite;
    Для начала нам надо создать подключение к нашей базе данных, я покажу пример на локальной БД.
    Создадим переменную для удобства, в ней будет записан путь в базе данных
    Код
    string DataBase = @"\data\database\database.db"
    У вас, конечно, путь может быть другим.

    Создаем в классе переменную для подключения к БД
    Код
    public static SQLiteConnection conn = new SQLiteConnection(string.Format("Data Source={0};", DataBase));
    И в следующей строке открываем подключение
    Код
    conn.Open();
    Чтобы управлять базой данных мы должны создать команду, она выглядит как обычная команда в SQL
    Выглядеть это будет так
    Код
    SQLiteCommand command = new SQLiteCommand("здесь SQL команда", conn);
    Чтобы выполнить эту команду, надо использовать это:
    Код
    command.ExecuteScalar()
    или
    command.ExecuteNonQuery();
    В чем отличие между ExecuteScalar и ExecuteNonQuery?

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

    ExecuteNonQuery используется тогда, когда никакого результата не будет. Т.е., когда вы обновляете какую-нибудь переменную в БД с помощью AQL команд UPDATE, INSERT и т.д.


    Давайте для примера сделаем проверку на наличие человека в базе данных. Любыми удобными для вас способами создаем таблицу Users в базе данных и делаем там столбцы id, userId и fullname. Столбцу ID присваиваем Not null, auto-increment и primary key.
    id - ID человека именно в БД, начинается он с 1, и с каждым новым пользователем сам увеличивается на 1.
    userId - ID страницы ВК человека
    fullname - Имя Фамилия соответственно.

    Проверка будет работать так: проверяется количество строк где в столбце userId присутствует ID страницы пользователя.
    Создаем такую SQL команду.
    Код
    SQLiteCommand command = new SQLiteCommand("SELECT count(*) FROM users WHERE userId='" + userID + "';", conn);
    В прошлой части я показывал как получить UserID, но на всякий случай покажу и здесь :)
    Чтобы получить ID пользователя, нам надо перед строкой с SQL командой написать это:
    Код
    long userID = Convert.ToInt32(a.Message.UserId);
    Либо в данной SQL команде вы можете вместо userID сразу использовать a.Message.UserId, это уже на ваш выбор.

    Команду мы создали, но теперь нам надо ее исполнить и получить количество строк:
    Код
    int countRows = Convert.ToInt32(command.ExecuteScalar());
    Здесь мы используем ExecuteScalar, потому что, как я уже писал, мы ожидаем какой-либо результат после выполнения команды.
    Перед тем как сделать проверку, нам нужно так же получить имя, фамилию человека. Это мы будем делать через метод Users.Get
    Код
    var info = api.Users.Get(new long[] { Convert.ToInt64(a.Message.UserId) }).FirstOrDefault();
    Теперь создадим условие
    [CODE]if (countRows == 0)
    {
    SQLiteCommand command = new SQLiteCommand("INSERT INTO users (userId, fullname) VALUES (" + userID + ", '" + info.FirstName + " " + info.LastName + "');" , conn);
    command.ExecuteNonQuery();
    }[/CODE]Данной SQL командой мы вставляем в поля userId и fullname полученные данные, а с помощью ExecuteNonQuery выполняем эту команду, при этом не ожидая какого-либо результата

    Теперь разберем логгирование. Записи у нас так же будут производится в базу данных.
    Сделаем историю сообщений.

    Создаем в БД таблицу messageLog с колонками userId, fullname, message, date.

    Создаем SQL команду после всех наших условий с сообщениями для бота.
    [CODE]SQLiteCommand command = new SQLiteCommand("INSERT INTO messageLog (userId, fullname, message, date) VALUES (" + userID + ", '" + info.FirstName + " " + info.LastName + "', '" + userMessage + "', '" + DateTime.UtcNow.AddHours(3) + "');", conn);
    command.ExecuteNonQuery();[/CODE]Все действует по тому же принципу. userMessage мы получаем так:
    [CODE]string userMessage = a.Message.Body;[/CODE]Ну вот и все, на этом можно закончить, снизу под спойлером выложу некоторый SQL команды, которые, возможно, вам могут пригодиться.
    В следующей части покажу вам, как сделать бота на Callback API и настроить для этого вашу группу

    [CODE]SQLiteCommand checkBalance = new SQLiteCommand("SELECT balance FROM users WHERE userId = " + userID + ";", conn);
    int balance = Convert.ToInt32(checkBalance.ExecuteScalar());[/CODE]В данном примере в БД есть некая колонка с балансом. SELECT выбираем значение колонки balance FROM (из таблицы) users WHERE userId = userID.
    Можно "перевести" эту команду на русский, звучит она так - ВЫБРАТЬ balance ИЗ таблицы users ГДЕ запись в колонке usersId = ID страницы ВК.

    [CODE]SQLiteCommand setBalance = new SQLiteCommand("UPDATE users SET balance = balance + 100 WHERE userId = " + userID + ";", conn);
    setBalance.ExecuteNonQuery();[/CODE]Перевожу - ОБНОВИТЬ таблицу users ИЗМЕНЯЯ запись в колонке balance на balance + 100 ГДЕ запись в колонке userId = ID страницы ВК
    Следующая строка просто выполняет эту команду, изменяя данные и ничего нам не возвращая

    P.S. Могу посоветовать вам программу DB Broswer для управления локальными базами
     
    21 мар 2019 Изменено
Загрузка...
Top