5 место Z-TehnOman Part1. Cобственные классы, MySQL и Dapper — взаимодействие с БД проще, код чище, а нервы крепче

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
399
Баллы
63

Компиляция кода Ошибка в действии "CS0246" "The type or namespace name 'User' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 13; Cтолбец: 7]


Кто подскажет почему так? Все директивы прописаны, файлы добавил в ExternalAssemblies.
А вы сам класс User в общем коде прописали?
 

woodoo1

Client
Регистрация
10.06.2014
Сообщения
21
Благодарностей
6
Баллы
3

semafor

Client
Регистрация
27.12.2016
Сообщения
289
Благодарностей
399
Баллы
63
В прилагаемом мной шаблоне, в общем коде я создал namespace DataClasses, в котором, в том числе, описываю класс User. Если вы пытаетесь написать свой шаб, то нужно описать данный класс в своем пространстве имен и указать его (пространство имен) в директивах using.

99526


Пример пространства имен из прилагаемого к статье шаба, содержащего класс User:

C#:
namespace DataClasses
{  
    using Dapper;
    using Dapper.Contrib;
    using Dapper.Contrib.Extensions;
   
    /// <summary>
    /// Тестовый класс для разбора работы с Dapper и Contrib
    /// </summary>
    public class Proxy
    {
        public int id {get; set;}
        public string protocol {get; set;}
        public string ip {get; set;}
        public string login {get; set;}
        public string pass {get; set;}
    }
   
    /// <summary>
    /// Тестовый класс для разбора работы с Dapper и Contrib
    /// </summary>
    public class User
    {
        public int id {get; set;}
        public string login {get; set;}
        public string pass {get; set;}
        public string email {get; set;}
    }
   
    /// <summary>
    /// Класс для примера работы с собчтв. классом, его методами и БД, выполняет операции с БД и подгтовку прокси к использованию
    /// </summary>
    public class Proxyserver
    {      
        public int id {get; set;}
        /// <summary>
        /// протокол работы
        /// </summary>
        public string protocol {get; set;}
        /// <summary>
        /// ip-адрес прокси
        /// </summary>
        public string ip {get; set;}
        /// <summary>
        /// Порт прокси
        /// </summary>
        public int port{get; set;}
        /// <summary>
        /// логин
        /// </summary>
        public string login {get; set;}
        /// <summary>
        /// пароль
        /// </summary>
        public string pass {get; set;}
        /// <summary>
        /// Св-во показывает, доступен ли в БД текущий объект Proxy для получения другим потокам
        /// </summary>
        public bool isuse {get; set;}
       
        public string connString;
        private IZennoPosterProjectModel project;
       
        /// <summary>
        /// Пустой конструктор класса
        /// </summary>
        public Proxyserver()
        {
           
        }
        /// <summary>
        /// Конструктор класса. Создает строку подключения к ДБ и отменяет мапинг по умолчанию для Dapper.Contrib
        /// </summary>
        /// <param name="project"></param>
        public Proxyserver(IZennoPosterProjectModel project)
        {
            Dapper.Contrib.Extensions.SqlMapperExtensions.TableNameMapper = (type) => type.Name;
            this.project = project;
            connString = String.Format("Data Source={0};UserId={1};Password={2};database={3};Charset={4};SSL Mode=None",
                                    project.Variables["DB_host"].Value,
                                    project.Variables["DB_user"].Value,
                                    project.Variables["DB_pass"].Value,
                                    project.Variables["DB_name"].Value,
                                    project.Variables["DB_charset"].Value);
        }
        /// <summary>
        /// Метод возвращает в текущий объект строку таблицы с указанным в параметре типом протокола, и выставляет в  этой строке БД  isuse = true
        /// </summary>
        /// <param name="protocolparam">тип протокола, строку с которым нужно получить </param>
        /// <param name="isuseparam">Значение ячейки isuse в БД, по умолчанию false</param>
        public void GetProxyserverFromDb(string protocolparam, bool isuseparam=false)
        {
            string query = "SELECT * FROM proxyserver WHERE protocol = @protocol AND isuse = @isuse LIMIT 1;";
            Proxyserver proxy = new Proxyserver();
            using(var conn = new MySql.Data.MySqlClient.MySqlConnection(connString))
            {
                conn.Open();
               
                proxy = conn.QuerySingle<Proxyserver>(query, new{protocol = protocolparam, isuse = protocolparam});
                this.id = proxy.id;
                this.protocol = proxy.protocol;
                this.ip = proxy.ip;
                this.port = proxy.port;
                this.login = proxy.login;
                this.pass = proxy.pass;
               
               
                conn.Execute("UPDATE proxyserver SET isuse = true WHERE id=@id", proxy);
                proxy = null;
            }
        }
       
        /// <summary>
        /// Метод возвращает строку прокси вида protocol://login:pass@ip:port
        /// </summary>
        /// <returns></returns>
        public string ProxyserverToString()
        {
            if(string.IsNullOrEmpty(this.protocol) || string.IsNullOrEmpty(this.ip) || string.IsNullOrEmpty(this.port.ToString())) throw new Exception("protocol or ip or port is empty!");
            string tostr = string.Format("{0}{1}:{2}@{3}:{4}", this.protocol, this.login, this.pass, this.ip, this.port.ToString());
            return tostr;
        }
       
        /// <summary>
        /// Метод разбирает строку с прокси вида protocol://login:pass@ip:port на объект Proxyserver
        /// </summary>
        /// <param name="proxystring">строка с прокси вида protocol://login:pass@ip:port</param>
        public void ProxyserverFromString(string proxystring)
        {
            string protoreg = @".*//";
            this.protocol = new Regex(protoreg).Match(proxystring).Value;
            proxystring = ZennoLab.Macros.TextProcessing.Replace(proxystring, protoreg, "", "Regex", "First");
            string[] split = proxystring.Split('@');
           
            this.login = split[0].Split(':')[0];
            this.pass = split[0].Split(':')[1];
            this.ip = split[1].Split(':')[0];
            this.port = Int32.Parse(split[1].Split(':')[1]);
        }
       
        /// <summary>
        /// Метод выставляет ячейку БД isuse=false для текущего объекта Proxyserver, разрешая таким образом др. ротокам работать с этой строкой
        /// </summary>
        public void ReturnProxyserverToDb()
        {
            using(var conn = new MySql.Data.MySqlClient.MySqlConnection(connString))
            {
                conn.Open();
                conn.Update(new Proxyserver{
                        id = this.id,
                        protocol = this.protocol,
                        ip = this.ip,
                        port = this.port,
                        login = this.login,
                        pass = this.pass,
                        isuse = this.isuse});
                this.project.SendInfoToLog("SET isuse = false item where id = " + this.id, false);
            }
        }
    }
}

И using из моего шаба:

C#:
using MySql.Data.MySqlClient;
using Dapper;
using Dapper.Contrib;
using Dapper.Contrib.Extensions;
using DataClasses;
 
  • Спасибо
Реакции: woodoo1

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