Obsługa wyjątków z Bazy oraz wyswietlanie z gridview tylko danych wierszy - .Net

0

Witam.
Zaproponowano mi napisanie małej strony z bazą do obsługi zapisywania się na pralnie w naszym akademiku. Mam pewien problem gdyż, oczywiście, nie można zapisać się w tym samym dniu w godzinach w których już ktoś jest zapisany i tu nie do końca wiem czego powinienem użyć do stworzenia takiego warunku, szukałem trochę ale szczerze mówiąc po omacku, gdyż nie bardzo wiem czego szukać tak do końca. Fajnie by było gdyby mi ktoś oszczędził czasu i napisał jak to powinno wyglądać, choćby mniej-więcej. Myślałem nad dodaniem warunku do samej bazy SQLa, ale oczywiście warunek unique działa tylko, w przypadku dodania constra unique na data/od/do, na dany dzien + godziny od-do, tzn. jeśli jest ktoś wpisany na 03-03-2012 godz 8 - 12 do drugi taki sam wpis nie wystąpi, jednak jeśli by się już chciało chociaż wpisać na 03-03-2012 godz 9 - 12 etc. to już się doda. Gdyby to nie musiałby być zakres to bym sobie poradził bez problemu, no ale.
Aktualnie stronę testuje tu: http://aspspider.info/silas177/strona1.aspx potem będzie przeniesiona, po skończeniu ofc, na nasz serwer wewnętrzny.
Zostało mi to do zrobienia, oraz jeszcze jedno sobie admin sieci wymyślił, by po zaznaczeniu w kalendarzu nie tylko dodawało datę do textboxa (tam gdzie "Na kiedy:") ale także wyświetlało tylko wpisy na daną datę w GridView, jeśli się da, tak więc chciałem zapytać czy da się takie cyrki porobić?
Aktualnie testuje na bazie accessa, prawdopodobnie zmienimy po przeniesieniu na serwer wewnętrzny na bazę sqla, ale w sumie myślę, że to nie będzie takie konieczne gdyż baza nie będzie zawierała dużo wpisów, adminowi sieci to obojętne, bo po tygodniu wpisy i tak będą kasowane. Tak czy inaczej rozwiązanie nie powinno mieć wpływu na to jaka to baza, bo obie działają na podobnej zasadzie, przynajmniej tak sądzę :>

Oto kod wewnątrz jakby co:
[code]
string sConnectionString;
protected void Page_Load(object sender, EventArgs e)
{
sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\C#\Strona trzy\Strona\App_Data\BazaStrony.mdb";
//sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MemberSites\MemberSites_AspSpider_Info\silas177\database\BazaStrony.mdb";
}

    protected void zapisywanie()
    {
        OleDbConnection objConn = new OleDbConnection(sConnectionString);
        objConn.Open();

            OleDbCommand objCmdINSERT = new OleDbCommand("INSERT INTO Strona (Pokoj,Od,Do,Data) VALUES ('" + tb_pokoj.Text + "', '" + od_godziny.SelectedValue + "', '" + do_godziny.SelectedValue + "', '" + tb_nakiedy.Text + "')", objConn);
            objCmdINSERT.ExecuteNonQuery();
            objConn.Close();
    }

    protected void b_zapisz_Click(object sender, EventArgs e)
    {
        if (od_godziny.SelectedIndex == 0 || do_godziny.SelectedIndex == 0)
        {
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + "Wybierz poprawnie godziny" + "');", true);
        }
        else
        {
                zapisywanie();
                Response.Redirect(Request.RawUrl);
        }
    }

[/code]

0

Zależy jak masz zapisaną datę w bazie. Jak masz np. 2 pola: start i end, to ja bym zrobił tak: zapytał bazę czy istnieje taki rekord, że:

niech nowy.start i nowy.end oznaczają granice zarezerwowanego czasu (tego co chce zarezerwować), to samo ze stary (to każdy inny wpis w bazie)

(nowy.start >= stary.start AND nowy.start <= stary.end)
OR
(nowy.end <= stary.end AND nowy.end >= stary.start)

To warunki istnienia rekordu, jeżeli istnieje, to znaczy, że osoba próbuje się wcisnąć w zajęty czas. stary to każdy wpis w twojej tabeli gdzie trzymasz info nt. rezerwacji.

0

