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

  • Автор темы Автор темы WebBot
  • Дата начала Дата начала
  • Теги Теги
    mysql
Помогите понять где ошибся
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]
 
Точно подцепил библиотеку в using и GAC? Точно есть класс в общем коде?
файл скопировал, про классы вот только додумался, скопировал, но теперь пишет
93036
 
что самое интересное на шаблоне автора прописал свои данные подключение и там пишет
Выполнение действия CSharp OwnCode. Table 'myfirstdb.accounts' doesn't exist
 
сли таблица в бд не такая как у автора что работать не будет?
 
Можно ли получать SELECT не в список, а в переменные? Подскажите, пожалуйста, код
 
Можно ли получать 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
Можно ли получать SELECT не в список, а в переменные? Подскажите, пожалуйста, код
Ты получаешь массив значений, поэтому кладёшь в лист, тебе нужно его потом разобрать на переменные. Либо если у тебя только 1 значение нужно получить и сразу в переменную, используй var a = db.getOne();
 
Приветствую. Как залить картинку в базу данных?
 
Приветствую. Как залить картинку в базу данных?
Для начала конвертируем в 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
а если база на отдельном сервере стоит ?
да это в общем-то никакой роли в данном случае не играет
вы же сохраняете путь к файлу на нужном/известном вам сервере, а при неоходимости с удаленной базы его получаете

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

как например работают многие сайты:
есть отдельный сервер картинок куда загружаются все картинки залитые юзерами и складываются по папкам типа /images/user732423/image45654.jpg ... они соответственно доступны по какому-то URL типа myimageserver1.com//images/user732423/image45654.jpg и основной сайт их с этого отдельного сервера картинок и подгружает при загрузке страниц пользьователями. Так работают все соцсети и вообще большинство относительно крупных сайтов.
А есть удаленная БД на отдельном сервере где хранятся все данные юзеров, в том числе пути к картинкам на этом самом myimagesserver1.com
Как вы боретесь со Sleep-ами, которые нагружают систему и не закрываются? Я пока додумался только к методу kill task методом перебора и все.
95086
 
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);
        }
       
    }  
   
}
 
Иногда выбивает ошибку
Выполнение действия CSharp OwnCode. Authentication to host 'localhost' for user 'root' using method 'caching_sha2_password' failed with message: Reading from the stream has failed.
В чем может быть дело, подскажите кто знает.
 
А при добавлении данных, все-таки надо блокировать таблицу или нет?
 
Иногда выбивает ошибку

В чем может быть дело, подскажите кто знает.
  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
  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
Парни еще вопрос, мб кто то сталкивался. Ошибка
Screenshot_331.png

Тот же запрос с теме же данными другими способами выполняется без ошибок. Именно через сишарп ошибка. Все данные валидны, хз куда копать..
 
Парни еще вопрос, мб кто то сталкивался. Ошибка
Посмотреть вложение 97352
Тот же запрос с теме же данными другими способами выполняется без ошибок. Именно через сишарп ошибка. Все данные валидны, хз куда копать..
решено. я делал эскейп строк db.escapeString убрал где не нужно. вроде все ок
 
Всем привет , можно ли подключить данный метод к PostgreSQL ?
 
Пользуюсь кодом автора для получения аккаунтов из базы с проставлением статусов - взят в работу (status=1).
Проблема в том, что при завершении работы шаблона в базе остаётся много записей status=1.
В настройках "выполнять бэденд при прерывании" ставлю.
Аккаунты бывают в работе по часу и больше. Я так понимаю - это рвётся соединение с БД?
Как этого избежать или исправить?
 
Ребят, кто подскажет, вероятно на выполнение кубика c# есть какой то таймаут в 30 сек, потому что проект выполняется 30 сек и выпадает с ошибкой. А в проекте большой запрос к бд, и он не успевает за 30 сек. Как этот таймаут убрать?
 
Подскажите пожалуйста можно ли в данном коде лочить не всю таблицу а построчно
 
Подскажите пожалуйста можно ли в данном коде лочить не всю таблицу а построчно
Насколько мне известно, лочить можно только таблицу целиком. И дело не в коде автора. Это возможности мускула.
 

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