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

nik-n

Client
Joined
Nov 5, 2016
Messages
243
Reaction score
20
Points
18
Приветствую!

Ранее я подавал заявку на конкурс статей, где хотел разобрать недостатки стандартного кубика для работы с БД (и получаемого из него кода) и вместе с вами пошагово разразработать в общем коде простейший (без каких-либо наворотов и заумностей) класс для работы с MySQL, позволяющий избежать этих недостатков. Но тогда не сложилось, вторую тему по MySQL не одобрили.

Сейчас конкурс шаблонов, поэтому теорию и пошаговую разработку мы пропустим, а я просто приложу шаблон-заготовку с простейшим классом в общем коде, который позволит избежать серьезных недостатков стандартного кода/кубика и сделать работу с MySQL более приятной.

Недостатки стандартного кубика/кода

Главный минус - нет возможности управлять открытием/закрытием коннектов/сессией. Каждый кубик/код работы с БД устанавливает соединение, открывает новую сессию, выполняет SQL запрос и закрывает сессию.

Отсюда проблемы:
  • Невозможно выполнить множество запросов в рамках одной сессии с промежуточной обработкой данных. А именно это чаще всего и нужно для нормальной работы в многопотоке.
  • Невозможно получить Id только что вставленной записи (повторный вызов кубика/кода откроет новую сессию где этой информации не будет)
  • Открытие/закрытие подключений/сессий a) занимает доп. время б) создает доп. нагрузку. Если в шаблоне 50 кубиков работы с БД, то это 50 открытий/закрытий подключений/сессий на 1 поток. А если потоков сотни?
Вдобавок:
  • Отсутствие функции экранирования спецсимволов (это обязательно нужно делать перед вставкой строковых данных в таблицу). Может я плохо искал?
  • Насколько я помню код из кубика не хотел работать со списками созданными в C#, а работал только со списками созданными в ZP. Это очень неудобно.
  • Код из кубика тяжел для восприятия - этакая сборная солянка из хоста/логина/пароля/бд/параметров подклобчения/sql запроса/прочих параметров

Итак, наша задача - решить описанные выше недостатки и сделать работу с БД MySQL более простой и наглядной.

Использование заготовки:


Подготовка ZP. Идем в директорию куда установлен ZP и в папке Progs находим файл MySql.Data.dll . Копируем его в папку ExternalAssemblies находящуюся там же.

Далее открываем заготовку и в кубике C# пишем: (далее идут примеры):

Итак, пример(ы) кода:

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

// коннект к MySQL и открытие сессии

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

// все что идет ниже выполняется в рамках одного коннекта/сессии ... это очень важно (!)


// получить 1 результат (скаляр)
// для получения 1 результата всегда используем метод getOne

string count = db.getOne("SELECT COUNT(*) FROM accounts WHERE status=0");
project.SendInfoToLog("Кол-во аккаунтов: "+count,true); // выводим в лог ZP

// получить 1 запись ( запись = 1 строка разделенная на столбцы )
// для получения 1 записи/строки всегда используем метод getRow

List<string> row = db.getRow("SELECT first_name, last_name, status FROM accounts WHERE id=1");

if ( row.Count > 0 ){
    project.SendInfoToLog("Имя: "+row[0],true); // выводим в лог ZP
    project.SendInfoToLog("Фамилия: "+row[1],true);  // выводим в лог ZP
    project.SendInfoToLog("Статус: "+row[2],true);  // выводим в лог ZP
}
else {
    project.SendInfoToLog("запись отсутствует",true);  // выводим в лог ZP
}


// для запросов не возвращающих результата (INSERT/UPDATE/LOCK/UNLOCK/...) всегда используем метод query

// лочим таблицу accounts что бы только 1 поток работал с ней
// P.S вы должны лочить все таблицы и их алиасы с которыми собираетесь работать в рамках строго 1 потока ..
// в этом примере работа идет лишь с 1 таблицей, поэтому и лочится только она

db.query("LOCK TABLES accounts WRITE");

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

// берем 100 акков со status=0 (свободные), которые при этом дольше всех не брались ( ORDER BY check_time )

List<string> data = db.getAll("SELECT id, first_name, last_name FROM accounts WHERE status=0 ORDER BY check_time LIMIT 100","|");

List<string> ids = new List<string>(); // в этот список сохраним только id полученных данных
for(int i=0; i<data.Count; i++){
    var x = data[i].Split('|');
    project.SendInfoToLog("ID: "+x[0],true);
    project.SendInfoToLog("Имя: "+x[1],true);
    project.SendInfoToLog("Фамилия: "+x[2],true);
    project.SendInfoToLog("--------------",true);
    ids.Add(x[0]); // добавляем очередной id в список ids
}

