2 место Заготовка для работы с БД MySQL в кубике C#

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28
var

C#:
var mail = "mail text";

project.SendInfoToLog($"My mail is {mail}", false);
Перед данными $, переменную в фигурных скобках.
Помоему что то не то(

В эту строку мне нужно передать значения переменных
login
pass
mail

db.query("UPDATE Account_FB SET СЮДА ЛОГИН, СЮДА ПАСС,СЮДА MAIL, status=0, use_time="+unixtime.ToString()+" WHERE id="+id);
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Помоему что то не то(

В эту строку мне нужно передать значения переменных
login
pass
mail

db.query("UPDATE Account_FB SET СЮДА ЛОГИН, СЮДА ПАСС,СЮДА MAIL, status=0, use_time="+unixtime.ToString()+" WHERE id="+id);
db.query("UPDATE Account_FB SET login='"+project.Variables["login"].Value+"', pass='"+project.Variables["pass"].Value+"', mail='"+project.Variables["mail"].Value+"', status=0, use_time="+unixtime.ToString()+" WHERE id='"+id+"'");
 
Последнее редактирование:
  • Спасибо
Реакции: andropovleva

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28
Вроде все переменные застринговал, но получаю фатальную ошибку(
Стринговал по той причине что в переменной могут содержаться не только буквы но и числа.

106219


106220


C#:
var db = project.Context["db"];

string name = project.Variables["name"].Value;
string login = project.Variables["login"].Value;
string pass = project.Variables["pass"].Value;
string mail = project.Variables["mail"].Value;
string pass_mail = project.Variables["pass_mail"].Value;
string avatar = project.Variables["avatar"].Value;
string date_of_birth = project.Variables["avatar"].Value;
string ID_acc = project.Variables["ID_acc"].Value;
string cookie = project.Variables["cookie"].Value;
string token_eaab = project.Variables["token_eaab"].Value;
string fp = project.Variables["fp"].Value;
string useragent = project.Variables["useragent"].Value;
string photo = project.Variables["photo"].Value;
string rk_id = project.Variables["rk_id"].Value;
string bm_id = project.Variables["bm_id"].Value;
string token_EAAG = project.Variables["token_EAAG"].Value;
string bm_ssylka = project.Variables["bm_ssylka"].Value;
string id = project.Variables["id"].Value;

if ( id != "" ){
   
    // получаем текущее юникс-время
    int unixtime = (int)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;
   
    // обратно устанавливаем статус=0 (свободен) и время последнего использования устанавливаем на текущее
    db.query("UPDATE Account_FB SET name= '"+ project.Variables["name"].Value.ToString() +"',login= '"+ project.Variables["login"].Value.ToString() +"',pass= '"+ project.Variables["pass"].Value.ToString() +"',mail= '"+ project.Variables["mail"].Value.ToString() +"',pass_mail= '"+ project.Variables["pass_mail"].Value.ToString() +"',avatar= '"+ project.Variables["avatar"].Value.ToString() +"',date_of_birth= '"+ project.Variables["date_of_birth"].Value.ToString() +"',ID_acc= '"+ project.Variables["ID_acc"].Value.ToString() +"',cookie= '"+ project.Variables["cookie"].Value.ToString() +"',token_eaab= '"+ project.Variables["token_eaab"].Value.ToString() +"',fp= '"+ project.Variables["fp"].Value.ToString() +"',useragent= '"+ project.Variables["useragent"].Value.ToString() +"',photo= '"+ project.Variables["photo"].Value.ToString() +"',rk_id= '"+ project.Variables["rk_id"].Value.ToString() +"',bm_id= '"+ project.Variables["bm_id"].Value.ToString() +"',token_EAAG= '"+ project.Variables["token_EAAG"].Value.ToString() +"',bm_ssylka= '"+ project.Variables["bm_ssylka"].Value.ToString() +"', status=0, use_time="+unixtime.ToString()+" WHERE id="+id);
}

// завершаем работу с БД
db.close();
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Вроде все переменные застринговал, но получаю фатальную ошибку(
Стринговал по той причине что в переменной могут содержаться не только буквы но и числа.

Посмотреть вложение 106219

Посмотреть вложение 106220

C#:
var db = project.Context["db"];

string name = project.Variables["name"].Value;
string login = project.Variables["login"].Value;
string pass = project.Variables["pass"].Value;
string mail = project.Variables["mail"].Value;
string pass_mail = project.Variables["pass_mail"].Value;
string avatar = project.Variables["avatar"].Value;
string date_of_birth = project.Variables["avatar"].Value;
string ID_acc = project.Variables["ID_acc"].Value;
string cookie = project.Variables["cookie"].Value;
string token_eaab = project.Variables["token_eaab"].Value;
string fp = project.Variables["fp"].Value;
string useragent = project.Variables["useragent"].Value;
string photo = project.Variables["photo"].Value;
string rk_id = project.Variables["rk_id"].Value;
string bm_id = project.Variables["bm_id"].Value;
string token_EAAG = project.Variables["token_EAAG"].Value;
string bm_ssylka = project.Variables["bm_ssylka"].Value;
string id = project.Variables["id"].Value;

if ( id != "" ){
  
    // получаем текущее юникс-время
    int unixtime = (int)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;
  
    // обратно устанавливаем статус=0 (свободен) и время последнего использования устанавливаем на текущее
    db.query("UPDATE Account_FB SET name= '"+ project.Variables["name"].Value.ToString() +"',login= '"+ project.Variables["login"].Value.ToString() +"',pass= '"+ project.Variables["pass"].Value.ToString() +"',mail= '"+ project.Variables["mail"].Value.ToString() +"',pass_mail= '"+ project.Variables["pass_mail"].Value.ToString() +"',avatar= '"+ project.Variables["avatar"].Value.ToString() +"',date_of_birth= '"+ project.Variables["date_of_birth"].Value.ToString() +"',ID_acc= '"+ project.Variables["ID_acc"].Value.ToString() +"',cookie= '"+ project.Variables["cookie"].Value.ToString() +"',token_eaab= '"+ project.Variables["token_eaab"].Value.ToString() +"',fp= '"+ project.Variables["fp"].Value.ToString() +"',useragent= '"+ project.Variables["useragent"].Value.ToString() +"',photo= '"+ project.Variables["photo"].Value.ToString() +"',rk_id= '"+ project.Variables["rk_id"].Value.ToString() +"',bm_id= '"+ project.Variables["bm_id"].Value.ToString() +"',token_EAAG= '"+ project.Variables["token_EAAG"].Value.ToString() +"',bm_ssylka= '"+ project.Variables["bm_ssylka"].Value.ToString() +"', status=0, use_time="+unixtime.ToString()+" WHERE id="+id);
}

// завершаем работу с БД
db.close();
Посмотри конец строки WHERE id="+id); что я тебе написал WHERE id='"+id+"'")
 
  • Спасибо
Реакции: andropovleva

DaveJohns

Client
Регистрация
04.12.2018
Сообщения
32
Благодарностей
11
Баллы
8
Как добавить значения других переменных в общую строку, никак не получается что то.

пробовал на переменной mail


Посмотреть вложение 106217

Посмотреть вложение 106218
Можно не создавать доп строку и отправить сразу переменную

UPDATE Account_FB SET 'mail'='"+project.Variables["mail"].Value+"' , status =0
 
  • Спасибо
Реакции: andropovleva

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28
Почему то при сохранении кук в БД они ломаются и становятся невалидными, может кто сталкивался с таким, подскажите в чем может быть дело?
 

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
Почему то при сохранении кук в БД они ломаются и становятся невалидными, может кто сталкивался с таким, подскажите в чем может быть дело?
сохраняй в безлопастном формате. JSON, base64. или экранируй проблемные символы, которые база данных не проглатывает.
 

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28
у меня конитель с "" и \\ как сделать что бы в БД записывались куки уже в рабочем состоянии без всякого декодирования?
 

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28
106737
так должно быть

106738
бд сделало так

106739
еще момент должно быть так

106740
бд сделал так


106741
и тут еще бд убрал 1 \ должно быть \\
 

andropovleva

Client
Регистрация
23.11.2019
Сообщения
581
Благодарностей
45
Баллы
28
106743
юзайте этот кубик все кто столкнулся с подобным, решил проблему.
 
  • Спасибо
Реакции: SlipDez

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28
del
 
  • Спасибо
Реакции: djaga

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28
WebBot
Help. Уже убил огромное количество времени все никак не могу понять как обновить данные таблицы если колонка и значение совпадает
Пример
UPDATE tabl0 SET 1='1' WHERE account =2

Ругается все время на строку 1='1' . Перерыл множество тем на сторонних ресурсах вроде и решение описывается но никак не могу понять
 
  • Спасибо
Реакции: Phoenix78

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28

Petr_G

Client
Регистрация
20.10.2017
Сообщения
96
Благодарностей
53
Баллы
18
@WebBot скажи, будь добр, а как использовать START TRANSACTION|COMMIT ? Чтобы откатывать изменения всех запросов в рамках одной сессии при неудаче в каком-либо из запросов.
 

Petr_G

Client
Регистрация
20.10.2017
Сообщения
96
Благодарностей
53
Баллы
18
@WebBot скажи, будь добр, а как использовать START TRANSACTION|COMMIT ? Чтобы откатывать изменения всех запросов в рамках одной сессии при неудаче в каком-либо из запросов.
Вопрос снят! db.query("START TRANSACTION"); db.query("ROLLBACK"); db.query("COMMIT "); - прекрасно работают.
 
  • Спасибо
Реакции: djaga

TommyTuta

Client
Регистрация
02.10.2022
Сообщения
130
Благодарностей
58
Баллы
28
Если второй поток попытается достучатся до таблицы которая заблокирована (с ней работает первый поток), что будет?
Будет ошибка или второй поток сам подождет пока таблица разблокируется?
 

Petr_G

Client
Регистрация
20.10.2017
Сообщения
96
Благодарностей
53
Баллы
18
Если второй поток попытается достучатся до таблицы которая заблокирована (с ней работает первый поток), что будет?
Будет ошибка или второй поток сам подождет пока таблица разблокируется?
будет ждать!
 
  • Спасибо
Реакции: TommyTuta

rol

Client
Регистрация
19.09.2017
Сообщения
44
Благодарностей
7
Баллы
8
.
 
Последнее редактирование:

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
63
Если так случилось, что в базе несколько таблиц разных проектов.
Когда лочится таблица, то указывается какая конкретно - "LOCK TABLES accounts WRITE".
А в конце разлочиваются все "UNLOCK TABLES".

Означает ли это, что для разлочивания тоже нужно указывать какая именно таблица должна быть разблокирована, типа "UNLOCK TABLE accounts"?
 

fazan

Client
Регистрация
25.12.2014
Сообщения
97
Благодарностей
9
Баллы
8
Всем привет. Появилась потребность работать из Zennodroid с Mysql в многопотоке.
В Zennoposter по примерам приведенным в статье удалось осилить эту задачу.
Но в Zennodroid не удается завести приведенные в статье кубики. Так понимаю ошибка связана с общим кодом. Вот текст ошибки из лога:
Компиляция кода проекта Ошибка при компиляции общего кода "CS0246" The type or namespace name "Mysqlconnection" could not be found (are you missing a using directive or an assembly reference?). [Строка: 49; Столбец: 11]
Подскажите пжл, что нужно написать в общий код, чтобы кубики заработали в ZD?

Что было сделано.
1. В директории куда установлен Zennodroid из папки Progs скопировал MySql.Data.dll в папку ExternalAssemblies находящуюся там же.
2. Добавил блок "Ссылки из GAC". Добавил System.web
3. В директивы usinq и общий код ZD скопировал строчки из одноименного кубика ZP прикреплённого к статье проекта.
Вот содержимое:

C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
using System.Text.RegularExpressions;
using ZennoLab.CommandCenter;
using ZennoLab.InterfacesLibrary;
using ZennoLab.InterfacesLibrary.ProjectModel;
using ZennoLab.InterfacesLibrary.ProjectModel.Collections;
using ZennoLab.InterfacesLibrary.ProjectModel.Enums;
using ZennoLab.Macros;
using Global.ZennoExtensions;
using ZennoLab.Emulation;
using ZennoLab.CommandCenter.TouchEvents;
using ZennoLab.CommandCenter.FullEmulation;
using ZennoLab.InterfacesLibrary.Enums;
using ZennoLab.InterfacesLibrary.ZennoDroid;
using ZennoLab.InterfacesLibrary.ZennoDroid.Enums;

namespace ZennoLab.OwnCode

    
    
    public class DB
    {
        private string hostname;
        private string username;
        private string password;
        private string database;
        private string charset;
        private string result;
        private MySqlConnection conn;
        
        
        public DB(string db_hostname, string db_username, string db_password, string db_database, string db_charset="utf8"){
            hostname = db_hostname;
            username = db_username;
            password = db_password;
            database = db_database;
            charset = db_charset;
            result = String.Empty;
            string db_port =  "3306";
            
            var m = db_hostname.Split(':');
            if ( m.Length == 2 ){
                db_hostname = m[0];
                db_port = m[1];
            }
            
            var connectionString = "server="+db_hostname+";user="+db_username+";database="+db_database+";port="+db_port+";password="+db_password+";pooling=False;";
            conn = new MySqlConnection(connectionString);

            open();
        }

        
        public void open(){
            conn.Open();
        }       

        
        public void close(){
            conn.Close();   
        }       
        
        public void query(string query){
            MySqlCommand command = new MySqlCommand(query, conn);
            command.ExecuteNonQuery();
        }
        
        public List<string> getAll(string query, string fieldSeparator="|"){
            
            var result = new List<string>();

            MySqlCommand command = new MySqlCommand(query, conn);           
            
            MySqlDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                List<string> fields = new List<string>();
                for(int i=0; i<reader.FieldCount; i++)
                fields.Add(reader[i].ToString());
                
                result.Add(string.Join(fieldSeparator,fields));
                
            }
            reader.Close();
            
            return result;           
        }

        public List<string> getRow(string query){

            MySqlCommand command = new MySqlCommand(query, conn);           
            
            MySqlDataReader reader = command.ExecuteReader();
            
            if ( reader.Read() ){
        
                List<string> result = new List<string>();
                for(int i=0; i<reader.FieldCount; i++)
                result.Add(reader[i].ToString());

                reader.Close();
                return result;               
            }
            
            reader.Close();
            return new List<string>();           
        }
        
        
        public string getOne(string query){
             MySqlCommand command = new MySqlCommand(query, conn);
            string result = "";
            try { result = command.ExecuteScalar().ToString(); } catch{}
            return result;
        }
        
        
        public string escapeString(string text){           
            return MySql.Data.MySqlClient.MySqlHelper.EscapeString(text);
        }
        
    }   
    
}
 

kul0n

Client
Регистрация
10.03.2016
Сообщения
85
Благодарностей
14
Баллы
8
WebBot спасибо за инфу, очень полезно. А можно ли поставлять прокси при обращении к БД? Чтобы запросы к БД шли через прокси
 

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 280
Благодарностей
96
Баллы
48
Подскажите, а как-то можно получить сразу несколько значений которые отдаются по запросу типа SELECT?
getone получает только первое, а у меня их много. getRow тоже не срабатывает
 

TommyTuta

Client
Регистрация
02.10.2022
Сообщения
130
Благодарностей
58
Баллы
28
Подскажите, а как-то можно получить сразу несколько значений которые отдаются по запросу типа SELECT?
getone получает только первое, а у меня их много. getRow тоже не срабатывает
116355
 

Bullet

Client
Регистрация
16.12.2015
Сообщения
186
Благодарностей
19
Баллы
18
Попался интересный случай - при отработке из под постера запроса с условием WHERE field LIKE '%Текст на русском%' возвращается пустой результат.
Этот же запрос из другого клиента выполняется корректно.
 

AleXPrischepA

Client
Регистрация
06.05.2015
Сообщения
209
Благодарностей
97
Баллы
28
@WebBot подскажи... вот выполнил я подключение к базе.

C#:
string db_host = "localhost";     // хост
string db_user = "root";          // username для подключения к MySQL
string db_pswd = "";              // пароль для подключения к MySQL
string db_database = "mydb";      // название БД с которой будет работа
string db_charset = "utf8";       // кодировка данных в таблицах

DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);

// сохраняем объект в контексте что бы использовать его в других кубиках
project.Context["db"] = db;
ВОПРОС: Как долго я могу держать это подключение?

ПОЯСНЮ: есть 2 базы данных. Одна на хостинге, в которую вебхуки из ТГ летят. Вторая на локальной машине. Задача: максимально быстро и безболезненно переносить данные с хоста на локальный ПК. Пишу ТГ бота для управления своими проектами и задачами.

Знаю что зацикленные шаблоны тоже не есть хорошо. Предположим раз 15-20 минут соеденение буду закрывать и открывать поновой. Нормально?

Может есть способы интересней?
 

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