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

nik-n

Client
Регистрация
05.11.2016
Сообщения
242
Благодарностей
20
Баллы
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
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
63
в базу данных нормально пишутся русские тексты? у меня проблема с кодировкой. Пробовал выставить Utf8, но это не помогает. В чем вопрос может быть?
 

iskrakovrov

Client
Регистрация
28.03.2015
Сообщения
532
Благодарностей
171
Баллы
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);


В примерах в теме это не прописано
 
  • Спасибо
Реакции: artsmm

fazan

Client
Регистрация
25.12.2014
Сообщения
97
Благодарностей
9
Баллы
8
Всем привет. Помогите пжл правильно указать переменные в 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();
 

Вложения

usboff

Client
Регистрация
25.08.2021
Сообщения
89
Благодарностей
49
Баллы
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();
Одинарные кавычки должны находиться ВНУТРИ двойных.

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();
 
  • Спасибо
Реакции: fazan

fazan

Client
Регистрация
25.12.2014
Сообщения
97
Благодарностей
9
Баллы
8
Одинарные кавычки должны находиться ВНУТРИ двойных.

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();
Спасибо!
 
  • Спасибо
Реакции: usboff

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 103
Благодарностей
132
Баллы
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
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
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
 
  • Спасибо
Реакции: bizzon

Rimen

Client
Регистрация
28.10.2019
Сообщения
406
Благодарностей
254
Баллы
63
Работаю по этому мануалу уже давно, много где в сценариях прикрутил работу с базой данных. БД храню на хостинге, доступ по ip + логин + пароль

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

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

morpheus93

Client
Регистрация
25.01.2012
Сообщения
1 058
Благодарностей
244
Баллы
63
Здравствуйте,

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

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

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

Спасибо :-)

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

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

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113

morpheus93

Client
Регистрация
25.01.2012
Сообщения
1 058
Благодарностей
244
Баллы
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
Регистрация
23.09.2020
Сообщения
194
Благодарностей
45
Баллы
28
Спасибо, но я уже закрываю соединение с помощью db.close() в конце проекта (хороший/плохой конец).
Но мне нужна функция, которая проверяет состояние соединения во время выполнения проекта, если оно все еще открыто и действительно (так как соединение пропадает после того, как ZP поработает некоторое время на сайте).

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

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

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

bitardenko

Client
Регистрация
27.12.2020
Сообщения
91
Благодарностей
73
Баллы
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"];
 
  • Спасибо
Реакции: zennoX и morpheus93

morpheus93

Client
Регистрация
25.01.2012
Сообщения
1 058
Благодарностей
244
Баллы
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
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
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 : Разобрался, спасибо
 
Последнее редактирование:

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
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
Регистрация
27.12.2020
Сообщения
91
Благодарностей
73
Баллы
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"];
В этом же весь смысл темы, либо я не так понял вопрос.
 
Последнее редактирование:
  • Спасибо
Реакции: Gooldbee

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
28
А зачем её делать в каждом кубике?
Подключаемся в первом кубике
C#:
DB db = new DB(db_host, db_user, db_pswd, db_database, db_charset);
А потом в последующих кубиках берем подключение из контекста
C#:
project.Context["db"] = db;
В этом же весь смысл темы, либо я не так понял вопрос.
Спасибо
 
Последнее редактирование:

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
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: Не удается выполнить привязки исполняющей среды по нулевой ссылке. 

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

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
28
@WebBot
Ответь, пожалуйста, если знаешь решение
 

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
28

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
28
Код:
Тип    Время    Сообщение
    03:11:44    Выполнение действия CSharp OwnCode. The connection is already open.
Еще такой вопрос. Сделал шаблон. Там подключение к базе данных.
Запускаю шаблон в зенке, все норм. Работает. Как только запускаю другой шаблон который обращается к этой же базе данных и делает подключение, вылазит эта ошибка
 
Последнее редактирование:

bitardenko

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

bitardenko

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

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

Gooldbee

Client
Регистрация
16.05.2019
Сообщения
224
Благодарностей
25
Баллы
28
Ловил несколько раз подобные ошибки, но сейчас уже не помню как их решал, если не ошибаюсь в основном они были связаны с неправильным запросом/синтаксисом. Без FROM запрос отрабатывает?

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

morpheus93

Client
Регистрация
25.01.2012
Сообщения
1 058
Благодарностей
244
Баллы
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
Регистрация
03.10.2018
Сообщения
1 136
Благодарностей
196
Баллы
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
 
Последнее редактирование:

rol

Client
Регистрация
19.09.2017
Сообщения
44
Благодарностей
7
Баллы
8
Всем привет.
Подскажите как реализовать такую конструкцию в данном методе C# брать одну строку с удалением для многопотока

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

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


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

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

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

rol

Client
Регистрация
19.09.2017
Сообщения
44
Благодарностей
7
Баллы
8
Всем спасибо разобрался

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

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

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


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

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

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

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