// текущее юникс-время
int unixtime = (int)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;

// здесь, например, делаем чекинг id из списка ids на онлайн в ВК и наполнztv список online теми id которые сейчас онлайн
List<string> online = new List<string>();

// меняем статус у тех кто online (только их мы берем в работу)
if ( online.Count > 0 )
db.query("UPDATE accounts SET status=1 WHERE id IN("+string.Join(",",online)+")");

// обновляем время проверки у всех взятых id
if ( ids.Count > 0 )
db.query("UPDATE accounts SET check_time="+unixtime.ToString()+" WHERE id IN("+string.Join(",",ids)+")");

// разлочиваем таблицу
db.query("UNLOCK TABLES");

// пример экранирования спецсимволов в строке (если не экранировать, то одинарная кавычка поломает наш запрос)
string first_name = db.escapeString("Д'артаньян");

// вставка новой записи
db.query("INSERT INTO accounts SET first_name='"+first_name+"'");

// получение Id только что вставленной записи
string acc_id = db.getOne("SELECT LAST_INSERT_ID()");
project.SendInfoToLog("ID вставленной записи: "+acc_id,true);

// завершаем сессию
db.close();
Надеюсь данная заготовка кому-нибудь пригодится и поможет начать работать с MySQL т.к это открывает вам совершенно иные возможности при создании ваших шаблонов!

К посту приложены 2 файла - mysql_zagotovka.xmlz и primer1.xmlz . В первом файле не реализовывается какая-то конкретная логика, это просто заготовка со встроенным классом + кубик C# с примерами того как используя методы класса коннектиться к БД, делать различные запросы и тд (в общем то же самое что вы видите в примерах в этом посте). Во втором файле (primer1.xmlz) реализована прямо конкретная логика по взятию аккаунтов в работу из БД в многопотоке, там достаточно создать свою таблицу нужной структуры (приведена мной несколькими постами ниже) и подставить свои данные для коннекта к БД. И все, можно юзать в своих проектах!
по C# + SQL - это самая простая и понятная инструкция из всех на форуме!
ps когда на форум добавят кнопку дабл лайк???? )
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
в базу данных нормально пишутся русские тексты? у меня проблема с кодировкой. Пробовал выставить Utf8, но это не помогает. В чем вопрос может быть?
 

iskrakovrov

Client
Joined
Mar 28, 2015
Messages
531
Reaction score
171
Points
43

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с iskrakovrov какие-либо сделки.

кодировку при обращении к бд выставить надо.
в общем коде добавить charset


hostname = db_hostname;
username = db_username;
password = db_password;
database = db_database;
charset = db_charset;


И в самом коде c#


string db_host = project.Variables["dbip"].Value; // хост
string db_user = project.Variables["dbuser"].Value; // username для подключения к MySQL
string db_pswd = project.Variables["dbpass"].Value; // пароль для подключения к MySQL
string db_database = project.Variables["dbname"].Value; // название БД с которой будет работа
string db_charset = "utf8"; // кодировка данных в таблицах

// коннект к MySQL и открытие сессии

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


В примерах в теме это не прописано
 
  • Thank you
Reactions: artsmm

fazan

Client
Joined
Dec 25, 2014
Messages
104
Reaction score
13
Points
18
Всем привет. Помогите пжл правильно указать переменные в WHERE и строке UPDATE. Текущий код выдает ошибку на скрине

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

db.query("LOCK TABLES avito_get_zapros_table WRITE");

// берем строку у которой дата больше или равна чем впеременной проекта И ID равно перемнной проекта (INT)

List<string> row = db.getRow("SELECT id, uniq_string FROM avito_get_zapros_table WHERE date_time_zapros >= "'+ project.Variables["date_time_zapros"].Value +'" AND id = "'+ project.Variables["date_time_zapros"].Value +'"");




if ( row.Count > 0 ){
// запись перемнных
project.Variables["uniq_string"].Value = row[1];

    // менем значение в uniq_string на рандомное цифровое значение находящееся в переменной проекта random_for_get
    
    db.query("UPDATE avito_get_zapros_table SET uniq_string = '+ project.Variables["random_for_get"].Value +' WHERE id="+row[0]);
}
else {
    project.SendInfoToLog("Не пришло время для взятия строки",true);
    db.query("UNLOCK TABLES");
    throw new Exception();
}

db.query("UNLOCK TABLES");
db.close();
 

Attachments

usboff

Client
Joined
Aug 25, 2021
Messages
106
Reaction score
73
Points
28
Всем привет. Помогите пжл правильно указать переменные в WHERE и строке UPDATE. Текущий код выдает ошибку на скрине

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

db.query("LOCK TABLES avito_get_zapros_table WRITE");

// берем строку у которой дата больше или равна чем впеременной проекта И ID равно перемнной проекта (INT)

List<string> row = db.getRow("SELECT id, uniq_string FROM avito_get_zapros_table WHERE date_time_zapros >= "'+ project.Variables["date_time_zapros"].Value +'" AND id = "'+ project.Variables["date_time_zapros"].Value +'"");




if ( row.Count > 0 ){
// запись перемнных
project.Variables["uniq_string"].Value = row[1];

    // менем значение в uniq_string на рандомное цифровое значение находящееся в переменной проекта random_for_get
   
    db.query("UPDATE avito_get_zapros_table SET uniq_string = '+ project.Variables["random_for_get"].Value +' WHERE id="+row[0]);
}
else {
    project.SendInfoToLog("Не пришло время для взятия строки",true);
    db.query("UNLOCK TABLES");
    throw new Exception();
}

db.query("UNLOCK TABLES");
db.close();
Одинарные кавычки должны находиться ВНУТРИ двойных.

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

db.query("LOCK TABLES avito_get_zapros_table WRITE");

// берем строку у которой дата больше или равна чем впеременной проекта И ID равно перемнной проекта (INT)

List<string> row = db.getRow("SELECT id, uniq_string FROM avito_get_zapros_table WHERE date_time_zapros >= '"+ project.Variables["date_time_zapros"].Value +"' AND id = '"+ project.Variables["date_time_zapros"].Value +"'");



if ( row.Count > 0 ){
// запись перемнных
project.Variables["uniq_string"].Value = row[1];

    // менем значение в uniq_string на рандомное цифровое значение находящееся в переменной проекта random_for_get
   
db.query("UPDATE avito_get_zapros_table SET uniq_string = '"+ project.Variables["test"].Value +"' WHERE id="+row[0]);

}
else {
    project.SendInfoToLog("Не пришло время для взятия строки",true);
    db.query("UNLOCK TABLES");
    throw new Exception();
}

db.query("UNLOCK TABLES");
db.close();
 
  • Thank you
Reactions: fazan

fazan

Client
Joined
Dec 25, 2014
Messages
104
Reaction score
13
Points
18
Одинарные кавычки должны находиться ВНУТРИ двойных.

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

db.query("LOCK TABLES avito_get_zapros_table WRITE");

// берем строку у которой дата больше или равна чем впеременной проекта И ID равно перемнной проекта (INT)

List<string> row = db.getRow("SELECT id, uniq_string FROM avito_get_zapros_table WHERE date_time_zapros >= '"+ project.Variables["date_time_zapros"].Value +"' AND id = '"+ project.Variables["date_time_zapros"].Value +"'");



if ( row.Count > 0 ){
// запись перемнных
project.Variables["uniq_string"].Value = row[1];

    // менем значение в uniq_string на рандомное цифровое значение находящееся в переменной проекта random_for_get
  
db.query("UPDATE avito_get_zapros_table SET uniq_string = '"+ project.Variables["test"].Value +"' WHERE id="+row[0]);

}
else {
    project.SendInfoToLog("Не пришло время для взятия строки",true);
    db.query("UNLOCK TABLES");
    throw new Exception();
}

db.query("UNLOCK TABLES");
db.close();
Спасибо!
 
  • Thank you
Reactions: usboff

bizzon

Client
Joined
Sep 8, 2015
Messages
1,106
Reaction score
132
Points
63
C#:
    // получаем текущее юникс-время
    int unixtime = (int)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;
    
    // обратно устанавливаем статус=0 (свободен) и время последнего использования устанавливаем на текущее
    db.query("UPDATE accounts SET status=0, use_time="+unixtime.ToString()+" WHERE id="+acc_id);
}
Только начинаю интересоваться этой темой.
Какой тип данных должен быть в колонке use_time?
Там ведь для даты есть свои типы.
 

WebBot

Client
Joined
Apr 4, 2015
Messages
1,794
Reaction score
1,398
Points
113
C#:
    // получаем текущее юникс-время
    int unixtime = (int)(DateTime.UtcNow - new DateTime(1970,1,1)).TotalSeconds;
  
    // обратно устанавливаем статус=0 (свободен) и время последнего использования устанавливаем на текущее
    db.query("UPDATE accounts SET status=0, use_time="+unixtime.ToString()+" WHERE id="+acc_id);
}
Только начинаю интересоваться этой темой.
Какой тип данных должен быть в колонке use_time?
Там ведь для даты есть свои типы.
Приветствую. В данном примере int unsigned ... но вы правы, для дат есть специализированные типы типа timestamp ... просто зачастую мне удобнее использовать просто int unsigned
 
  • Thank you
