Strona główna » Carckowanie » lang csharp » sprawdzanie zakresu danych - wielka prosba o pomoc
| sprawdzanie zakresu danych - wielka prosba o pomoc [wiadomość #742] |
sob, 07 lipiec 2007 14:28  |
sg_pl Wiadomości: 24 Dołączył(a): maj 2007 |
Junior Member |
|
|
Witam ponownie dzisiaj i prosze o porade, mam do zrobienia taka rzecz, otoz
w bazie mam 3 pola (seria, od, do) i formularz w ktorym dodaje np. AA,10,20.
Moga sie zdarzyć dziury w numerach czyli przyjmijmy ze mam zapisane w bazie
AA,10,20
AA,21,30
AA,50,60
musze napisac funkcje, ktora sprawdzi przed zapisem czy liczba w polu od
albo w polu do nie jest juz przypadkiem zapisana w jakims zakresie wczesniej
dodanym. Walcze i walcze i wywalczylem ze jak wpisze np AA,22,32 to nie
pozwala na zapis, jak dam AA,40,60 to tez jest ok ale jak juz dam AA,40,65
to mi zapisuje i sie nie czepia, a powinien bo jest tu zawarty zakres od
50-60. Jak sie robi takie rzeczy?
Zamieszczam ponizej kod ale prosze sie nie przerazac bo jest toistne
rzezbiarstwo, po sprawdzeniu czy seria jest nastepuje zapis jezeli takiej
jeszcze w bazie nie ma ale jezeli jest juz taka w bazie to przechodze do
sprawdzenia zakresow i to juz masakra, po pierwsze nie dziala toco opisalem
powyzej, a po drugie nie wiem gdzie wstawic zapis jak juz sie okaze ze
takiego zakresu tam nie ma.
Dzieki za pomoc
Sebastian
public static int ilosc = 0;
public static int ilosc2 = 0;
private void SPRAWDZENIE()
{
OleDbConnection sprbloczekcon = new OleDbConnection();
sprbloczekcon.ConnectionString = Dane.bazadanych.polozeniebazy;
OleDbCommand sprbloczekcmd = new OleDbCommand();
sprbloczekcmd.CommandText = "SELECT count(*) From bloczki where
seria='" + danebloczka.seria + "'";
try
{
sprbloczekcmd.Connection = sprbloczekcon;
sprbloczekcon.Open();
string liczba = sprbloczekcmd.ExecuteScalar().ToString();
ilosc = Int32.Parse(liczba.ToString());
ilosc2 = ilosc;
if (ilosc > 0)
{
int j = 0;
for (j = 0; ilosc > j; j++)
{
SPRAWDZENIE2();
ilosc2 = ilosc2 - 1;
}
}
else
{
ZAPIS();
}
}
catch
{
MessageBox.Show("Wystąpił błąd podczas sprawdzania danych
dot. bloczków.\nSkontaktuj się z producentem oprogramowania.", "Błąd
sprawdzania danych - bloczek", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
if (sprbloczekcon.State == ConnectionState.Open)
{
sprbloczekcon.Close();
}
}
}
private void SPRAWDZENIE2()
{
int bloczek_od = 0;
int bloczek_do = 0;
int id = 0;
OleDbConnection sprbloczekcon2 = new OleDbConnection();
sprbloczekcon2.ConnectionString = Dane.bazadanych.polozeniebazy;
OleDbCommand sprbloczekcmd2 = new OleDbCommand();
sprbloczekcmd2.CommandText = "Select top "+ilosc2+" * from
bloczki where seria='" + danebloczka.seria + "'";
try
{
sprbloczekcmd2.Connection = sprbloczekcon2;
sprbloczekcon2.Open();
OleDbDataReader sprbloczek2 =
sprbloczekcmd2.ExecuteReader();
while (sprbloczek2.Read())
{
id = (int)sprbloczek2["id"];
bloczek_od = (int)sprbloczek2["od"] - 1;
bloczek_do = (int)sprbloczek2["do"] - 1;
}
int wartosc = bloczek_do - bloczek_od;
int j = 0;
for (j = 0; wartosc >= j; j++)
{
bloczek_od = bloczek_od + 1;
if (bloczek_od == danebloczka.bloczek_od)
{
wartosc = 0;
MessageBox.Show("ID: " + id.ToString() + ", NR:" +
bloczek_od.ToString() + "");
}
else if (bloczek_do == danebloczka.bloczek_od)
{
wartosc = 0;
MessageBox.Show("ID: " + id.ToString() + ", NR:" +
bloczek_od.ToString() + "");
}
else if (bloczek_od == danebloczka.bloczek_do)
{
wartosc = 0;
MessageBox.Show("ID: " + id.ToString() + ", NR:" +
bloczek_od.ToString() + "");
}
else if (bloczek_do == danebloczka.bloczek_do)
{
wartosc = 0;
MessageBox.Show("ID: " + id.ToString() + ", NR:" +
bloczek_od.ToString() + "");
}
}
}
|
|
|
| Re: sprawdzanie zakresu danych - wielka prosba o pomoc [wiadomość #745 (odpowiedź na #742) ] |
sob, 07 lipiec 2007 17:22   |
Tomasz Muszyński Wiadomości: 17 Dołączył(a): kwiecień 2007 |
Junior Member |
|
|
sg_pl pisze:
> Witam ponownie dzisiaj i prosze o porade, mam do zrobienia taka rzecz, otoz
> w bazie mam 3 pola (seria, od, do) i formularz w ktorym dodaje np. AA,10,20.
> Moga sie zdarzyć dziury w numerach czyli przyjmijmy ze mam zapisane w bazie
> AA,10,20
> AA,21,30
> AA,50,60
>
> musze napisac funkcje, ktora sprawdzi przed zapisem czy liczba w polu od
> albo w polu do nie jest juz przypadkiem zapisana w jakims zakresie wczesniej
> dodanym. Walcze i walcze i wywalczylem ze jak wpisze np AA,22,32 to nie
> pozwala na zapis, jak dam AA,40,60 to tez jest ok ale jak juz dam AA,40,65
> to mi zapisuje i sie nie czepia, a powinien bo jest tu zawarty zakres od
> 50-60. Jak sie robi takie rzeczy?
Robi się to prostym zapytaniem. Pobranie całej tabeli do pamięci i
przeszukiwanie jej to kiepski pomysł. Możesz tam przecież mieć milion
rekordów... i co wtedy?
Wynik zapytania to bloczki z którymi jest konflikt.
SELECT * FROM bloczki
WHERE seria=@seria
AND ((@start BETWEEN od AND do)
OR (@end BETWEEN od AND do)
OR (@start < od AND @end > do))
> Zamieszczam ponizej kod ale prosze sie nie przerazac bo jest toistne
> rzezbiarstwo, po sprawdzeniu czy seria jest nastepuje zapis jezeli takiej
> jeszcze w bazie nie ma ale jezeli jest juz taka w bazie to przechodze do
> sprawdzenia zakresow i to juz masakra, po pierwsze nie dziala toco opisalem
> powyzej, a po drugie nie wiem gdzie wstawic zapis jak juz sie okaze ze
> takiego zakresu tam nie ma.
Faktycznie rzeźba i do niczego do się nie nadaje ;) Używaj
OleDbParameter zamiast wklejania parametrów bezpośrednio w SQL.
Napisałeś też coś takiego:
> string liczba = sprbloczekcmd.ExecuteScalar().ToString();
> ilosc = Int32.Parse(liczba.ToString());
Przecież ExecuteScalar() powinno zwrócić Ci już int a nie string. Po co
więc robisz konwersję z object (w środku jest int) na string i to
ponownie na int? Wystarczyło tak:
int liczba = (int) sprbloczekcmd.ExecuteScalar();
tm
PS: działania zapytania nie sprawdzałem, ale na oko jest ok :)
|
|
|
| Re: sprawdzanie zakresu danych - wielka prosba o pomoc [wiadomość #746 (odpowiedź na #742) ] |
sob, 07 lipiec 2007 17:33   |
Yamma Wiadomości: 14 Dołączył(a): maj 2007 |
Junior Member |
|
|
Użytkownik "sg_pl" <sg_pl@poczta.onet.pl> napisał w wiadomości
news:f6om1a$io3$1@news.onet.pl...
> Witam ponownie dzisiaj i prosze o porade, mam do zrobienia taka rzecz,
> otoz w bazie mam 3 pola (seria, od, do) i formularz w ktorym dodaje np.
> AA,10,20. Moga sie zdarzyć dziury w numerach czyli przyjmijmy ze mam
> zapisane w bazie
> AA,10,20
> AA,21,30
> AA,50,60
>
> musze napisac funkcje, ktora sprawdzi przed zapisem czy liczba w polu od
> albo w polu do nie jest juz przypadkiem zapisana w jakims zakresie
> wczesniej dodanym.
Taką funkcję, aż się prosi aby napisać jako procedurę po stronie bazy
danych, więc właściwie jest NTG. Ale niech ci będzie:
select count(*) from jakas_tabela where od between zakres_dolny and
zakres_gorny or do between zakres_dolny and zakres_gorny
Jak zwróci zero, to można wstawiać.
yamma
|
|
|
| Re: sprawdzanie zakresu danych - wielka prosba o pomoc [wiadomość #747 (odpowiedź na #745) ] |
sob, 07 lipiec 2007 17:44   |
sg_pl Wiadomości: 24 Dołączył(a): maj 2007 |
Junior Member |
|
|
Użytkownik "Tomasz Muszyński" <thom_ek@op.pl_nospam> napisał w wiadomości
news:f6p07q$u1$1@atlantis.news.tpi.pl...
> sg_pl pisze:
>> Witam ponownie dzisiaj i prosze o porade, mam do zrobienia taka rzecz,
>> otoz w bazie mam 3 pola (seria, od, do) i formularz w ktorym dodaje np.
>> AA,10,20. Moga sie zdarzyć dziury w numerach czyli przyjmijmy ze mam
>> zapisane w bazie
>> AA,10,20
>> AA,21,30
>> AA,50,60
>>
>> musze napisac funkcje, ktora sprawdzi przed zapisem czy liczba w polu od
>> albo w polu do nie jest juz przypadkiem zapisana w jakims zakresie
>> wczesniej dodanym. Walcze i walcze i wywalczylem ze jak wpisze np
>> AA,22,32 to nie pozwala na zapis, jak dam AA,40,60 to tez jest ok ale jak
>> juz dam AA,40,65 to mi zapisuje i sie nie czepia, a powinien bo jest tu
>> zawarty zakres od 50-60. Jak sie robi takie rzeczy?
>
> Robi się to prostym zapytaniem. Pobranie całej tabeli do pamięci i
> przeszukiwanie jej to kiepski pomysł. Możesz tam przecież mieć milion
> rekordów... i co wtedy?
> Wynik zapytania to bloczki z którymi jest konflikt.
>
> SELECT * FROM bloczki
> WHERE seria=@seria
> AND ((@start BETWEEN od AND do)
> OR (@end BETWEEN od AND do)
> OR (@start < od AND @end > do))
>
>> Zamieszczam ponizej kod ale prosze sie nie przerazac bo jest toistne
>> rzezbiarstwo, po sprawdzeniu czy seria jest nastepuje zapis jezeli takiej
>> jeszcze w bazie nie ma ale jezeli jest juz taka w bazie to przechodze do
>> sprawdzenia zakresow i to juz masakra, po pierwsze nie dziala toco
>> opisalem powyzej, a po drugie nie wiem gdzie wstawic zapis jak juz sie
>> okaze ze takiego zakresu tam nie ma.
>
> Faktycznie rzeźba i do niczego do się nie nadaje ;) Używaj OleDbParameter
> zamiast wklejania parametrów bezpośrednio w SQL.
>
> Napisałeś też coś takiego:
> > string liczba = sprbloczekcmd.ExecuteScalar().ToString();
> > ilosc = Int32.Parse(liczba.ToString());
>
> Przecież ExecuteScalar() powinno zwrócić Ci już int a nie string. Po co
> więc robisz konwersję z object (w środku jest int) na string i to ponownie
> na int? Wystarczyło tak:
>
> int liczba = (int) sprbloczekcmd.ExecuteScalar();
>
> tm
>
> PS: działania zapytania nie sprawdzałem, ale na oko jest ok :)
Wielkie dzięki, tyle się z tym meczylem a to takie proste - matko. Jeszcze
raz dziekuje za pomoc.
Sebastian
|
|
|
| Re: sprawdzanie zakresu danych - wielka prosba o pomoc [wiadomość #748 (odpowiedź na #746) ] |
sob, 07 lipiec 2007 19:20  |
Tomasz Muszyński Wiadomości: 17 Dołączył(a): kwiecień 2007 |
Junior Member |
|
|
Yamma pisze:
> Taką funkcję, aż się prosi aby napisać jako procedurę po stronie bazy
> danych, więc właściwie jest NTG. Ale niech ci będzie:
>
> select count(*) from jakas_tabela where od between zakres_dolny and
> zakres_gorny or do between zakres_dolny and zakres_gorny
>
> Jak zwróci zero, to można wstawiać.
Nie można. Brakuje trzeciego warunku... ;)
tm
|
|
|
Idź do forum:
Aktualna data: sob lut 11 05:58:51 EST 2012
Łączny czas generowania strony wyniósł 0,04909 sekund. |