Сообщение из лога ZennoPoster в переменную

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Описание моего шаблона:
Наполняю базу sql информацией из таблицы, списка, и если недостаточно информации с сайта добираю. Потом всё это ложу в sql. Предусмотреть, и подготовить все переменные в нужный вид(экранирование, замена запятых на точки и т.д.) сложно, так как нужно понять в какую переменную ложится информация в неправильном формате.

Но это можно было бы отловить, если бы сообщение лога, при записи в базу данных sql записывать в переменную, и если записать не удалось, то сообщение лога вывести по Bad End, или после проверки if.

При выполнении insert (1), возвращается результат:
-1 информация не добавилась, 0 информация добавилась в базу.
if (2) проверяет 0 или -1

Необходимо:

При выполнении insert, записать в переменную сообщение лога.
Пример: Ошибка при выполнении запроса к БД: Incorrect integer value: '' for column `mytorg`.`onlinerlistings`.`idCatOnliner` at row 1

А потом после проверки if, если возвращается результат -1, эту ошибку вывести в ZennoPoster.

Можно было бы погонять на кубиках в ПМ, но ошибку такую ловить очень долго. Из 3 000 выполнений одна ошибка. Пример на фото 2.

Фото 1

92318

Фото 2

92323
 
Последнее редактирование:

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 764
Благодарностей
2 407
Баллы
113
Содержимое кубика который отмечен у Вас на первом скриншоте значением 1 предоставьте пожалуйста.
 
  • Спасибо
Реакции: kolina

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Содержимое кубика который отмечен у Вас на первом скриншоте значением 1 предоставьте пожалуйста.
insert:
string server = "127.0.0.1";
string dataBase = "mytorg";
int port = 3306;
string user = "root";
string password = "root";
string charset = "utf8";
string lineConnect = String.Format("Server={0};DataBase={1};port={2};user={3};password={4};charset={5}", server, dataBase, port, user, password, charset);


string idCatOnliner = project.Variables["idCatOnliner"].Value;
string idOnListing = project.Variables["idOnListing"].Value;
string urlOnListing = project.Variables["urlOnListing"].Value;
string titleOnListing = project.Variables["titleOnListing"].Value;
string article = project.Variables["article"].Value;
string OnVendor = project.Variables["OnVendor"].Value;
string description = project.Variables["description"].Value;
string data = project.Variables["data"].Value;
string firstDate = project.Variables["data"].Value;
string statuse = "free";
    
string query = String.Format(@"INSERT INTO `onlinerlistings`(`idCatOnliner`, `idOnListing`, `urlOnListing`, `titleOnListing`, `article`, `OnVendor`, `description`, `data`, `firstDate`, `statuse`) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')", idCatOnliner, idOnListing, urlOnListing, titleOnListing, article, OnVendor, description, data, firstDate, statuse);

int result = 0;

using(MySqlConnection connection = new MySqlConnection(lineConnect))
{
    try
    {
        connection.Open();
    }
    catch(MySqlException ex)
    {
        project.SendErrorToLog("Ошибка подключения к базе данных: " + ex.Message);
        return -1;
    }
    
    using(MySqlCommand command = new MySqlCommand(query, connection))
    {
        try
        {
            command.ExecuteNonQuery();
        }
        catch(MySqlException ex)
        {
            project.SendErrorToLog("Ошибка при выполнении запроса к БД: " + ex.Message);
            return -1;
        }
    }
    connection.Close();
}

return result;
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 764
Благодарностей
2 407
Баллы
113
insert:
string server = "127.0.0.1";
string dataBase = "mytorg";
int port = 3306;
string user = "root";
string password = "root";
string charset = "utf8";
string lineConnect = String.Format("Server={0};DataBase={1};port={2};user={3};password={4};charset={5}", server, dataBase, port, user, password, charset);


string idCatOnliner = project.Variables["idCatOnliner"].Value;
string idOnListing = project.Variables["idOnListing"].Value;
string urlOnListing = project.Variables["urlOnListing"].Value;
string titleOnListing = project.Variables["titleOnListing"].Value;
string article = project.Variables["article"].Value;
string OnVendor = project.Variables["OnVendor"].Value;
string description = project.Variables["description"].Value;
string data = project.Variables["data"].Value;
string firstDate = project.Variables["data"].Value;
string statuse = "free";

string query = String.Format(@"INSERT INTO `onlinerlistings`(`idCatOnliner`, `idOnListing`, `urlOnListing`, `titleOnListing`, `article`, `OnVendor`, `description`, `data`, `firstDate`, `statuse`) VALUES ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}')", idCatOnliner, idOnListing, urlOnListing, titleOnListing, article, OnVendor, description, data, firstDate, statuse);

int result = 0;

using(MySqlConnection connection = new MySqlConnection(lineConnect))
{
    try
    {
        connection.Open();
    }
    catch(MySqlException ex)
    {
        project.SendErrorToLog("Ошибка подключения к базе данных: " + ex.Message);
        return -1;
    }

    using(MySqlCommand command = new MySqlCommand(query, connection))
    {
        try
        {
            command.ExecuteNonQuery();
        }
        catch(MySqlException ex)
        {
            project.SendErrorToLog("Ошибка при выполнении запроса к БД: " + ex.Message);
            return -1;
        }
    }
    connection.Close();
}

return result;
Во всех конструкциях catch (в 33 и 45 строчках) можете добавить сохранение сообщения об ошибке в переменную, а потом делать с ней что считаете нужным. Пример:
project.Variables["error"].Value = ex.Message; // error - переменная которая должна существовать в проекте

Также рекомендую подготавливать запросы так, как об этом говорит документация: Документация
Это позволит избежать вообще практически всех ошибок, которые потенциально могли появляться из-за символов которые нужно экранировать. Пример с документации:
C#:
MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection);
cmd.Parameters.Add( "@val", 10 );
cmd.Prepare();
cmd.ExecuteNonQuery();

cmd.Parameters[0].Value = 20;
cmd.ExecuteNonQuery();
Кстати, Ваш код сообщения в лог выводит только в проджект мейкере.
project.SendErrorToLog("Ошибка подключения к базе данных: " + ex.Message);
Чтобы сообщения об ошибках и их содержимом выводились и в Зенно, нужно true добавить. Пример:
project.SendErrorToLog("Ошибка подключения к базе данных: " + ex.Message, true);
 
Последнее редактирование:
  • Спасибо
Реакции: Yuriy Zymlex и kolina

kolina

Client
Регистрация
05.10.2019
Сообщения
158
Благодарностей
44
Баллы
28
Спасибо! То что нужно!
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)