Reactions: bizzon

Rimen

Client
Joined
Oct 28, 2019
Messages
406
Reaction score
254
Points
63
Работаю по этому мануалу уже давно, много где в сценариях прикрутил работу с базой данных. БД храню на хостинге, доступ по ip + логин + пароль

пару дней назад перестало работать, везде в шабах такая ошибка:
Unable to connect to any of the specified MySQL hosts.
при этом нигде ничего не менял, на хостере доступы без обновлений тоже

подскажите куда копать?
 

morpheus93

Client
Joined
Jan 25, 2012
Messages
1,064
Reaction score
248
Points
63
Здравствуйте,

отличная статья, большое спасибо. Я использую ваш подход в паре проектов, и он отлично работает.

Но возник один вопрос: Иногда, если в проекте проходит много времени между двумя действиями с базой данных, соединение с базой данных разрывается и больше не открывается. Когда ZP/PM доходит до следующего куба БД, он выдает ошибку. На другом сайте, если я добавлю код "open connection" в вершину каждого db-куба, то через некоторое время у меня будут открыты десятки неиспользуемых соединений.

Как я могу проверить, открыто ли еще соединение (и действительно ли оно) перед выполнением вставки/обновления (методы getOne, getRow) и если нет, то просто открыть его снова, иначе переходить непосредственно к db-действиям?

Спасибо :-)

PS: Поскольку я не говорю по-русски, прошу извинить меня, если эта тема уже обсуждалась, и, возможно, дать мне ссылку на нее.

Переведено с помощью www.DeepL.com/Translator (бесплатная версия)
 

Koqpe

Client
Joined
Dec 23, 2014
Messages
1,099
Reaction score
648
Points
113
то через некоторое время у меня будут открыты десятки неиспользуемых соединений.
C#:
// завершаем сессию
db.close();
 

morpheus93

Client
Joined
Jan 25, 2012
Messages
1,064
Reaction score
248
Points
63
Спасибо, но я уже закрываю соединение с помощью db.close() в конце проекта (хороший/плохой конец).
Но мне нужна функция, которая проверяет состояние соединения во время выполнения проекта, если оно все еще открыто и действительно (так как соединение пропадает после того, как ZP поработает некоторое время на сайте).

Я нашел в документации библиотеки MySql.Data.dll, что есть свойство Connection.State, но я не уверен, что это правильное свойство и как его можно использовать.

Уже пробовал что-то вроде:

var db = project.Context["db"];

if(db.state() != "Open" ) {
db = new DB(db_host, db_user, db_pswd, db_database, db_charset);
project.SendInfoToLog("Re-connected to DB", false);
db.open();
project.Context["db"] = db;
}
//LOCK
db.query("LOCK TABLES table1 WRITE;");

db.query(@"INSERT INTO table1
.....
.....


но, похоже, это не работает :(
 

Sardol

Client
Joined
Sep 23, 2020
Messages
193
Reaction score
45
Points
28
Спасибо, но я уже закрываю соединение с помощью db.close() в конце проекта (хороший/плохой конец).
Но мне нужна функция, которая проверяет состояние соединения во время выполнения проекта, если оно все еще открыто и действительно (так как соединение пропадает после того, как ZP поработает некоторое время на сайте).

Я так проверяю:

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

db.query("LOCK TABLES name_tables WRITE");
db.query("UNLOCK TABLES");
Если уходит по зелёной есть соединение, уходит по красной - нет.
 

bitardenko

Client
Joined
Dec 27, 2020
Messages
91
Reaction score
73
Points
18
Выкладываю свою слегка доработанную версию
C#:
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;charset=utf8";
            conn = new MySqlConnection(connectionString);

            open();
        }

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

        
        public void close(){
            conn.Close();   
        }       
        
        
        public void query(string query){
            if ( conn.State != ConnectionState.Open ){
                open(); 
            }
            try{
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
            }
            catch (MySqlException ex){
                open();
                
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
                
            }
        }
        
        public List<string> getAll(string query, string fieldSeparator="|"){
            if ( conn.State != ConnectionState.Open ){
                open();   
            }
            
            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<Dictionary<string, string>> getAllByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open();   
            }
            
            try
            {
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);           
                MySqlDataReader reader = command.ExecuteReader();
    
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                    
                    result.Add(fields);
                    
                }
                reader.Close();
                
                return result;
            }
            catch(MySqlException ex)
            {
                open();
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);           
                MySqlDataReader reader = command.ExecuteReader();
    
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                    
                    result.Add(fields);
                    
                }
                reader.Close();
                
                return result;   
            }
        }


        public List<string> getRow(string query){
            if ( conn.State != ConnectionState.Open ){
                open();   
            }
            
            try
            {
                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>();   
            }
            catch (MySqlException ex)
            {
                open();
                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 Dictionary<string, string> getRowByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open();   
            }
            try{
            MySqlCommand command = new MySqlCommand(query, conn);           
            
            MySqlDataReader reader = command.ExecuteReader();
            
            if ( reader.Read() ){

                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();
                
                reader.Close();
                return result;               
            }
            
            reader.Close();
            return new Dictionary<string, string>();   
            
            
            }
            catch (MySqlException ex)
            {
            open();
            MySqlCommand command = new MySqlCommand(query, conn);           
            
            MySqlDataReader reader = command.ExecuteReader();
            
            if ( reader.Read() ){
        
                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();

                reader.Close();
                return result;               
            }
            
            reader.Close();
            return new Dictionary<string, string>();   
            
            
                
                
            }
        }
        
        
        public string getOne(string query){
            if ( conn.State != ConnectionState.Open ){
                open();   
            }
             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);
        }
        
    }
Отличий примерно 3
Добавлены блоки try/catch, если возникает исключение, то вызывается open(), не знаю насколько это грамотно, но это полностью решило мои проблемы с постоянными ошибками о чем писал в теме выше.
Добавлены методы(вроде так это называется) getAllByName и getRowByName, можно получать значения по имени столбца, например
Dictionary<string, string> row = db.getRowByName("SELECT * FROM table");
return row["id"];
 

morpheus93

Client
Joined
Jan 25, 2012
Messages
1,064
Reaction score
248
Points
63
Выкладываю свою слегка доработанную версию
C#:
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;charset=utf8";
            conn = new MySqlConnection(connectionString);

            open();
        }

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

       
        public void close(){
            conn.Close();  
        }      
       
       
        public void query(string query){
            if ( conn.State != ConnectionState.Open ){
                open();
            }
            try{
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
            }
            catch (MySqlException ex){
                open();
               
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
               
            }
        }
       
        public List<string> getAll(string query, string fieldSeparator="|"){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
           
            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<Dictionary<string, string>> getAllByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
           
            try
            {
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);          
                MySqlDataReader reader = command.ExecuteReader();
   
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                   
                    result.Add(fields);
                   
                }
                reader.Close();
               
                return result;
            }
            catch(MySqlException ex)
            {
                open();
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);          
                MySqlDataReader reader = command.ExecuteReader();
   
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                   
                    result.Add(fields);
                   
                }
                reader.Close();
               
                return result;  
            }
        }


        public List<string> getRow(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
           
            try
            {
                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>();  
            }
            catch (MySqlException ex)
            {
                open();
                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 Dictionary<string, string> getRowByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
            try{
            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
           
            if ( reader.Read() ){

                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();
               
                reader.Close();
                return result;              
            }
           
            reader.Close();
            return new Dictionary<string, string>();  
           
           
            }
            catch (MySqlException ex)
            {
            open();
            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
           
            if ( reader.Read() ){
       
                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();

                reader.Close();
                return result;              
            }
           
            reader.Close();
            return new Dictionary<string, string>();  
           
           
               
               
            }
        }
       
       
        public string getOne(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
             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);
        }
       
    }
Отличий примерно 3
Добавлены блоки try/catch, если возникает исключение, то вызывается open(), не знаю насколько это грамотно, но это полностью решило мои проблемы с постоянными ошибками о чем писал в теме выше.
Добавлены методы(вроде так это называется) getAllByName и getRowByName, можно получать значения по имени столбца, например
Dictionary<string, string> row = db.getRowByName("SELECT * FROM table");
return row["id"];
Большое спасибо, что поделились своим решением. Я попробую сделать это таким образом.
 

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
Выкладываю свою слегка доработанную версию
C#:
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;charset=utf8";
            conn = new MySqlConnection(connectionString);

            open();
        }

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

      
        public void close(){
            conn.Close(); 
        }     
      
      
        public void query(string query){
            if ( conn.State != ConnectionState.Open ){
                open();
            }
            try{
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
            }
            catch (MySqlException ex){
                open();
              
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
              
            }
        }
      
        public List<string> getAll(string query, string fieldSeparator="|"){
            if ( conn.State != ConnectionState.Open ){
                open(); 
            }
          
            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<Dictionary<string, string>> getAllByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open(); 
            }
          
            try
            {
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);         
                MySqlDataReader reader = command.ExecuteReader();
  
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                  
                    result.Add(fields);
                  
                }
                reader.Close();
              
                return result;
            }
            catch(MySqlException ex)
            {
                open();
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);         
                MySqlDataReader reader = command.ExecuteReader();
  
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                  
                    result.Add(fields);
                  
                }
                reader.Close();
              
                return result; 
            }
        }


        public List<string> getRow(string query){
            if ( conn.State != ConnectionState.Open ){
                open(); 
            }
          
            try
            {
                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>(); 
            }
            catch (MySqlException ex)
            {
                open();
                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 Dictionary<string, string> getRowByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open(); 
            }
            try{
            MySqlCommand command = new MySqlCommand(query, conn);         
          
            MySqlDataReader reader = command.ExecuteReader();
          
            if ( reader.Read() ){

                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();
              
                reader.Close();
                return result;             
            }
          
            reader.Close();
            return new Dictionary<string, string>(); 
          
          
            }
            catch (MySqlException ex)
            {
            open();
            MySqlCommand command = new MySqlCommand(query, conn);         
          
            MySqlDataReader reader = command.ExecuteReader();
          
            if ( reader.Read() ){
      
                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();

                reader.Close();
                return result;             
            }
          
            reader.Close();
            return new Dictionary<string, string>(); 
          
          
              
              
            }
        }
      
      
        public string getOne(string query){
            if ( conn.State != ConnectionState.Open ){
                open(); 
            }
             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);
        }
      
    }
Отличий примерно 3
Добавлены блоки try/catch, если возникает исключение, то вызывается open(), не знаю насколько это грамотно, но это полностью решило мои проблемы с постоянными ошибками о чем писал в теме выше.
Добавлены методы(вроде так это называется) getAllByName и getRowByName, можно получать значения по имени столбца, например
Dictionary<string, string> row = db.getRowByName("SELECT * FROM table");
return row["id"];
Можешь подсказать почему когда делаю так.
List<string> count = db.getRow("SELECT 'id_update' FROM offset WHERE 1");
то в переменной count[0] содержится название столбца id_update, а не его значение.

UPD : Разобрался, спасибо
 
Last edited:

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
Выкладываю свою слегка доработанную версию
C#:
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;charset=utf8";
            conn = new MySqlConnection(connectionString);

            open();
        }

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

       
        public void close(){
            conn.Close();  
        }      
       
       
        public void query(string query){
            if ( conn.State != ConnectionState.Open ){
                open();
            }
            try{
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
            }
            catch (MySqlException ex){
                open();
               
                MySqlCommand command = new MySqlCommand(query, conn);
                command.ExecuteNonQuery();
               
            }
        }
       
        public List<string> getAll(string query, string fieldSeparator="|"){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
           
            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<Dictionary<string, string>> getAllByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
           
            try
            {
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);          
                MySqlDataReader reader = command.ExecuteReader();
   
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                   
                    result.Add(fields);
                   
                }
                reader.Close();
               
                return result;
            }
            catch(MySqlException ex)
            {
                open();
                var result = new List<Dictionary<string, string>>();
                MySqlCommand command = new MySqlCommand(query, conn);          
                MySqlDataReader reader = command.ExecuteReader();
   
                while (reader.Read())
                {
                    Dictionary<string, string> fields = new Dictionary<string, string>();
                    for(int i=0; i<reader.FieldCount; i++)
                    fields[reader.GetName(i).ToString()] = reader[i].ToString();
                   
                    result.Add(fields);
                   
                }
                reader.Close();
               
                return result;  
            }
        }


        public List<string> getRow(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
           
            try
            {
                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>();  
            }
            catch (MySqlException ex)
            {
                open();
                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 Dictionary<string, string> getRowByName(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
            try{
            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
           
            if ( reader.Read() ){

                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();
               
                reader.Close();
                return result;              
            }
           
            reader.Close();
            return new Dictionary<string, string>();  
           
           
            }
            catch (MySqlException ex)
            {
            open();
            MySqlCommand command = new MySqlCommand(query, conn);          
           
            MySqlDataReader reader = command.ExecuteReader();
           
            if ( reader.Read() ){
       
                Dictionary<string, string> result = new Dictionary<string, string>();
                for(int i=0; i<reader.FieldCount; i++)
                result[reader.GetName(i).ToString()] = reader[i].ToString();

                reader.Close();
                return result;              
            }
           
            reader.Close();
            return new Dictionary<string, string>();  
           
           
               
               
            }
        }
       
       
        public string getOne(string query){
            if ( conn.State != ConnectionState.Open ){
                open();  
            }
             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);
        }
       
    }
