Přístup do mysql databázky – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přístup do mysql databázky – .NET – Fórum – Programujte.comPřístup do mysql databázky – .NET – Fórum – Programujte.com

 
Hledat
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Pergoly a střechy Brno

Kubas1290
Stálý člen
15. 9. 2021   #1
-
0
-

Můžu se prosím ještě zeptat jestli mám dobře navrženou komunikaci server- databáze? Že nejsem si ještě jistý jestli jsem jí navrhl dobře, tak aby se vzájemně nerušila.

Je okey tato architektura? 

Jsem si založil pro komunikaci s MYSQL serverem samostatnou třídu, tím že v jejím konstruktoru se sestaví ConnectionString a vloží se do MySqlConnection a poté jednotlivé metody této třídy budou otevírat a opět zase zavírat spojení a dále se dotazovat databázky a ukládat do ní další data.

Ale jde mi spíš hlavně o to, že pak v hlavním programu jsem si vytvořil jednu statickou instanci této třídy, takže všechny nová vlákna, která se vytvoří pro jednotlivé klienty budou využívat tuto stejnou instanci. Otázka kterou si kladu je co se stane, když program z více vláken zavolá stejnou metodu této třídy, která bude přistupovat do této databáze a vrtat se v ní, jestli to bude ok? Nebo jestli program spadne - jako podobně to bylo s tou internetovou komunikací (jak jsem tam pak musel přidat ty věci na tu synchronizaci vláken :D)

Nebo je to lepší předělat, tak aby se vždy založila nová instance této třídy extra v každé metodě, která bude volat nějakou její metodu? 

Takto nějak vypadá ta třída pro tu komunikaci s databázkou:

using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using MonopolyServer.Server.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace MonopolyServer.Database
{
    class Connection
    {
        private MySqlConnection mySqlConnection = null;
        public Connection()
        {
            mySqlConnection = new MySqlConnection();
            try {
                MySqlConnectionStringBuilder mysqlConfiguration = new MySqlConnectionStringBuilder();
                mysqlConfiguration.Database = "monopoly";
                mysqlConfiguration.Server = Dns.GetHostName();
               // mysqlConfiguration.Server = "192.168.1.102";
                mysqlConfiguration.Port = 3306;
                mysqlConfiguration.UserID = "server";
                mysqlConfiguration.Password = "Monopoly123";
                mySqlConnection.ConnectionString = mysqlConfiguration.ConnectionString;

            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                mySqlConnection.Close();
            }
        }
        public bool IsNickFree(string nick)
        {
            try
            {
                mySqlConnection.Open();
                MySqlCommand command = new MySqlCommand();
                command.Connection = mySqlConnection;
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
                MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
                param.Value = nick;
                command.Parameters.Add(param);

                using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
                {
                    if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
                    {
                        return false;
                    }
                    return true;
                }
            }
            finally
            {
                mySqlConnection.Close();
            }
        }
        public bool RegisterNewPlayer(User user)
        {
            return true;
        }
    }
}

Díky moc :-))

Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
15. 9. 2021   #2
-
0
-

#1 Kubas129
Nevidím důvod pro zavírání spojení. To by se mělo dát do destruktoru.

Nahlásit jako SPAM
IP: 78.45.100.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kubas1290
Stálý člen
15. 9. 2021   #3
-
0
-

#2 Kit
Díky, takže nějak takto je to ok? :-)

namespace MonopolyServer.Database
{
    class Connection
    {
        private MySqlConnection mySqlConnection = null;
        public Connection()
        {
            mySqlConnection = new MySqlConnection();
            try {
                MySqlConnectionStringBuilder mysqlConfiguration = new MySqlConnectionStringBuilder();
                mysqlConfiguration.Database = "monopoly";
                mysqlConfiguration.Server = Dns.GetHostName();
               // mysqlConfiguration.Server = "192.168.1.102";
                mysqlConfiguration.Port = 3306;
                mysqlConfiguration.UserID = "server";
                mysqlConfiguration.Password = "Monopoly123";
                mySqlConnection.ConnectionString = mysqlConfiguration.ConnectionString;

            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        public bool IsNickFree(string nick)
        {
                mySqlConnection.Open();
                MySqlCommand command = new MySqlCommand();
                command.Connection = mySqlConnection;
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
                MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
                param.Value = nick;
                command.Parameters.Add(param);

                using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
                {
                    if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
                    {
                        return false;
                    }
                    return true;
                }
        }
        public bool RegisterNewPlayer(User user)
        {
            return true;
        }
         ~Connection()
        {
            mySqlConnection.Close();
        }
    }
}
Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
15. 9. 2021   #4
-
0
-

#3 Kubas129
Ještě mi tam chybí lazy otevírání databáze. Konstruktor by si měl uložit parametry pro spojení. Pokud aplikace chce provést dotaz, metoda si nejprve ověří, zda je DB otevřenotootevřena. Pokud není, tak ji ootevře a provede dotadotaz.

Nahlásit jako SPAM
IP: 78.45.100.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kubas1290
Stálý člen
15. 9. 2021   #5
-
0
-

#4 Kit
To provedu jak? :(

Takto?

        public bool IsNickFree(string nick)
        {
            if (mySqlConnection.State != ConnectionState.Open)
            {
                mySqlConnection.Open();
            }
                MySqlCommand command = new MySqlCommand();
                command.Connection = mySqlConnection;
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
                MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
                param.Value = nick;
                command.Parameters.Add(param);

                using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
                {
                    if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
                    {
                        return false;
                    }
                    return true;
                }
        }
Nahlásit jako SPAM
IP: 62.141.28.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Podobná vlákna

Přístup — založil lišák

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý