Adatbázis lekérdezések statisztikához (Mysql + C#)

Adatbázis lekérdezések statisztikához (Mysql + C#)
2019-02-16T08:53:20+01:00
2019-02-17T12:29:55+01:00
2022-10-15T21:31:30+02:00
namajdmost
Sziasztok!
Épp csak mostanában kezdtem el adatbázissal foglalkozni, elég sok alkalommal találtam itt megoldásokat(amikért utólag is óriási köszönet a közösségnek! ), de most megakasztott néhány lekérdezés egy  statisztika létrehozásához.

tábla1: ID|Dátum|Összeg|Jelleg-enum-(kiadás/bevétel)|kategória_ID|Felhasználó_ID
tábla2: ID|Kategória_Név

Fontos minden esetben évenkénti és hónaponkénti lebontásban egyaránt!

Oszlopdiagramhoz:
1 sum(összeg)|bevétel|kiadás

 
Külön-külön, tehát 3db kördiagramhoz kapcsolódó lekérdezések:
1 sum(összeg)|kategóriánként|ahol jelleg: kiadás
2 sum(összeg)|kategóriánként|ahol jelleg: bevétel
3 sum(összeg)|bevétel|kiadás /felhasználónkra lebontva/

További szép napot!
Mutasd a teljes hozzászólást!
A group by ért kell, hogy a lekérdezésed ne egy sort adjon vissza, hanem pl. havonta egyet. 

Miért tárolsz string-ben numerikus értékeket? Vagy nem értem a kódodat...

Üdv

KGy
Mutasd a teljes hozzászólást!

  • Hali!

    Mutasd – forráskóddal, SQL-mondatokkal –, hogy eddig mivel, hogyan próbálkoztál, meddig jutottál el, mi nem megy, miben/hol akadtál el!

    Mutasd a teljes hozzászólást!
  • Keress rá as SQL tutorialokban a "group by" kifelyezésre, azzal és a sum aggregáló függvénnyel könnyedén meg tudod oldani.

    Üdv

    KGy
    Mutasd a teljes hozzászólást!
  • Szóval a célom, hogy egy stringben adnám (adom) át a lekérdezést, és az eredményt egy dinamikus string tömbben tárolnám (tárolom).
    Már az oszlopdiagramhoz sem sikerült egyben a lekérdezés:

    string sql = ("SELECT SUM(Osszeg) FROM penzmozgas WHERE Jelleg='" + "kiadás" + "' ");
                List<string[]> penzmozgasok = ab.lekerdezes(sql);
                foreach (string[] item in penzmozgasok)
                {
                    chart2.Series["Kiadás"].Points.AddXY("Kiadás", item[0]);                
                }

    és:
    string sql = ("SELECT SUM(Osszeg) FROM penzmozgas WHERE Jelleg='" + "bevétel" + "' ");
                List<string[]> penzmozgasok = ab.lekerdezes(sql);
                foreach (string[] item in penzmozgasok)
                {
                    chart2.Series["Bevétel"].Points.AddXY("Bevétel",item[0]);                             
                }

    ez így szépen működik, de minél rövidebb a kód... itt járok most.
    Mutasd a teljes hozzászólást!
  • Köszönöm, megnézem!
    Mutasd a teljes hozzászólást!
  • A group by ért kell, hogy a lekérdezésed ne egy sort adjon vissza, hanem pl. havonta egyet. 

    Miért tárolsz string-ben numerikus értékeket? Vagy nem értem a kódodat...

    Üdv

    KGy
    Mutasd a teljes hozzászólást!
  • Ez nagyon rossz gyakorlat, hamar el lehet jutni egy SQL-injekcióra érzékeny kódhoz.
    Az SqlCommand-nak át lehet adni paramétereket, inkább azt ajánlom.
    Vagy használj ORM-et, az Entity Framework viszi a MySQL-t.
    Mutasd a teljes hozzászólást!
  • Osztályon belül adom át neki.
    Mutasd a teljes hozzászólást!
  • Igazad volt, sikerült. Köszi!

    A kódom:

    class MyDB
        {
            
         
            private MySqlConnection connection;

            private string server;
            private string database;
            private string uid;
            private string password;

            public MyDB(string host, string db, string pass, string user)
            {
                server = host;
                database = db;
                uid = user;
                password = pass;

                Initialization();
            }

            private void Initialization()
            {
                MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder();
                sb.Server = server;
                sb.Database = database;
                sb.UserID = uid;
                sb.Password = password;
                sb.AllowZeroDateTime = true;
                sb.ConvertZeroDateTime = true;
                sb.CharacterSet = "utf8";
                sb.UseCompression = true;

                connection = new MySqlConnection(sb.ToString());
            }

            public List<string[]> lekerdezes(string sql)
            {
               
                List<string[]> list = new List<string[]>();
                if (this.KapcsolatNyitas())
                {
                    MySqlCommand cmd = new MySqlCommand();
                    cmd.CommandText = sql;
                    cmd.Connection = connection;

                    MySqlDataReader dr = cmd.ExecuteReader();
                    while (dr.Read())
                    {                    
                        string[] sor = new string[dr.FieldCount];
                        for (int i = 0; i < dr.FieldCount; i++)
                        {                                             
                            sor = dr.GetValue(i).ToString();                       
                        }
                        list.Add(sor);
                    }
                    this.KapcsolatZaras();
                    return list;
                }
                else
                {
                    return list;
                }
            }

            public void beszuras(string sql)
            {
               
                if (this.KapcsolatNyitas())
                {
                    MySqlCommand cmd = new MySqlCommand();
                    cmd.CommandText = sql;
                    cmd.Connection = connection;
                    cmd.ExecuteNonQuery();
                    this.KapcsolatZaras();
                }

            }

            public void torol(string sql)
            {
                if (this.KapcsolatNyitas())
                {
                    MySqlCommand cmd = new MySqlCommand();
                    cmd.CommandText = sql;
                    cmd.Connection = connection;               
                    cmd.ExecuteNonQuery();
                    this.KapcsolatZaras();
                }

            }

            public void frissit(string sql)
            {
                if (this.KapcsolatNyitas())
                {
                    MySqlCommand cmd = new MySqlCommand();
                    cmd.CommandText = sql;
                    cmd.Connection = connection;               
                    cmd.ExecuteNonQuery();
                    this.KapcsolatZaras();
                }

            }

            private bool KapcsolatNyitas()
            {
              
                try
                {
                    connection.Open();
                    return true;
                }
                catch (MySqlException ex)
                {
                    switch (ex.Number)
                    {
                        case 1042:
                            MessageBox.Show("Az adatbázis szerver nem elérhető.");
                            break;
                        case 1045:
                            MessageBox.Show("Érvénytelen felhasználónév vagy jelszó.");
                            break;
                        default:
                            MessageBox.Show(ex.Message + " " + ex.Number);
                            break;
                    }
                    Environment.Exit(0);
                }
                return false;
            }

            private bool KapcsolatZaras()
            {
               
                try
                {
                    connection.Close();
                    return true;
                }
                catch (MySqlException ex)
                {
                    MessageBox.Show(ex.Message);
                }
                return false;
            }

        }
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd