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

skullster

Client
Регистрация
05.10.2018
Сообщения
13
Благодарностей
1
Баллы
3
Помогите понять где ошибся
string db_host = project.Variables["SqlServer"].Value; // хост
string db_user = project.Variables["SqlLogin"].Value; // username для подключения к MySQL
string db_pswd = project.Variables["SqlPass"].Value; // пароль для подключения к MySQL
string db_database = project.Variables["DBName"].Value; // название БД с которой будет работа
string db_charset = "utf8"; // кодировка данных в таблицах

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

// сохраняем объект в контексте что бы использовать его в других кубиках
project.Context["db"] = db;
вот так отредактировал код автора, а кубик не выполняется пишет
Компиляция кода Ошибка в действии "CS0246" "The type or namespace name 'DB' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 7; Cтолбец: 13]
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
241
Благодарностей
75
Баллы
28

skullster

Client
Регистрация
05.10.2018
Сообщения
13
Благодарностей
1
Баллы
3

skullster

Client
Регистрация
05.10.2018
Сообщения
13
Благодарностей
1
Баллы
3
что самое интересное на шаблоне автора прописал свои данные подключение и там пишет
Выполнение действия CSharp OwnCode. Table 'myfirstdb.accounts' doesn't exist
 

skullster

Client
Регистрация
05.10.2018
Сообщения
13
Благодарностей
1
Баллы
3
сли таблица в бд не такая как у автора что работать не будет?
 

skullster

Client
Регистрация
05.10.2018
Сообщения
13
Благодарностей
1
Баллы
3

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18
Можно ли получать SELECT не в список, а в переменные? Подскажите, пожалуйста, код
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
Можно ли получать SELECT не в список, а в переменные? Подскажите, пожалуйста, код
А в чем проблема сделать так?
Код:
List<string> row = db.getRow("SELECT .... FROM .... WHERE 1 LIMIT 1");
if (row.Count > 0)
{
            project.Variables["B0_IDProfile"].Value = row[0];
            project.Variables["B0_Login"].Value = row[1];
            project.Variables["B1_Pass"].Value = row[2];
            project.Variables["B3_TimeLastWork"].Value = row[3];
}
 
  • Спасибо
Реакции: zennoX и braind

Philipp

Client
Регистрация
14.10.2019
Сообщения
95
Благодарностей
38
Баллы
18
Можно ли получать SELECT не в список, а в переменные? Подскажите, пожалуйста, код
Ты получаешь массив значений, поэтому кладёшь в лист, тебе нужно его потом разобрать на переменные. Либо если у тебя только 1 значение нужно получить и сразу в переменную, используй var a = db.getOne();
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 110
Благодарностей
195
Баллы
63
Приветствую. Как залить картинку в базу данных?
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
Приветствую. Как залить картинку в базу данных?
Для начала конвертируем в base64 и потом загружаем картинку как текст
C#:
string file =project.Variables["ИмяЗенноПеременнойСссылкойНаКартинку"].Value;
// В лог вернет сконвертированную картинку в base64
return Convert.ToBase64String(System.IO.File.ReadAllBytes(file));

Потом скачиваем base64 картинки из базы и сохраняем как изображение
C#:
string base64str = "Код Картинки Base64"
File.WriteAllBytes(@"ПутьКудаСохранитьКартинку", Convert.FromBase64String(base64str));
 
  • Спасибо
Реакции: artsmm

WebBot

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 690
Баллы
113

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 718
Благодарностей
1 376
Баллы
113
а если база на отдельном сервере стоит ?
да это в общем-то никакой роли в данном случае не играет
вы же сохраняете путь к файлу на нужном/известном вам сервере, а при неоходимости с удаленной базы его получаете

как например работают многие сайты:
есть отдельный сервер картинок куда загружаются все картинки залитые юзерами и складываются по папкам типа /images/user732423/image45654.jpg ... они соответственно доступны по какому-то URL типа myimageserver1.com//images/user732423/image45654.jpg и основной сайт их с этого отдельного сервера картинок и подгружает при загрузке страниц пользьователями. Так работают все соцсети и вообще большинство относительно крупных сайтов.
А есть удаленная БД на отдельном сервере где хранятся все данные юзеров, в том числе пути к картинкам на этом самом myimagesserver1.com
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 444
Благодарностей
1 287
Баллы
113
да это в общем-то никакой роли в данном случае не играет
вы же сохраняете путь к файлу на нужном/известном вам сервере, а при неоходимости с удаленной базы его получаете