Отличий примерно 3
Добавлены блоки try/catch, если возникает исключение, то вызывается open(), не знаю насколько это грамотно, но это полностью решило мои проблемы с постоянными ошибками о чем писал в теме выше.
Добавлены методы(вроде так это называется) getAllByName и getRowByName, можно получать значения по имени столбца, например
Dictionary<string, string> row = db.getRowByName("SELECT * FROM table");
return row["id"];
Есть другой вопрос. Можно сделать подключение в общем коде, чтобы в каждом кубике C# процедуру подключения не делать?
 

bitardenko

Client
Joined
Dec 27, 2020
Messages
91
Reaction score
73
Points
18
Есть другой вопрос. Можно сделать подключение в общем коде, чтобы в каждом кубике C# процедуру подключения не делать?
А зачем её делать в каждом кубике?
Подключаемся в первом кубике
C#:
DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);
project.Context["db"] = db;
А потом в последующих кубиках берем подключение из контекста
C#:
var db = project.Context["db"];
В этом же весь смысл темы, либо я не так понял вопрос.
 
Last edited:
  • Thank you
Reactions: Gooldbee

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
А зачем её делать в каждом кубике?
Подключаемся в первом кубике
C#:
DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);
А потом в последующих кубиках берем подключение из контекста
C#:
project.Context["db"] = db;
В этом же весь смысл темы, либо я не так понял вопрос.
Спасибо
 
Last edited:

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
А зачем её делать в каждом кубике?
Подключаемся в первом кубике
C#:
DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);
project.Context["db"] = db;
А потом в последующих кубиках берем подключение из контекста
C#:
var db = project.Context["db"];
В этом же весь смысл темы, либо я не так понял вопрос.
Извиняюсь, такой вопрос еще
вот этот код добавляю в новый кубик. Когда просто запускаешь все работает, а если пошагово в режиме отладки, то вылазит ошибка и останавливает код
C#:
var db = project.Context["db"];
List<Dictionary<string, string>> userCount = db.getAllByName("SELECT * FROM message WHERE id_chat = "+project.Variables["chat_id"].Value);
//project.SendInfoToLog(project.Variables["chat_id"].ToString(),true);
project.SendInfoToLog(userCount[1]["text"],true);
вот эта ошибка

C#:
Необработанное исключение Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Не удается выполнить привязки исполняющей среды по нулевой ссылке. 

Выполнение действия CSharp OwnCode: Профиль. Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Не удается выполнить привязки исполняющей среды по нулевой ссылке. 

 Сбойное действие: Профиль
 
Last edited:

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
@WebBot
Ответь, пожалуйста, если знаешь решение
 

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
Code:
Тип    Время    Сообщение
    03:11:44    Выполнение действия CSharp OwnCode. The connection is already open.
Еще такой вопрос. Сделал шаблон. Там подключение к базе данных.
Запускаю шаблон в зенке, все норм. Работает. Как только запускаю другой шаблон который обращается к этой же базе данных и делает подключение, вылазит эта ошибка
 
Last edited:

bitardenko

Client
Joined
Dec 27, 2020
Messages
91
Reaction score
73
Points
18
C#:
Выполнение действия CSharp OwnCode: Профиль. Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Не удается выполнить привязки исполняющей среды по нулевой ссылке.
Ловил несколько раз подобные ошибки, но сейчас уже не помню как их решал, если не ошибаюсь в основном они были связаны с неправильным запросом/синтаксисом. Без FROM запрос отрабатывает?
Сейчас такие ошибки на запрос INSERT, а SELECT работает без ошибок, хотя ранее и SELECT не работал. Чуть время прошло и снова все заработало. В чем может быть причина?
@bitardenko использую Ваш вариант класса DB доработанный
Не знаю влияет ли это как то или мне кажется, но есть ощущение, что это начинает происходить когда обращаюсь к базе с двух шаблонов запущенных одновременно. У меня просто один шаблон одну функцию выполняет, а другой другую, но база данных у них одна.
Я бы рекомендовал начать с оригинальной версии, ручаться за свой высер я не могу потому что не программист и делаю всё методом тыка, хоть у меня он и работает стабильно в многопотоке.
 

bitardenko

Client
Joined
Dec 27, 2020
Messages
91
Reaction score
73
Points
18
Code:
Выполнение действия CSharp OwnCode. The connection is already open.
А эта ошибка именно из-за моей версии, потому что как я писал если возникает исключение MySqlException, вызывается open(). Сделал я это потому что когда пропадала сессия, поднять её посредством кода вроде
C#:
            if ( conn.State != ConnectionState.Open ){
                open();
            }
не получалось и шаблоны крашились. По хорошему в моей "версии" надо смотреть что именно находится в исключении и вызывать open() только в нужном случае, но тестировать, ловить исключения, переписывать высер желания и времени нет, к тому же как я говорил у меня он работает стабильно и исключение это возникает только когда падает соединение

Сама ваша проблема, вероятно, глубже, и MySqlException вызывает что-то еще, но однозначно стоит пока использовать оригинальную версию
 
Last edited:

Gooldbee

Client
Joined
May 16, 2019
Messages
224
Reaction score
25
Points
28
Ловил несколько раз подобные ошибки, но сейчас уже не помню как их решал, если не ошибаюсь в основном они были связаны с неправильным запросом/синтаксисом. Без FROM запрос отрабатывает?

Я бы рекомендовал начать с оригинальной версии, ручаться за свой высер я не могу потому что не программист и делаю всё методом тыка, хоть у меня он и работает стабильно в многопотоке.
Все работает. Единственное только не могу понять почему когда из контекста переношу подключение в другие кубики в режиме отладки выдает ошибку и останавливает кубик, а если запускать просто на работу, то все работает.
 

morpheus93

Client
Joined
Jan 25, 2012
Messages
1,064
Reaction score
248
Points
63
А зачем её делать в каждом кубике?
Подключаемся в первом кубике
C#:
DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);
project.Context["db"] = db;
А потом в последующих кубиках берем подключение из контекста
C#:
var db = project.Context["db"];
В этом же весь смысл темы, либо я не так понял вопрос.
Рекомендуется ли устанавливать пулинг в true в строке подключения (var connectionString = "server="+db_hostname+";user="+db_username+";database="+db_database+";port="+db_port+";password="+db_password+";pooling=False;charset=utf8";-)? Имеет ли это смысл или это приведет к неожиданным ошибкам и/или неправильному поведению?

Большое спасибо.
 

artsmm

Client
Joined
Oct 3, 2018
Messages
1,136
Reaction score
196
Points
63
Привет. Как проверить наличие таблицы в базе данных с данной библиотекой? Составил запрос:
C#:
CREATE TABLE `test`.`OrdersPane` ( `OrderId` TEXT NOT NULL , `productSumm` TEXT NOT NULL , `keyword` TEXT NOT NULL , `tovid` TEXT NOT NULL, `brandName` TEXT NOT NULL, `Size` TEXT NOT NULL, `tovid` TEXT NOT NULL, `deliveryAdress` TEXT NOT NULL, `buyCounts` TEXT NOT NULL) ENGINE = InnoDB
на создание БД.
в Sql мне приходит ответ, что есть дубликат таблицы. Как получить данный ответ в зенке?

вопрос решен через try catch
 
Last edited:

rol

Client
Joined
Sep 19, 2017
Messages
43
Reaction score
7
Points
8
Всем привет.
Подскажите как реализовать такую конструкцию в данном методе C# брать одну строку с удалением для многопотока

Один кубик добавляет в таблицу,
А второй берет строку с удалением (работает в многопотоке)

ПЕРВЫЙ КУБИК
Добавляем данные в таблицу
INSERT INTO `accounts` (`ID`) VALUES ('{-Variable.ran-}');


ВТОРОЙ КУБИК (работает в многопотоке)

Читаем сточку из таблицы
SELECT `ID` FROM `accounts` LIMIT 1

удаляем прочитанную строчку
DELETE FROM `accounts` WHERE ID={-Variable.mysql-}
 

rol

Client
Joined
Sep 19, 2017
Messages
43
Reaction score
7
Points
8
Всем спасибо разобрался

Всем привет.
Подскажите как реализовать такую конструкцию в данном методе C# брать одну строку с удалением для многопотока

Один кубик добавляет в таблицу,
А второй берет строку с удалением (работает в многопотоке)

ПЕРВЫЙ КУБИК
Добавляем данные в таблицу
INSERT INTO `accounts` (`ID`) VALUES ('{-Variable.ran-}');


ВТОРОЙ КУБИК (работает в многопотоке)

Читаем сточку из таблицы
SELECT `ID` FROM `accounts` LIMIT 1

удаляем прочитанную строчку
DELETE FROM `accounts` WHERE ID={-Variable.mysql-}
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)