public static List<Tematyka> WszystkieTematyki()
        {
            List<Tematyka> lista = new List<Tematyka>(); //Tworzymy obiekt List<Tematyka>

            BazaSQLite baza = new BazaSQLite(); //Pomocnicza klasa zawieraj¹ca metodê GetDataTable
            DataTable dt = new DataTable();
            //Metoda przyjmuj¹ca zapytanie SELECT w String i zwracaj¹ca DataTable
            dt = baza.GetDataTable("select o.id_tematyki, o.nazwa from Tematyki as o");

            foreach (DataRow row in dt.Rows) //Iterujemy po ka¿dym wierszu w DataTable
            {
                Tematyka tematyka = new Tematyka(); //Tworzymy obiekt do którego bedziemy przypisywaæ wartoœci z DataRow
                tematyka.Id = Convert.ToInt32(row["id_tematyki"]);
                tematyka.Nazwa = row["nazwa"].ToString();

                lista.Add(tematyka); //Wrzucamy do listy
            }

            return lista;
        }
        public static List<Czestotliwosc> WszystkieCzestotliwosci()
        {
            List<Czestotliwosc> lista = new List<Czestotliwosc>(); //Tworzymy obiekt List<Czestotliwosc>

            BazaSQLite baza = new BazaSQLite(); //Pomocnicza klasa zawieraj¹ca metodê GetDataTable
            DataTable dt = new DataTable();
            //Metoda przyjmuj¹ca zapytanie SELECT w String i zwracaj¹ca DataTable
            dt = baza.GetDataTable("select o.id_czestotliwosc, o.nazwa from Czestotliwosc as o");

            foreach (DataRow row in dt.Rows) //Iterujemy po ka¿dym wierszu w DataTable
            {
                Czestotliwosc czestotliwosc = new Czestotliwosc(); //Tworzymy obiekt do którego bedziemy przypisywaæ wartoœci z DataRow
                czestotliwosc.Id = Convert.ToInt32(row["id_czestotliwosc"]);
                czestotliwosc.Nazwa = row["nazwa"].ToString();

                lista.Add(czestotliwosc); //Wrzucamy do listy
            }

            return lista;
        }
        //Analiza stanu czytelnictwa
        private void WyswietlNajczesciejWybieraneButtonClick(object sender, EventArgs e)
        {
            this.najczesciejWybieraneGridView.Rows.Clear();

            int minRok = 0, maxRok = 0, i = 0, liczbaMiejscWRankingu = 0;
            string plec = "", grupaWiekowa = "", zapytanie = "", minData = "", maxData = "", najczesciejWybierane = "", czestotliwosc = "", odbiorca = "";
            DateTime dataPocz = this.dateTimePicker7.Value;
            DateTime dataKon = this.dateTimePicker8.Value;

            if (!string.IsNullOrEmpty(this.odbiorcaComboBox2.Text))
            {
                Odbiorca odb = (Odbiorca)this.odbiorcaComboBox2.SelectedItem;
                odbiorca = odb.Id.ToString();
            }

            if (!string.IsNullOrEmpty(this.czestotliwoscUkazywaniaSieComboBox.Text))
            {
                Czestotliwosc czest = (Czestotliwosc)this.czestotliwoscUkazywaniaSieComboBox.SelectedItem;
                czestotliwosc = czest.Id.ToString();
            }

            if (!string.IsNullOrEmpty(this.plecComboBox.Text))
            {
                plec = this.plecComboBox.SelectedItem.ToString();

                if (plec == "kobieta") {
                    plec = "K";
                }
                else {
                    plec = "M";
                }
            }

            if (!string.IsNullOrEmpty(this.grupaWiekowaComboBox.Text))
            {
                grupaWiekowa = this.grupaWiekowaComboBox.SelectedItem.ToString();
                string od_ = grupaWiekowa.Substring(0, 2), do_ = grupaWiekowa.Substring(5, 2);
                int biezacyRok = DateTime.Now.Year; //SQLite nie udostępnia funkcji do wyciągnięcia roku z przechowywanej w bazie daty
                int biezacyMiesiac = DateTime.Now.Month;
                int biezacyDzien = DateTime.Now.Day;
                minRok = biezacyRok - Convert.ToInt32(do_);
                maxRok = biezacyRok - Convert.ToInt32(od_);

                if (biezacyMiesiac >= 1 && biezacyMiesiac <= 9)
                {
                    minData = string.Concat(minRok + "-" + "0" + biezacyMiesiac + "-" + biezacyDzien);
                    maxData = string.Concat(maxRok + "-" + "0" + biezacyMiesiac + "-" + biezacyDzien);
                }
                else
                {
                    minData = string.Concat(minRok + "-" + biezacyMiesiac + "-" + biezacyDzien);
                    maxData = string.Concat(maxRok + "-" + biezacyMiesiac + "-" + biezacyDzien);
                }
            }

            if (string.IsNullOrEmpty(this.liczbaMiejscWRankinguComboBox.Text))
            {
                MessageBox.Show("Proszę wybrać liczbę miejsc w rankingu.", "Analiza stanu czytelnictwa");
            }
            else
            {
                liczbaMiejscWRankingu = Convert.ToInt32(this.liczbaMiejscWRankinguComboBox.SelectedItem.ToString());
            }

            if (string.IsNullOrEmpty(najczesciejWybieraneComboBox.Text))
            {
                MessageBox.Show("Proszę wybrać rodzaj zbiorów bibliotecznych.", "Analiza stanu czytelnictwa");
            }
            else
            {
                najczesciejWybierane = this.najczesciejWybieraneComboBox.SelectedItem.ToString();
            }

            List<NajczesciejWybierany> listaNajczesciejWybieranych = new List<NajczesciejWybierany>();

            BazaSQLite baza = new BazaSQLite();
            DataTable dt = new DataTable();

            switch(najczesciejWybierane)
            {
                case "kategoria książek":
                    zapytanie = String.Format("select kat.nazwa, count(kat.id_kategorii) as liczba from ((((Ksiazki as k inner join Karty_Egzemplarzy_Ksiazki as kek on k.id_ksiazki = kek.id_ksiazki) inner join Karty_Wypozyczen_Ksiazki as kwk on kek.id_egzemplarza = kwk.id_egzemplarza) inner join Kategorie as kat on k.id_kategorii = kat.id_kategorii) inner join Karty as kar on kwk.id_karty = kar.id_karty) inner join Czytelnicy as czyt on kar.id_czytelnika = czyt.id_czytelnika where {0} and {1} and {2} group by kat.id_kategorii order by liczba desc", (plec != "") ? "czyt.plec = \"" + plec + "\"" : "1=1", (grupaWiekowa != "") ? "czyt.data_urodzenia between date(\"" + minData + "\") and date(\"" + maxData + "\")" : "1=1", (dataPocz != null && dataKon != null) ? "kwk.data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")" : "1=1");
                    break;
                case "tematyka czasopism":
                    zapytanie = String.Format("select tem.nazwa, count(tem.id_tematyki) as liczba from ((((Czasopisma as cz inner join Karty_Egzemplarzy_Czasopisma as kec on cz.id_czasopisma = kec.id_czasopisma) inner join Karty_Wypozyczen_Czasopisma as kwc on kec.id_egzemplarza = kwc.id_egzemplarza) inner join Tematyki as tem on cz.id_tematyki = tem.id_tematyki) inner join Karty as kar on kwc.id_karty = kar.id_karty) inner join Czytelnicy as czyt on kar.id_czytelnika = czyt.id_czytelnika where {0} and {1} and {2} and {3} and {4} group by tem.id_tematyki order by liczba desc", (plec != "") ? "czyt.plec = \"" + plec + "\"" : "1=1", (grupaWiekowa != "") ? "czyt.data_urodzenia between date(\"" + minData + "\") and date(\"" + maxData + "\")" : "1=1", (czestotliwosc != "") ? "cz.id_czestotliwosc = \"" + czestotliwosc + "\"" : "1=1", (odbiorca != "") ? "cz.id_odbiorcy = \"" + odbiorca + "\"" : "1=1", (dataPocz != null && dataKon != null) ? "kwc.data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")" : "1=1");
                    break;
                case "tytuł książki":
                    zapytanie = String.Format("select k.tytul as nazwa, count(k.tytul) as liczba from (((Ksiazki as k inner join Karty_Egzemplarzy_Ksiazki as kek on k.id_ksiazki = kek.id_ksiazki) inner join Karty_Wypozyczen_Ksiazki as kwk on kek.id_egzemplarza = kwk.id_egzemplarza) inner join Karty as kar on kwk.id_karty = kar.id_karty) inner join Czytelnicy as czyt on kar.id_czytelnika = czyt.id_czytelnika where {0} and {1} and {2} group by k.tytul order by liczba desc", (plec != "") ? "czyt.plec = \"" + plec + "\"" : "1=1", (grupaWiekowa != "") ? "czyt.data_urodzenia between date(\"" + minData + "\") and date(\"" + maxData + "\")" : "1=1", (dataPocz != null && dataKon != null) ? "kwk.data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")" : "1=1");
                    break;
                case "tytuł czasopisma":
                    zapytanie = String.Format("select cz.tytul as nazwa, count(cz.tytul) as liczba from (((Czasopisma as cz inner join Karty_Egzemplarzy_Czasopisma as kec on cz.id_czasopisma = kec.id_czasopisma) inner join Karty_Wypozyczen_Czasopisma as kwc on kec.id_egzemplarza = kwc.id_egzemplarza) inner join Karty as kar on kwc.id_karty = kar.id_karty) inner join Czytelnicy as czyt on kar.id_czytelnika = czyt.id_czytelnika where {0} and {1} and {2} and {3} and {4} group by cz.tytul order by liczba desc", (plec != "") ? "czyt.plec = \"" + plec + "\"" : "1=1", (grupaWiekowa != "") ? "czyt.data_urodzenia between date(\"" + minData + "\") and date(\"" + maxData + "\")" : "1=1", (czestotliwosc != "") ? "cz.id_czestotliwosc = \"" + czestotliwosc + "\"" : "1=1", (odbiorca != "") ? "cz.id_odbiorcy = \"" + odbiorca + "\"" : "1=1", (dataPocz != null && dataKon != null) ? "kwc.data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")" : "1=1");
                    break;
            }

            dt = baza.GetDataTable(zapytanie);

            foreach (DataRow row in dt.Rows)
            {
                if (i < liczbaMiejscWRankingu)
                {
                    i++;
                    NajczesciejWybierany wyb = new NajczesciejWybierany();
                    wyb.Pozycja = i;
                    wyb.Nazwa = row["nazwa"].ToString();
                    wyb.LiczbaWypozyczen = Convert.ToInt32(row["liczba"]);

                    listaNajczesciejWybieranych.Add(wyb);

                    DataGridViewRow gridRow = this.najczesciejWybieraneGridView.RowTemplate.Clone() as DataGridViewRow;
                    gridRow.CreateCells(this.najczesciejWybieraneGridView);

                    gridRow.Cells[0].Value = wyb.Pozycja;
                    gridRow.Cells[1].Value = wyb.Nazwa;
                    gridRow.Cells[2].Value = wyb.LiczbaWypozyczen;

                    this.najczesciejWybieraneGridView.Rows.Add(gridRow);
                }
            }

            //this.najczesciejWybieraneGridView.DataSource = listaNajczesciejWybieranych;
        }
        private void ObliczButtonClick(object sender, EventArgs e)
        {
            string zapytanie = "", zapytanieNieaktywne = "", zapytanieLiczbaWypKsiazki = "", zapytanieLiczbaWypCzasopism = "", rodzajZbioru = "";
            double liczbaNieaktywnych = 0, liczbaWszystkich = 0, liczbaWypKsiazek = 0, liczbaWypCzasopism = 0, liczbaWypOgolem = 0;
            DateTime dataPocz = this.dateTimePicker5.Value;
            DateTime dataKon = this.dateTimePicker6.Value;

            List<KartaCzytelnika> listaKartCzytelnika = new List<KartaCzytelnika>();
            List<KartaCzytelnika> listaNieaktywnychKartCzytelnika = new List<KartaCzytelnika>();
            List<LiczbaWypozyczen> listaWypozyczenKsiazek = new List<LiczbaWypozyczen>();
            List<LiczbaWypozyczen> listaWypozyczenCzasopism = new List<LiczbaWypozyczen>();

            BazaSQLite baza = new BazaSQLite();

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();
            DataTable dt3 = new DataTable();
            DataTable dt4 = new DataTable();

            zapytanie = String.Format("select id_karty as pom from Karty");
            zapytanieNieaktywne = String.Format("select id_karty as pom from Karty as k where k.status = \"nieaktywna\"");
            zapytanieLiczbaWypKsiazki = String.Format("select id_egzemplarza + id_karty as pom from Karty_Wypozyczen_Ksiazki as kwk where data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")");
            zapytanieLiczbaWypCzasopism = String.Format("select id_egzemplarza + id_karty as pom from Karty_Wypozyczen_Czasopisma as kwc where data_wypozyczenia between date(\"" + dataPocz + "\") and date(\"" + dataKon + "\")");

            dt1 = baza.GetDataTable(zapytanie);
            dt2 = baza.GetDataTable(zapytanieNieaktywne);
            dt3 = baza.GetDataTable(zapytanieLiczbaWypKsiazki);
            dt4 = baza.GetDataTable(zapytanieLiczbaWypCzasopism);

            foreach (DataRow row in dt1.Rows)
            {
                KartaCzytelnika rekord = new KartaCzytelnika();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaKartCzytelnika.Add(rekord);
            }
            foreach (DataRow row in dt2.Rows)
            {
                KartaCzytelnika rekord = new KartaCzytelnika();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaNieaktywnychKartCzytelnika.Add(rekord);
            }
            foreach (DataRow row in dt3.Rows)
            {
                LiczbaWypozyczen rekord = new LiczbaWypozyczen();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaWypozyczenKsiazek.Add(rekord);
            }
            foreach (DataRow row in dt4.Rows)
            {
                LiczbaWypozyczen rekord = new LiczbaWypozyczen();
                rekord.Id = Convert.ToInt32(row["pom"]);
                listaWypozyczenCzasopism.Add(rekord);
            }

            liczbaNieaktywnych = listaNieaktywnychKartCzytelnika.Count();
            liczbaWszystkich = listaKartCzytelnika.Count();
            liczbaWypKsiazek = listaWypozyczenKsiazek.Count();
            liczbaWypCzasopism = listaWypozyczenCzasopism.Count();
            liczbaWypOgolem = liczbaWypKsiazek + liczbaWypCzasopism;

            if ((liczbaWszystkich != 0))
            {
                udzialOsobNieaktywnychLabel.Text = String.Format("{0}%", Math.Round(liczbaNieaktywnych / liczbaWszystkich, 3).ToString());
            }

            if (string.IsNullOrEmpty(rodzajZbioruComboBox.Text))
            {
                MessageBox.Show("Proszę wybrać rodzaj zbiorów bibliotecznych.", "Analiza stanu czytelnictwa");
            }
            else
            {
                rodzajZbioru = this.rodzajZbioruComboBox.SelectedItem.ToString();
            }

            switch (rodzajZbioru)
            {
                case "książki":
                    this.calkowitaLiczbaWypLabel.Text = Convert.ToString(liczbaWypKsiazek);
                    break;
                case "czasopisma":
                    this.calkowitaLiczbaWypLabel.Text = Convert.ToString(liczbaWypCzasopism);
                    break;
                case "wszystkie":
                    this.calkowitaLiczbaWypLabel.Text = Convert.ToString(liczbaWypOgolem);
                    break;
            }
        }