как например работают многие сайты:
есть отдельный сервер картинок куда загружаются все картинки залитые юзерами и складываются по папкам типа /images/user732423/image45654.jpg ... они соответственно доступны по какому-то URL типа myimageserver1.com//images/user732423/image45654.jpg и основной сайт их с этого отдельного сервера картинок и подгружает при загрузке страниц пользьователями. Так работают все соцсети и вообще большинство относительно крупных сайтов.
А есть удаленная БД на отдельном сервере где хранятся все данные юзеров, в том числе пути к картинкам на этом самом myimagesserver1.com
Как вы боретесь со Sleep-ами, которые нагружают систему и не закрываются? Я пока додумался только к методу kill task методом перебора и все.
95086
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 088
Благодарностей
126
Баллы
63
1) посмотреть в конфиге mysql сколько вообще одновременных подключений разрешено - параметр max_connections
2) выставить в конфеге mysql достаточный wait_timeout - возможно сервер банально разрывает соединение из-за того что нет активности
3) дописать в методы getOne, getRow, getAll, query проверку на валидность соединения перед их выполнением и если не валидно - опять делать open

примерно так
C#:
if ( conn.State != ConnectionState.Open ){
    open(); 
}
Прошу прощения за свою необразованность в C#, могли бы вы в общем коде показать как дописать проверку на валидность соединения.

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

namespace ZennoLab.OwnCode
{
    /// <summary>
    /// A simple class of the common code
    /// </summary>
    public class CommonCode
    {
        /// <summary>
        /// Lock this object to mark part of code for single thread execution
        /// </summary>
        public static object SyncObject = new object();

        // Insert your code here
    }
   
   
    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;allowuservariables=True;";
            conn = new MySqlConnection(connectionString);

            open();
        }

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

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

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

        public List<string> getRow(string query){

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

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

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Иногда выбивает ошибку
Выполнение действия CSharp OwnCode. Authentication to host 'localhost' for user 'root' using method 'caching_sha2_password' failed with message: Reading from the stream has failed.
В чем может быть дело, подскажите кто знает.
 

ikibostus

Client
Регистрация
27.09.2015
Сообщения
252
Благодарностей
26
Баллы
28
А при добавлении данных, все-таки надо блокировать таблицу или нет?
 

ikibostus

Client
Регистрация
27.09.2015
Сообщения
252
Благодарностей
26
Баллы
28
Иногда выбивает ошибку

В чем может быть дело, подскажите кто знает.
  1. Open MYSQL Command Line
  2. Type in your password
  3. Enter the following:
    SHOW GLOBAL VARIABLES LIKE 'local_infile';
  4. If local_infile value is equal to false set it to true by:
    SET GLOBAL local_infile = true;
 
  • Спасибо
Реакции: Wide

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
  1. Open MYSQL Command Line
  2. Type in your password
  3. Enter the following:
    SHOW GLOBAL VARIABLES LIKE 'local_infile';
  4. If local_infile value is equal to false set it to true by:
    SET GLOBAL local_infile = true;
Спасибо добрый человек, сделал чуть быстрее и проще) осталось только проверить...

Screenshot_326.png
 
  • Спасибо
Реакции: ikibostus

ikibostus

Client
Регистрация
27.09.2015
Сообщения
252
Благодарностей
26
Баллы
28

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
  • Спасибо
Реакции: ikibostus

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Парни еще вопрос, мб кто то сталкивался. Ошибка
Screenshot_331.png

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

Wide

Client
Регистрация
04.02.2013
Сообщения
944
Благодарностей
252
Баллы
63
Парни еще вопрос, мб кто то сталкивался. Ошибка
Посмотреть вложение 97352
Тот же запрос с теме же данными другими способами выполняется без ошибок. Именно через сишарп ошибка. Все данные валидны, хз куда копать..
решено. я делал эскейп строк db.escapeString убрал где не нужно. вроде все ок
 

rol

Client
Регистрация
19.09.2017
Сообщения
42
Благодарностей
7
Баллы
8
Всем привет , можно ли подключить данный метод к PostgreSQL ?
 

minfin

Client
Регистрация
13.01.2020
Сообщения
144
Благодарностей
99
Баллы
28
Пользуюсь кодом автора для получения аккаунтов из базы с проставлением статусов - взят в работу (status=1).
Проблема в том, что при завершении работы шаблона в базе остаётся много записей status=1.
В настройках "выполнять бэденд при прерывании" ставлю.
Аккаунты бывают в работе по часу и больше. Я так понимаю - это рвётся соединение с БД?
Как этого избежать или исправить?
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18
Ребят, кто подскажет, вероятно на выполнение кубика c# есть какой то таймаут в 30 сек, потому что проект выполняется 30 сек и выпадает с ошибкой. А в проекте большой запрос к бд, и он не успевает за 30 сек. Как этот таймаут убрать?
 

rol

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

n0n3mi1y

Client
Регистрация
08.03.2017
Сообщения
1 127
Благодарностей
484
Баллы
83
Подскажите пожалуйста можно ли в данном коде лочить не всю таблицу а построчно
Насколько мне известно, лочить можно только таблицу целиком. И дело не в коде автора. Это возможности мускула.
 

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