Baza to nic specjalnego, zawiera to co ma wyświetlać:

http://desmond.imageshack.us/Himg28/scaled.php?server=28&filename=screenwdc.jpg&res=medium

@down
Wiem, że musiałbym to wsadzić w kod c#, tylko właśnie z uściśleniem tego w kodzie mam problem, bo nie wiem jak :P A jeśli bazę miałeś na myśli, to nie wiem jakby miało takie zapytanie wyglądać szczerze mówiąc na przykładzie tej bazy, bo chyba nie istnieje coś takiego jak "add constraint jakistam unique (od[i+1] <= od[i])" (tu upodobanie do c++ się pokazuje, ale wydaje mi się najbliższe temu co chce osiągnąć :P)

0

No więc, porównujesz czy dzień ten sam i potem to samo co napisałem, czy nie wchodzi na czyjeś godziny.

0

Tak na chłopski rozum kombinowałem nad czymś takim:

[code]
protected void zapisywanie()
{
OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
var a = "SELECT Od FROM Strona";
var b = "SELECT Do FROM Strona";
var c = "SELECT Data FROM Strona";

        int fds = Convert.ToInt32(a);
        int sdf = Convert.ToInt32(od_godziny.SelectedValue);

        int cxz = Convert.ToInt32(b);
        int zxc= Convert.ToInt32(do_godziny.SelectedValue);

        if (tb_nakiedy.Text == c && (sdf >= fds && sdf <= cxz) || (zxc <= cxz && zxc >= fds))
        {
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + "Taka godzina/data juz jest zajeta, wybierz inne" + "');", true);
        }
        else
        {
            OleDbCommand objCmdINSERT = new OleDbCommand("INSERT INTO Strona (Pokoj,Od,Do,Data) VALUES ('" + tb_pokoj.Text + "', '" + od_godziny.SelectedValue + "', '" + do_godziny.SelectedValue + "', '" + tb_nakiedy.Text + "')", objConn);
            objCmdINSERT.ExecuteNonQuery();
            objConn.Close();
        }
    }

[/code]
No ale czasem bywa tak z chłopskim rozumem, że nie jest tak jak to chłop myślał :>
Oczywiście wywala "Nieprawidłowy format ciągu wejściowego" przy int fds = Convert.ToInt32(a);

0

Mozesz zrobic service opierajac sie na wzorcu komety i aktualizowac dostepne czasy na biezaco, lub dodac triggery do bazy danych wowczas dostaniesz wyjatek wykonujac zapytanie niezgodne z zasadami bazy.

http://en.wikipedia.org/wiki/Database_trigger
http://msdn.microsoft.com/de-de/library/ms189799.aspx
http://en.wikipedia.org/wiki/Comet_%28programming%29
http://www.aaronlerch.com/files/blog/ASP_NET_Comet_Example.zip

Tylko czy to ma sens... wiesz jedna osoba moze wstawic pranie (w programie krotkim i temp 40 stopni, a inny, pelny program w 60 stopniach i samo pranie bedzie trwalo dluzej) na krocej, lub dluzej i co ? W oparciu o co chcesz przydzielic czas na osobe ?
Software w takim wypadku nie ma sensu, lepiej jest zrobic urzadzenie na wzor ticketow, czy numerkow w przychodni. Masz mniejszy numer to wchodzisz i robisz swoje, konczysz to wychodzisz, przegapiles swoja kolejke to ciagniesz nowy numer.

Nie chce podcinac skrzydel, ale jestem sceptyczny co do wiary w ludzi z akademika, ze podarza za twoim tokiem rozumowania. Tak czy siak powodzenia :)

0

Hehe dzięki, jednak do tej pory się to sprawdzało, tyle że na kartce :> Ale z lenistwa chcą by było "mobilnie". Każdy bierze tyle ile mu potrzeba, tam te przykładowe kilka godzin, tyle że na kartce to było kontrolowane przez samego "keykeepera", no ale jak ktoś sobie jaja zrobi i załóżmy weźmie pralnie na tą 8 - 22, tylko po to żeby zrobić na złość, to posiadający prawa admina, tzn. dostęp do panelu może spokojnie usunąć wpis no i dodatkowo taki cioł straci możliwość prania łachów permanentnie.
Zajrzę do materiałów od ciebie jak wrócę z uczelni o ile nie padne na ryj dziś ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1