konto usunięte

Temat: Access + VB

Witam, piszę aplikację wykorzystującą bazę danych Accessa. Niestety zatrzymałem się na pewnej rzeczy, której nie mogę obejść. Nie znam się na Accesie, ani SQL, dlatego mam pytanie.

W bazie mam 3 tabele:
Ustalenia (pola: ID, Numer_zamowienia, Grafik, Manager),
Grafik (pola: ID, Nazwisko),
Manager (pola: ID, Nazwisko).

Relacje są ustawione między Ustalenia[Grafik] -> Grafik[ID] oraz Ustalenia[Manager] -> Manager[ID].

Jedna z procedur wygląda tak:

Private Sub cbbPt_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbbPt.SelectedIndexChanged
Dim NumerPt As String = cbbPt.Items(cbbPt.SelectedIndex)
Dim NumerDtp As New OleDbCommand("SELECT grafik FROM ustalenia WHERE PT = '" & NumerPt & "'", PolaczenieDtp)
Dim OsobaDtp As New OleDbCommand("SELECT nazwisko FROM graficy WHERE ID = '" & NumerDtp.ExecuteScalar().ToString & "'", PolaczenieDtp)
If PolaczenieDtp.State = ConnectionState.Open Then
tbxDtp.Text = CStr(OsobaDtp.ExecuteScalar)
ElseIf PolaczenieDtp.State = ConnectionState.Closed Then
tbxDtp.Text = "Brak połączenia z bazą."
End If
End Sub


Pisałem to na zasadzie odpatrywania od działającego gotowca, więc jeśli ktoś widzi błąd proszę o opinię. :)

Moje pytanie, a raczej problem jest następujący... Zmienna NumerDtp bez problemu wyświetla numer ID grafika, teoretycznie (tak mi się wydaje) w zmiennej OsobaDtp powinno być przechowywane nazwisko o danym ID. Niestety podczas wykonywania program się wysypuje. To mój pierwszy program, który piszę z wykorzystaniem bazy, więc nie mam pojęcia czy źle ułożyłem zapytanie SQL, czy mam jakiś błąd w aplikacji.

Proszę o pomoc.

PS Mam nadzieję, że nie zagmatwałem za dużo. :)

konto usunięte

Temat: Access + VB

wysypuje sie z jakim komunikatem?
Nie widze ani zadeklarowanego connection string, ani otwierania polaczenia (connString jak rozumiem masz zadeklarowany jako global?) Istnieje metoda "trzymajaca" otwarte polaczenie?
a jesli o kod chodzi - to jesli ID to liczba - wywal " ' " (apostrofy) ja ograniczajace na zasadzie:

"select a from b where id=" & liczbaPiotr Jędrkowiak edytował(a) ten post dnia 06.04.09 o godzinie 07:50

konto usunięte

Temat: Access + VB


Obrazek


Na screenie jest błąd, który wyskakuje po wybraniu pozycji z listy.
Niestety wywalenie apostrofów nie pomogło.

Połączenie z bazą mam ustanawiane podczas otwierania formy i jest otwarte przez cały czas działania programu.Martin Nez edytował(a) ten post dnia 06.04.09 o godzinie 12:10
Piotr Owsiak

Piotr Owsiak
projektant/programis
ta .NET
(freelance/contrator
), pragma...

Temat: Access + VB

Kilka uwag:
- włącz zawijanie wierszy, bo nie widać całego kodu (UPDATE: sorki, kod był podawny w wiadomości już wcześniej :)
- kliknij "View details"
- najlepiej to skopiuj exception do schowka i wklej do tego wątku

Próbowałeś Google'ować ten komunikat?
Btw. jeśli chodzi o google'owanie, to lepiej to robić z angielskimi komunikatami.Piotr Owsiak edytował(a) ten post dnia 06.04.09 o godzinie 13:25

konto usunięte

Temat: Access + VB

No ale Exception dokładnie mówi co jest źle. Używasz "gdzieś" parametrów a nie ma go dodanego do kolekcji Parameters danego zapytania/lub też nie ma ustawionej wartości.

konto usunięte

Temat: Access + VB


Obrazek


Nie mam zbyt dużego pojęcia o wyjątkach, więc nie bardzo rozumiem te parametry. Dostałem wiadomość, żebym dodał "()" po metodzie ExecuteScalar, ale to także nie pomogło. W którym miejscu mogą być "przeszkadzające" parametry? I dlaczego, gdy wyświetlam w polu tekstowym NumerDtp to nie ma tego problemu?

konto usunięte

Temat: Access + VB

Co to jest PT w poleceniu "SELECT grafik FROM ustalenia WHERE PT = '" & NumerPt & "'".

W pierwszym poście nie wspominasz o takiej kolumnie w tabeli ustalenia.

konto usunięte

Temat: Access + VB

Faktycznie miałem też złe nazwy kolumn w bazie.
Drugim problemem były niepotrzebne apostrofy. :)

Dzięki wszystkim za pomoc.Martin Nez edytował(a) ten post dnia 07.04.09 o godzinie 10:24

konto usunięte

Temat: Access + VB

Edit:
Kolejny problem w innej procedurce. Na wszelki wypadek wklejam screen.

Obrazek


Testowałem ostatnie 5 linii kodu w innym programie i wszystko działa ok. Ktoś wie dlaczego w tym przypadku wyskakuje błąd?

konto usunięte

Temat: Access + VB

Które polecenie próbuje wykonać? Tzn. Jaka jest wartość zmiennej sql? Tak na chwilę obecną to typ danych jest niepoprawny z typem kolumny.

BTW. Lepiej byś zrobił jakbyś wklejał kod + exception. Ale jak musisz obrazek to mógłbyś te je wstawiać klikalne do dużej wersji? Przecież to się nie da nic odczytać, a za każdym razem nie chce mi się zoomować przeglądarki.

konto usunięte

Temat: Access + VB

sql np.: SELECT pt FROM ustalenia WHERE grafik = 4

Obecnie testuję drugi warunek instrukcji:
ElseIf tbxSzukajDtp.Text "" Then

Faktycznie linki do zdjęć są nieklikalne, myślałem, że forum zmniejszając zdjęcia tworzy link do oryginału. Jeśli chcesz powiększyć to wklep do przeglądarki adres obrazka, wrzucałem duże screeny. :)

konto usunięte

Temat: Access + VB

No niestety z tego co widzę na obrazku, to nie wiem dlaczego nie działa. Może ktoś inny coś zauważy.

Wyjątek mówi to, że w WHERE masz niezgodny typ danych z typem kolumny. Ale rozumiem, że kolumna 'grafik' ma typ int, więc powinno być ok.

BTW. Mam nadzieję, że wiesz co do SQL Injection i w wersji ostatecznej odpowiednio się przed tym zabezpieczysz.

konto usunięte

Temat: Access + VB

A co w przypadku gdy przynajmniej 2 pola tekstowe "Szukaj" będą wypełnione (powiedzmy 1 i 3), lub żadne z nich nie będzie?
Dla bezpieczenstwa warto by chociaz miast bezposredniego wstawiania zmiennej (bo dlaczego jako uzytkownik mialbym tam nie wpisac %'delete from managerowie where nazwisko like'% ?)w tekst komendy podac ja jako @param

Co do błędu:
czy pole "manager" i "grafik" to na pewno wartosc liczbowa? Wklej proszę zawartosc zmiennej "sql" po wyswietleniu bledu - sprawdzimy co w niej siedzi.Piotr Jędrkowiak edytował(a) ten post dnia 07.04.09 o godzinie 13:36

konto usunięte

Temat: Access + VB

W zmiennej sql było ok, ale faktycznie po powrocie do domu jeszcze raz sprawdziłem bazę i kolumny były tekstami. Sorry, że tak marudzę, ale to naprawdę moja pierwsza baza danych, którą robiłem w Accessie. :)
Pewnie będę miał jeszcze jakieś pytania, a póki co piszę dalej...

Jeśli chodzi o walidację wpisywanych danych to powinienem dać radę, a o sql injection to jak już będzie działało wszystko związane z bazą zajrzę do Googli. Dzięki za przypomnienie. :)

konto usunięte

Temat: Access + VB

kto pyta nie błądzi - po to jest ta grupa :) polecamy się na przyszłość :)
Piotr Owsiak

Piotr Owsiak
projektant/programis
ta .NET
(freelance/contrator
), pragma...

Temat: Access + VB

Martin Nez:
W zmiennej sql było ok, ale faktycznie po powrocie do domu jeszcze raz sprawdziłem bazę i kolumny były tekstami. Sorry, że tak marudzę, ale to naprawdę moja pierwsza baza danych, którą robiłem w Accessie. :)
Pewnie będę miał jeszcze jakieś pytania, a póki co piszę dalej...

Jeśli chodzi o walidację wpisywanych danych to powinienem dać radę, a o sql injection to jak już będzie działało wszystko związane z bazą zajrzę do Googli. Dzięki za przypomnienie. :)

Jeśli robisz bazę na Access'ie to SQL Injection raczej będzie Twoim najmniejszym problemem.
Nie przesadzajmy :)
Access'a nie ma sensu wykorzystywać w aplikacjach gdzie równocześnie pracować będzie 2+ osób.
A skoro będzie w danym momencie jedna osoba, to przed kim chciałbyś się zabezpieczać.
Do tego lepiej rób backup'y bo jak baza urośnie, to możesz mieć problem z jej spójnością oraz wydajnością.
Aaaa, i nie polecam umieszczania bazy na udziale sieciowym bo będzie bolało ;-P

Bill Vaughn pracował kiedyś w zespole od silnika Microsoft Jet i zwykł z humorem krytywkować go od czasu MSDE - taki sympatyczny MS Jet bashing ;)
Polecam wczesne odcinki .NET Rocks z nim:
dnr #7 http://www.dotnetrocks.com/default.aspx?showNum=7
dnr #18 http://www.dotnetrocks.com/default.aspx?showNum=18

@Paweł Łukasik:
Z "View Details" dostajesz cały stack trace i pełniejszy obraz tego co się stało.
Sam "Message" to nie wszystko co mówi exception ;-PPiotr Owsiak edytował(a) ten post dnia 09.04.09 o godzinie 16:33

konto usunięte

Temat: Access + VB

Piotr Owsiak:

Jeśli robisz bazę na Access'ie to SQL Injection raczej będzie Twoim najmniejszym problemem.

Jak dla mnie to czy to jest aplikacja używana tylko przez jednego użytkownika czy miliony, to zabezpieczyć się trzeba. Jeśli to jakaś aplikacja "biznesowa", to możemy dostać zarzut, że nie chronimy danych odpowiednio. To tak kwestią wyjaśnień, dlaczego o tym wspomniałem.
@Paweł Łukasik:
Z "View Details" dostajesz cały stack trace i pełniejszy obraz tego co się stało.
Sam "Message" to nie wszystko co mówi exception
To na pewno do mnie? Mam nadzieję, jednak że autor nie będzie wklejał tu całego StackTrace'a bo znając formatowanie GL i czasem wylewność tych komunikatów, będziemy mieli ładny kawałek tekstu do czytania.

konto usunięte

Temat: Access + VB

Mam kolejny problem. Przeszukałem kilka stron o sql i vb i z całości ułożyłem taki kod...

Private Sub btnDodaj_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDodaj.Click
If tbxDodajPt.Text <> "" And cbbDodajDtp.SelectedItem <> "" And cbbDodajProdukcja.SelectedItem <> "" And rtbDodajUstalenia.Text <> "" Then
Dim OsobaDtp As New OleDbCommand("SELECT id FROM graficy WHERE nazwisko LIKE '%" & cbbDodajDtp.SelectedItem.ToString & "%'", PolaczenieDtp)
MessageBox.Show(OsobaDtp.ExecuteScalar())

Dim OsobaMan As New OleDbCommand("SELECT id FROM managerowie WHERE nazwisko LIKE '%" & cbbDodajProdukcja.SelectedItem.ToString & "%'", PolaczenieDtp)
MessageBox.Show(OsobaMan.ExecuteScalar())

sql = "INSERT INTO ustalenia (pt, ustalenie, grafik, manager) VALUES ('" & tbxDodajPt.Text & "', '" & rtbDodajUstalenia.Text & "', " & _
OsobaDtp.ExecuteScalar() & ", " & OsobaMan.ExecuteScalar() & ")"
MessageBox.Show(sql)
Dim dodawanie As New OleDbCommand(sql, PolaczenieDtp)
MessageBox.Show("Dodano")
Else
MessageBox.Show("Chyba o czymś zapomniałeś.")
End If
End Sub

... niby wszystko jest ok. Warunki sprawdza dobrze, wyskakuje komunikat, że dodano wiersz do bazy, zmienna "sql" wygląda dobrze... Ale w bazie nie pojawia się nic nowego. Ktoś zna rozwiązanie?

konto usunięte

Temat: Access + VB

Chyba brakuje ci:
dodawanie.ExecuteNonQuery(); // C# 

konto usunięte

Temat: Access + VB

Działa. Dziękować.

Następna dyskusja:

Microsoft WebMatrix - kwas ...




Wyślij zaproszenie do