Janusz Górczyński. Wprowadzenie do programowania baz danych w VB.NET

Wielkość: px
Rozpocząć pokaz od strony:

Download "Janusz Górczyński. Wprowadzenie do programowania baz danych w VB.NET"

Transkrypt

1 Janusz Górczyński Wprowadzenie do programowania baz danych w VB.NET WSZiM w Sochaczewie, 2011

2 Spis treści 1 WSTĘP DO ADO.NET KOMPONENTY ADO.NET CONNECTION STRING OBIEKT CONNECTION SqlConnection OleDbConnection OBIEKT COMMAND Metoda ExecuteReader Metoda ExecuteScalar Metoda ExecuteNonQuery OBIEKT DATAREADER Metoda Read Metoda NextResult Metoda GetSchemaTable OBIEKT DATAADAPTER DataAdapter, polecenie Select DataAdapter, polecenia modyfikujące DataAdapter i CommandBuilder PROCEDURY PRZECHOWYWANE W VB.NET Procedura bezargumentowa Procedura z parametrami WYKORZYSTYWANE ŹRÓDŁA DANYCH STRUKTURA APLIKACJI DODATKOWE REFERENCJE MODUŁ WSPÓLNY KLASA CMOJEOLE OPIS POZYCJI OLEDB W MENU Adapter DataReader Przegląd tabel OPIS POZYCJI ADO (COM) W MENU Pobieranie tabel i pól, test zapytania Zbudowanie dynamicznego formularza

3 1.15 OPIS POZYCJI SQL Adapter Update tabeli via procedura przechowywana (klasycznie) Update tabeli via procedura przechowywana wg JG KLASA CFORSTORAGESUB Deklaracja zmiennych i prywatnych procedur klasy Kilka wybranych metod publicznych

4 1 Wstęp do ADO.NET ADO.NET jest opracowaną przez Microsoft technologią dostępową do baz danych, jest to jeden z ważnych składników środowiska.net Framework. Technologia ta zapewnia komunikację z relacyjnymi i nierelacyjnymi źródłami danych poprzez zestaw komponentów. ADO.NET zabezpiecza zarówno model połączeniowy ze źródłem danych jak i model bezpołączeniowy. W przypadku modelu połączeniowego (Connection Oriented Data Access Architecture) aplikacja zestawia połączenie ze źródłem danych, a następnie interaktywnie współpracuje z tym źródłem wykorzystując zapytania języka SQL. W tej technologii połączenie ze źródłem danych cały czas pozostaje otwarte, także wtedy, gdy aplikacja nie wykonuje żadnych operacji na źródle danych. W modelu bezpołączeniowym (Disconnected Data Access Architecture) połączenie jest zestawianie jedynie na moment, kiedy dane są pobierane ze źródła i umieszczane w obiekcie typu DataSet lub zwracane do źródła danych. 1.1 Komponenty ADO.NET Poniżej pokazany jest schemat funkcjonowania dostępu do baz danych z wykorzystaniem modelu ADO.NET (źródło: 4

5 Dwoma kluczowymi komponentami ADO.NET jest Data Provider oraz DataSet. Pierwszy z nich odpowiada za zestawienie połączenia ze źródłem danych, a drugi za reprezentowanie danych pobranych ze źródła (z bazy danych). Środowisko.Net Framework zabezpiecza trzy główne rodzaje provaiderów dla modelu ADO.NET: Microsoft SQL Provider obsługuje dostęp do baz danych MS SQL Server; OLEDB pozwala na dostęp do innych baz danych i innych źródeł danych; ODBC pozwala na tworzenie aplikacji z jednoczesnym dostępem do różnych typów danych. W przypadku zestawiania połączenia z MS SQL Server używamy obiektu SqlConnection, do innych baz danych OleDbConnection, a w przypadku korzystania z ODBC korzystamy z obiektu OdbcConnection. Cztery obiekty wchodzące w skład komponentu DataProvider zabezpieczają jego funkcjonalność. Są to obiekty: Connection odpowiada za fizyczne zestawienie połączenie ze źródłem danych; Command odpowiada za wykonanie zapytania skierowanego do źródła danych, może to być jawne polecenie SQL lub procedura przechowywana, zarówno wybierające jak i akcyjne (modyfikujące informacje w bazie danych); DataReader wyspecjalizowany obiekt do pobierania strumienia danych typu tylko do odczytu i do przeglądania jedynie w przód; DataAdapter obiekt pośredniczący w dostarczenie danych pobranych ze źródła do obiektu DataSet. Obiekt DataSet zabezpiecza bezpołączeniowy dostęp do danych pobranych ze źródła, jest tym samym całkowicie niezależny od tego źródła (poza momentem, gdy dane są pobierane z tego źródła). Obiekt DataSet może zawierać kolekcje obiektów DataTable, z których każdy jest wirtualnym odpowiednikiem danych pozyskanych ze źródła danych. Inną ważną kolekcją jest kolekcja relacji wiążąca obiekty DataTable. Obiekt DataTable zawiera kolekcję wierszy, kolekcję kolumn oraz kolekcję warunków nakładanych na poszczególne pola. Poniżej pokazany jest schemat obiektu DataSet. 5

6 1.2 Connection String Pod tym pojęciem rozumiemy informację tekstową zawierającą dane niezbędne do zestawienia połączenia ze źródłem danych. W zależności od użytego provaidera connection string ma następującą składnię: Microsoft SQL Server Connection String connetionstring ="Data Source = ServerName; Initial Catalog = Databasename; User ID = UserName; Password=Password" OLEDB Data Provider Connection String connetionstring = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = yourdatabasename.mdb;" ODBC Connection String connetionstring = "Driver = {Microsoft Access Driver (*.mdb)}; DBQ = yourdatabasename.mdb;" 6

7 1.3 Obiekt Connection SqlConnection Obiekt SqlConnection odpowiada za utworzenie fizycznego połączenia aplikacji z bazą danych serwera SQL. Instancja klasy SqlConnection otrzymuje jako argument łańcuch połączenia (connection string). Po zestawieniu (otwarciu) połączenia mogą być wykonywane polecenia pobrania czy modyfikacji danych w źródle danych. Poniżej jedna z możliwych instrukcji deklaracji i utworzenia instancji obiektu SqlConnection, kolejna otwiera połączenie z bazą danych. Dim conn As New SqlConnection(connection_string) conn.open() Utworzona instancja obiektu Connection nie jest automatycznie zamykana, nawet po wyjściu z procedury, w której nastąpiło zestawienie połączenia. Musimy pamiętać o tym, aby po zakończeniu operacji na bazie danych zamknąć otwarte połączenie, wystarczy skorzystać z metody Close. Przypisanie wartości Nothing jest sygnałem do zwolnienia zasobu (do jego usunięcia z pamięci RAM komputera). conn.close() conn = Nothing OleDbConnection Obiekt OleDbConnection odpowiada za utworzenie fizycznego połączenia aplikacji z bazą danych wskazaną w łańcuchu połączenia. Instancja klasy SqlConnection otrzymuje jako argument łańcuch połączenia (connection string). Po zestawieniu (otwarciu) połączenia mogą być wykonywane polecenia pobrania czy modyfikacji danych w źródle danych. Instrukcje deklaracji, utworzenia, otwarcia i zamknięcia połączenia są podobne do przedstawionych wyżej, cała różnica dotyczy użycia obiektu OleDbConnection zamiast SqlConnection. 1.4 Obiekt Command Obiekt Command odpowiada za wykonanie jawnego zapytania SQL lub procedury przechowywanej. Wymaga instancji obiektu Connection, otwarcia połączenia do źródła danych, a następnie przypisania go do właściwości Connection obiektu Command. Jeżeli wykonane zapytanie lub procedura przechowywana zwracają dane, to obiekt DataReader jest używany do ich odebrania z obiektu Command. Istotne właściwości tego obiektu to CommandText, który reprezentuje tekst zawierający polecenie do wykonania lub nazwę procedury przechowywanej oraz właściwość 7

8 CommandType, która określa rodzaj polecenia. Może to być jawne polecenie SQL, procedura przechowywana, może być to także tabela. Polecenie wykonywane jest po wywołaniu jednej z trzech metod, które udostępniane są przez obiekt Command Metoda ExecuteReader Metoda ta używana jest do pobrania ze źródła danych takiego ich zestawu, który chcemy tylko i wyłącznie przeglądać i to jedynie w przód. Zaletą jest szybkość działania tej metody. Wywołanie tej metody dostarcza dane do obiektu DataReader, którego nie można utworzyć programowo w kodzie (chodzi o to, że obiekt tego typu powstaje jako efekt wywołania metody ExecuteReader). Poniżej przykład fragmentu kodu, w którym tworzony jest obiekt DataReader. Dim dt As New DataTable Try conn.open() Dim oledbcmd As New OleDbCommand( Select * From Klienci, conn) Dim oledbreader As OleDbDataReader = oledbcmd.executereader dt.load(oledbreader) Metoda ExecuteScalar Metoda ta wykorzystywana jest w tych sytuacjach, w których zapytanie SQL lub procedura przechowywana zwraca pojedynczy wynik z bazy danych. Dokładnie rzecz biorąc metoda ExecuteScalar zwraca wynik z pierwszego pola pierwszego rekordu. Przykładowy fragment kodu wykorzystujący tę metodę pokazany jest niżej. Dim conn As New SqlConnection(connetionString) Try conn.open() Dim cmd As New SqlCommand( Select count(*) From Klienci, conn) Dim count As Integer = CInt(cmd.ExecuteScalar()) Cmd = Nothing conn.close() conn = Nothing Metoda ExecuteNonQuery Metoda uruchamia procedurę akcyjną typu insert (wstawienie rekordu), delete (usunięcie) lub update (aktualizację). Poniższy fragment kodu ilustruje użycie tej metody do usunięcia rekordu o danej wartości klucza. Dim conn As New OleDbConnection(connetionString) Try 8

9 conn.open() Dim cmd As New OleDbCommand( Delete From Klienci Where idk = 1, _ conn) cmd.executenonquery() conn.close() conn = Nothing 1.5 Obiekt DataReader Jak wcześniej już powidziełem obiekt DataReader pozwala na bardzo szybkie pobranie z bazy danych rekordestu, który możemy dalej wykorzystać np. jako źródło danych do takich obiektów jak ListBox, ComboBox czy DataGridView. Obiekt DataReader udostępnia trzy ważne metody: Read, NextResult oraz GetShemaTable Metoda Read Metoda Read pozwala na przeczytanie zawartości tego obiektu po pobraniu danych (czyli rekordów) odczytając wskazane pola przy pomiocy właściwości Item o podanym indeksie. Musimy pamiętać o tym, że po utworzeniu tego obiektu wskaźnik rekordów ustawiany jest na zerwej pozycji i że możemy te rekordy odczytywać tylko w przód (od zerowego do ostatniego indeksu). Oczywiście nie ma możliwości modyfikacji zestawu rekordów. Poniżej kod procedury odczytującej zawartość obiektu DataReader (procedura ta jest wmontowana w formularz frmoledbdatareader jako reakcja na klik przycisku o nazwie btnmetodaread). Imports System.Data.OleDb Private Sub btnmetodaread_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnmetodaread.click ' dekarujemy i tworzymy obiekt typu OLEDBConnetion Dim conn As New OleDbConnection(strconnOle) ' reszta operacji może spowodować błąd, dlatego umieszcamy je w Try-Catch Try ' otwieramy połączenie conn.open() ' deklarujemy i tworzymy obiekt typu OleDBCommand ' przekazując do niego zapytanie SQL oraz otwarte połączenie Dim oledbcmd As New OleDbCommand("select * from Pracownicy", conn) ' deklarujemy obiekt typu DBReader i wypełniamy go danymi ' poprzez wywołanie metody ExecuteReader obiektu OleDBCommand Dim oledbreader = oledbcmd.executereader ' czytamy obieky oledbreader Dim i As Integer, txt As String, j As Integer = 1 9

10 While oledbreader.read txt = "Rekord nr " & j.tostring & ": " For i = 0 To oledbreader.fieldcount - 1 txt &= oledbreader.item(i) & "; " Next MsgBox(txt.Substring(0, txt.length - 2), _ MsgBoxStyle.Information, _ "Ilustaracja metody Read obiektu DataReader") j += 1 End While oledbcmd = Nothing MsgBox("Wszystkie rekordy odczytane", MsgBoxStyle.Information, _ "Ilustaracja metody Read obiektu DataReader") Catch ex As Exception MsgBox("Problem z wykonaniem polecenia", _ MsgBoxStyle.Critical, _ "Ilustaracja metody Read obiektu DataReader") Finally conn.close() conn = Nothing End Try End Sub Metoda NextResult Metoda NextResult może być wykorzystywana w tych zapytaniach, w których zależy nam na zwróceniu więcej niż jednego zestawu rekordów przy jednym połączeniu z bazą danych. Poniżej kod procedury zaimplementowanej w formularzu frmoledbdatareader jako reakcji na klik przycisku o nazwie btnmetodanextresult). Imports System.Data.SqlClient Private Sub btnmetodanextresult_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnmetodanextresult.click Dim sql1, sql2 As String sql1 = "select * from Klienci;" sql2 = "select * from RodzajSal" ' dekarujemy i tworzymy obiekt typu SqlConnetion Dim conn As New SqlConnection(strconnSqL) ' reszta operacji może spowodować błąd, dlatego umieszcamy je ' w Try-Catch Try ' otwieramy połączenie conn.open() 10

11 ' deklarujemy i tworzymy obiekt typu sqlcommand ' przekazując do niego zapytanie SQL oraz otwarte połączenie Dim sqlcmd As New SqlCommand(sql1 & sql2, conn) ' deklarujemy obiekt typu DBReader i wypełniamy go danymi ' poprzez wywołanie metody ExecuteReader obiektu OleDBCommand Dim sqlreader = sqlcmd.executereader ' czytamy obieky oledbreader Dim i As Integer, txt As String, j As Integer = 1 While sqlreader.read txt = "Rekord nr " & j.tostring & ": " For i = 0 To sqlreader.fieldcount - 1 txt &= sqlreader.item(i) & "; " Next MsgBox(txt.Substring(0, txt.length - 2), _ MsgBoxStyle.Information, "Tabela Klienci") j += 1 End While ' urucgamiamy pobranie rekordsetu z drugiego polecenia sqlreader.nextresult() ' bedziemy czytać rekordy, ustawiamy zmienną j na 1 j = 1 While sqlreader.read txt = "Rekord nr " & j.tostring & ": " For i = 0 To sqlreader.fieldcount - 1 txt &= sqlreader.item(i) & "; " Next MsgBox(txt.Substring(0, txt.length - 2), _ MsgBoxStyle.Information, "Tabela RodzajSal") j += 1 End While sqlcmd = Nothing MsgBox("Wszystkie rekordy odczytane z obu tabel", _ MsgBoxStyle.Information, _ "Ilustaracja metod Read i NextResult obiektu DataReader") Catch ex As Exception MsgBox("Problem z wykonaniem polecenia", _ MsgBoxStyle.Critical, _ "Ilustaracja metod Read i NextResult obiektu DataReader") Finally conn.close() conn = Nothing End Try End Sub 11

12 1.5.3 Metoda GetSchemaTable W momencie utworzenia obiektu DataReader na podstawie zapytania sformułowanego w zapytaniu możemy pobrać informacje o kolumnach tego zapytania poprzez wywołanie metody GetSchemaTable. Metoda ta zwraca obiekt typu DataTable, który zawiera tyle wierszy, ile jest zwracanych w zapytaniu. Z pomocą zagnieżdżonych pętli For Each można przejrzeć kolekcję wierszy i kolumn obiektu DataTable odczytując nazwy właściwości poszczególnych kolumn tabeli bazy danych, do których odnosi się zapytanie oraz ich wartości. Poniżej kod procedury zaimplementowanej w formularzu frmoledbdatareader jako reakcji na klik przycisku o nazwie btngetschematable). Imports System.Data.SqlClient Private Sub btngetschematable_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btngetschematable.click ' dekarujemy i tworzymy obiekt typu SqlConnetion Dim conn As New SqlConnection(strconnSqL) ' reszta operacji może spowodować błąd, dlatego umieszcamy je w Try-Catch Try ' otwieramy połączenie conn.open() ' deklarujemy i tworzymy obiekt typu sqlcommand ' przekazując do niego zapytanie SQL oraz otwarte połączenie Dim sqlcmd As New SqlCommand("select * from Klienci", conn) ' deklarujemy obiekt typu DBReader i wypełniamy go danymi ' poprzez wywołanie metody ExecuteReader obiektu OleDBCommand Dim sqlreader = sqlcmd.executereader ' tworzymy obiekt DataTable i pobieramy schemat tabeli Dim schematable As DataTable = sqlreader.getschematable() pomocnicze zmienne dla odczytania schematu Dim row As DataRow Dim column As DataColumn ' przeglądamy wiersz po wierszu obiekt DataTable ' każdy wiersz opisuje jedną kolumnę tabeli bazy danych For Each row In schematable.rows Dim txt As String = "" For Each column In schematable.columns txt &= column.columnname & ",: " & row(column).tostring & _ vbcrlf Next MsgBox(txt) Next sqlreader.close() 12

13 Catch ex As Exception MsgBox("Problem z wykonaniem polecenia", MsgBoxStyle.Critical, _ "Ilustracja metody GetSchemaTable DataReader") Finally conn.close() conn = Nothing End Try End Sub 1.6 Obiekt DataAdapter Obiekt DataAdapter zabezpiecza komunikację między obiektem DataSet i źródłem danych (DataSource). DataAdapter pozwala, dzięki metodzie Fill, na dostarczenie danych do obiektu DataSet (dokładniej do obiektu DataTable, który jest tworzony w DataSet). Inne metody obiektu DataAdapter pozwalają także na komunikację odwrotną, czyli na wprowadzanie, aktualizację czy usuwanie danych w źródle (w DataSource) DataAdapter, polecenie Select Poniżej fragment kodu realizującego zadanie pobrania danych ze źródła i umieszczeniu ich w obiekcie typu DataSet. Imports System.Data.SqlClient ' inne potrzebne instrukcje Dim conn As New SqlConnection(strconn) Dim ds As New DataSet, i As Integer Try conn.open() Dim adapter As New SqlDataAdapter("select * from Klienci", conn) adapter.fill(ds) For i = 0 To ds.tables(0).rows.count - 1 MsgBox(ds.Tables(0).Rows(i).Item(1)) Next Catch ex As Exception MsgBox(ex.ToString) Finally conn.close() conn = Nothing End Try 13

14 1.6.2 DataAdapter, polecenia modyfikujące Poniżej fragment kodu procedury, której zadaniem jest wprowadzenie rekordu do tabeli WykazSal, która zawiera trzy pola: ids jako pole typu integer z automatyczną inkrementacją o jeden (jest kluczem tej tabeli), NrSali, pole typu tekstowego o długości do 5 znaków oraz LiczbaMiejsc, pole typu integer Imports System.Data.SqlClient Private Sub WprowadzRekord(ByVal strconn As String, _ ByVal txtnumer As String, ByVal Miejsc As Integer) Dim conn As New SqlConnection(strconn) Dim adapter As New SqlDataAdapter Dim sql As String sql = "Insert into WykazSal (NrSali, LiczbaMiejsc) values( " & _ NrSali & ", " & LiczbaMiejsc & ")" Try conn.open() adapter.insertcommand = New SqlCommand(sql, conn) adapter.insertcommand.executenonquery() MsgBox("Wiersz wstawiony") Catch ex As Exception MsgBox(ex.ToString) Finally conn.close() conn = Nothing End Try End Sub DataAdapter i CommandBuilder Z obiektem DataAdapter wykonującym zapytanie wybierającje wszystkie pola z danej tabeli (czyli polecenie select) współpracuje obiekt CommandBuilder, który potrafi wygenerować polecenia delete, update i insert na podstawie zapytania wybierającego. Wygenerowane zapytania aktualizujące można wykorzystać do aktualizacji danych w źródle danych. Poniżej fragment kodu ilustrujący takie działanie. Imports System.Data.OleDb Dim conn As New OleDbConnection(constring) Dim oledbcmdbuilder As OleDbCommandBuilder Dim ds As New DataSet, i As Integer Try conn.open() Dim oledbadapter As New OleDbDataAdapter( _ select * From Pracownicy, conn) oledbcmdbuilder = New OleDbCommandBuilder(oleDbAdapter) oledbadapter.fill(ds) 14

15 With ds.tables(0) For i = 0 To.Rows.Count - 1.Rows(i).Item(2) &= ".pl" Next End with oledbadapter.update(ds.tables(0)) MsgBox("Adresy mailowe uzupełnione") Catch ex As Exception MsgBox(ex.ToString) Finally conn.close() conn = Nothing End Try 1.7 Procedury przechowywane w VB.NET Bardzo silną stroną serwera SQL jest możliwość zaprojektowania w bazie danych utworzonej na tym serwerze zapytania napisanego w języku Transact-SQL, które następnie jest kompilowane i dopiero w takiej postaci wykonywane. Fakt komilacji zapytania znakomicie przyspiesza jego wykonanie i to jest pierwsza korzyść z procedur przechowywanych. Inna, nie mniej ważna związana jest z bezpieczeństwem bazy danych, a związana jest z faktem, że można tak skonfigurować uprawnienia, aby możliwość manipulowania danymi była jedynie za pośrednictwem procedur przechowywanych. Dzięki temu nie ma żadnej możliwości wykonania jawnego kodu SQL. Procedura przechowywana może być różnego typu, zarówno wybierająca jak i akcyjna. Z reguły będziemy wykorzystywać procedury z argumentami, zarówno wchodzącymi jak i wychodzącymi. Mogą się także zdarzyć procedury bezargumentowe, raczej wybierające niż akcyjne Procedura bezargumentowa Powiedzmy, że w bazie danych, do której będziemy się odwoływać istnieje tabela Klienci. Powiedzmy dalej, że chcemy z niej odczytać identyfikator klienta oraz jego nazwę. Procedura przechowywana może mieć następującą konstrukcję: Create procedure dbo.ppobierzdane As Select idk, Nazwa From Klienci order by Nazwa Po stronie aplikacji (VB.NET) pobranie tych danych i przypisanie ich jako źródło danych do obiektu typu ComboBox tak, aby pole Nazwa było wyświetlane w rozwijanej liście, 15

16 a pole idk było zwracane po wybraniu nazwy klienta w liście może być zrealizowane za pomocą niżej pokazanych instrukcji. Imports System.Data.SqlClient Dim conn As New SqlConnection(strconn) Dim cmd As New SqlCommand ' deklarujemy i tworzymy instancję obiektu dataset Dim ds As New DataSet Dim i As Integer ' reszta działań może spowodować błądm stąd użycie bloku ' Tray-Catch Try conn.open() ' przypisanie do właściowości Connection obiektu cmd ' otwartego połączenia cmd.connection = conn ' określenie typu polecenia cmd.commandtype = CommandType.StoredProcedure ' podanie nazwy procedury przechowywanej cmd.commandtext = "dbo.ppobierzdane" ' przygotowania do odebrania danych, które zwróci procedura ' deklarujemy obiekt typu DataReader Dim dr As SqlDataReader ' poprzez wywołanie metody ExecuteReader dostarczamy dane ' do DataReader dr = cmd.executereader ' deklarujemy i tworzymy obiekt typu Dataset Dim dt As New DataTable ' wywołujemy metodę Load utworzonego obiektu wskazując jako ' źródło danych obiekt dr (DataReader) dt.load(dr) ' tworzymy źródło danych dla cboklienci (ComboBox) With Me.cboKlienci.DataSource = dt.displaymember = Nazwa.ValueMember = idk End With Catch ex As Exception MsgBox(ex.ToString) Finally conn.close() conn = Nothing End Try 16

17 1.7.2 Procedura z parametrami Tak jak wspomniałem wcześniej w większości przypadków procedura przechowywana będzie posiadała parametry (argumenty). Przy jej wywoływaniu z aplikacji musimy utworzyć kolekcję parametrów. Dla każdego z nich musimy określić takie elementy jak nazwa parametru, jego typ, kierunek, rozmiar czy wartość. Powiedzmy, że mamy inną procedurę w naszej bazie, ta również zwraca klientów, ale będziemy ich dodatkowo rozróżniać z uwagi na wartość pola StatusKlienta, jest to pole typu integer. Create procedure int As Select idk, Nazwa From Klienci where StatusKlienta order by Nazwa Poniżej pokazany jest fragment kodu wywołujący tę procedurę, zwrócony zestaw rekordów będzie źródłem danych dla formantu typu ListBox. Użytkownikowi pokażemy nazwę klienta (pole Nazwa), po wyborze pozycji z listy chcemy otrzymać wartość pola idk. Będziemy pobierali listę tych klientów, dla których pole StatusKlienta ma wartość np. 2. Imports System.Data.SqlClient Dim conn As New SqlConnection(strconn) Dim cmd As New SqlCommand ' deklarujemy i tworzymy instancję obiektu dataset Dim ds As New DataSet Dim i As Integer ' reszta działań może spowodować błądm stąd użycie bloku ' Tray-Catch Try conn.open() ' przypisanie do właściowości Connection obiektu cmd ' otwartego połączenia cmd.connection = conn ' określenie typu polecenia cmd.commandtype = CommandType.StoredProcedure ' podanie nazwy procedury przechowywanej cmd.commandtext = "dbo.ppobierzdane" ' zerujemy kolekcję parametrów cmd.parameters.clear() ' deklarujemy nowy parametr Dim param As SqlParameter param = New SqlDbType.Int, 0) 17

18 param.value = 2 ' określamy, czy parametr jest wchodzący czy wychodzący param.direction = ParameterDirection.Input ' dodajemy utworzony parametr do kolekcji parametrów cmd.parameters.add(param) Dim dr As SqlDataReader dr = cmd.executereader Dim dt As New DataTable dt.load(dr) ' tworzymy źródło danych dla lstklienci (ListBox) With Me.lstKlienci.DataSource = dt.displaymember = Nazwa.ValueMember = idk End With Catch ex As Exception MsgBox(ex.ToString) Finally conn.close() conn = Nothing End Try W aplikacji ADOAndADONET zainteresowany Czytelnik znajdzie wiele przykładów wykorzystania modelu ADO.NET jak i starszego modelu ADO do przetwarzania informacji zgromadzonych w bazach danych. 18

19 Aplikacja ADOandADONET Aplikacja została przygotowana w celu zademonstrowania podstawowych metod modelu ADO.NET oraz jego poprzednika ADO w zakresie dostępu do baz danych typu MS Access oraz MS SQL Server. 1.8 Wykorzystywane źródła danych. Aplikacja korzysta z bazy danych TestSP.mdb zawierającej trzy przykładowe tabele o nazwach Studenci, Pracownicy i Przedmioty. Definicje tych tabel pokazane są niżej. Dla zademonstrowania współpracy z bazą SQL wykorzystywana będzie tabela o nazwie Klienci i definicji jak niżej. Tabela ta może być umieszczona w dowolnej bazie danych na lokalnym czy zdalnym serwerze MS SQL Server. Istotne jest, abyśmy mieli prawo modyfikowania danych w tej tabeli. Będziemy także korzystać z trzech procedur przechowywanych, ich definicje pokazane są niżej. Pierwsza z nich pobiera wszystkie dane z tej tabeli (instrukcją select), druga wykonuje instrukcję update (aktualizacji), a ostatnia odpowiada za wstawienie danych nowego klienta (instrukcja insert). Create procedure [dbo].[pdajdaneklientow] as select * from dbo.klienci order by Nazwa 19

20 Create procedure nvarchar(100) as update dbo.klienci set where Create procedure int out as insert into dbo.klienci (Nazwa, Adres, NIP, mail, telefon, @osoba) 1.9 Struktura aplikacji Aplikacja została zaprojektowana jako wieloformularzowa, zawiera formularz główny o nazwie frmmdiform, będzie on pełnił rolę kontenera dla pozostałych formularzy. Dodano do niego formant MenuStrip w celu zbudowania menu aplikacji. Poniżej widok projektu tego formularza z projektem menu. Jako główne pozycje w pasku menu umieszczono: SQL będzie zawierał polecenia związane z wykorzystaniem modelu ADO.NET do współpracy z bazą MS SQL Server; 20

21 OLEDB tu będą zgromadzone polecenia demonstrujące różne aspekty wykorzystania modelu ADO.NET do manipulowania danymi przykładowej bazy danych (TestSP.mdb); ADO (COM) dwa polecenia podrzędne w tej grupie pokażą jak można korzystać z starego modelu ADO do uzyskiwania informacji o strukturze bazy danych (o tabelach i polach wybranej tabeli). Będzie tu także pokazany sposób dynamicznego zbudowania formularzy ekranowych dla tabeli o nieznanej wcześniej strukturze (w pewnym sensie jako ciekawostka programistyczna). Do rozwiązania dodano plik modułu wspólnego o nazwie ADOWspolny.vb, będzie on zawierał deklaracje stałych i zmiennych o charakterze publicznym dla projektu, czyli takich, które muszą być dostępne dla pozostałych klas wykorzystywanych w tym rozwiązaniu. W projekcie umieszczono autorską klasę CForStorageSub zawierającą szereg metod ułatwiających dostęp do procedur przechowywanych oraz klasę CTestSQL jako jej klasę pochodną. Instancje klasy CTestSQL będą odpowiedzialne za wykonanie poleceń związanych z pozycją SQL w menu aplikacji. Klasa CMojeOle definiuje metody i właściwości związane z wykonywaniem poleceń związanych z pozycją OLEDB w menu aplikacji Dodatkowe referencje. Z uwagi na zamiar wykorzystywania modelu ADO musimy dodać do naszego rozwiązania referencje do odpowiednich bibliotek (jak pokazano niżej). 21

22 Po ich dodaniu lista referencji naszego rozwiązania powinna wyglądać tak, jak jest to pokazane niżej (ważne, aby były tam dwie pokazane wcześniej pozycje: adodb oraz Microsoft ADO Ext. 6.0 for DDL and security). 22

23 1.11 Moduł wspólny Jak wspomniałem wcześniej mamy tu deklaracje stałych i zmiennych publicznych, czyli takich, które muszą być dostępne we wszystkich innych obiektach tej aplikacji Klasa CMojeOle Klasa ta przeznaczona jest do obsługi baz danych typu MS Access, dlatego pierwsze jej dwie instrukcje importują odpowiednie przestrzenie nazw. W kodzie klasy zadeklarowano trzy zmienne prywatne, będą one wykorzystywane przez metody tej klasy. Widoczny jest także konstruktor bezparametrowy tej klasy. 23

24 Kolejny konstruktor (procedura publiczna o nazwie New) odpowiada za połączenie ze źródłem danych wskazanym informacją zawartą w argumencie strconn oraz wykonanie polecenia SQL przekazanego argumentem strsql. Kolejny konstruktor New będzie odpowiadał za powiązanie formularza zawierającego etykiety i pola tekstowe odpowiadające konkretnej tabeli bazy danych z danymi pobranymi z tej tabeli. Zakładamy, że nazwy pól tekstowych odpowiadających polom tej tabeli zaczynają się od prefiksu txt, jest to bardzo ważne, jeżeli mamy je powiązać z danymi (inaczej będzie błąd czasu wykonania). Z tego warunku wynika także ograniczenie na nazwy pól bazy danych nazwy te nie mogą zawierać spacji!. 24

25 Kolejny konstruktor będzie tworzył instancję klasy CMojeOle wykorzystywaną do pobrania ze źródła danych informacji, które mają być dostarczone do formantu typu ListBox jako jego źródło danych z jednoczesnym wskazaniem, jakie informacje mają być widoczne dla użytkownika oraz jaka informacja ma być zwrócona w momencie kliku danej pozycji listy. Z reguły w formularzu zawierającym formanty typu ListBox, CheckedListBox czy ComboBox tworzona jest procedura umożliwiające pobranie informacji o wskazanej przez użytkownika pozycji. Procedura taka obsługuje zdarzenie SelectedIndexChange, a jest wywoływana nie tylko w momencie kliku wybranej pozycji, lecz także w momencie definiowania źródła danych takiego formantu. W celu zablokowania takiej niepożądanej reakcji wykorzystamy zmienną publiczną flaga ustawiając jej wartość na False na czas definiowania źródła danych. 25

26 W klasie CMojeOle utworzyłem jeszcze jeden konstruktor, instancja klasy utworzona z jego pomocą buduje obiekt typu DataTable będący połączeniem dwóch tabel. Konstruktor został wymyślony po to, aby można było uzyskać źródło danych dla formantu typu ComboBox, gdzie na pierwszej pozycji będzie pozycja opisująca symbolicznie wszystkie pozostałe pozycje. Z reguły polega to na umieszczeniu na początku listy informacji typu (wszystko) czy (uwzględniając wymogi języka polskiego) (wszyscy) lub (wszystkie). Wybranie takiej pozycji jest wtedy odpowiednikiem zapytania select lista_kolumn from nazwa_tabeli. Z kolei wybranie innej pozycji jest odpowiednikiem zapytania jak wyżej, ale uzupełnionego warunkiem where. Przedstawiony niżej konstruktor realizuje przygotowanie odpowiedniego źródła danych. Przy okazji jego kod pokazuje, jak można manipulować takim obiektem jak DataTable poprzez 26

27 dodawanie nowych kolumn i wierszy, a także dołączenie do jednej tabeli innej tabeli o takiej samej strukturze. 27

28 Uzupełnieniem kodu klasy CMojeOle są jeszcze trzy procedury typu Property zwracające wartości wybranych zmiennych prywatnych. Poniżej widok diagramu UML klasy CMojeOle, jest na nim widoczna metoda o nazwie MergeDataTable, została ona zastąpiona przez ostatni z przedstawionych konstruktorów jako bardziej uniwersalne rozwiązanie. W grupie Methods widzimy informację o konstruktorach, o tym, że istnieje w sumie pięć konstruktorów (czyli mamy do czynienia z przeciążeniem metod). 28

29 1.13 Opis pozycji OLEDB w menu Adapter Wskazana pozycja menu otrzymała nazwę mnuapapterpracownicy, a jej klik spowoduje wykonanie pokazanej niżej procedury. Procedura deklaruje i tworzy nowy egzemplarz formularza frmoleadaptercmdb. W kolejnej instrukcji do zmiennej publicznej strcostam przypisywane jest zapytanie wybierające z tabeli Pracownicy wszystkie rekordy zawierające komplet pól. Treść tego zapytania jest także przypisywana do tytułu utworzonego formularza. Ostatnie dwie instrukcje określają formularz nadrzędny dla utworzonego formularza oraz nakazują jego wyświetlenie. Formularz frmoleadaptercmd jest stosunkowo prosty w sensie użytych formantów, zawiera bowiem tylko dwa formanty o nazwach: dgvdane formant typu DataGridView, będziemy w nim wyświetlać pobrane dane; btnaktualizuj przycisk polecenia, jego klik wywoła procedurę zdarzeniową odpowiedzialną za aktualizację danych. 29

30 Znacznie ciekawszy jest kod tego formularza. 30

31 Klik przycisku btnaktualizuj uruchamia poniższą procedurę. A tak wygląda ten formularz w trakcie pracy, do ostatniego wiersza w polu Adres dopisano dwa końcowe znaki. Klik przycisku Aktualizuj zmodyfikował dane w bazie danych. 31

32 DataReader Polecenia zebrane w tej pozycji menu demonstrują sposób pobrania danych z bazy w celu zbudowania źródła danych dla takiego formantu jak ListBox (analogicznie będzie dla ComboBox). Klik podpozycji Studenci (nazwa mnudrstudenci) uruchamia poniższą procedurę (w frmmdiform.vb). Pierwsza instrukcja tej procedury deklaruje i tworzy nowy egzemplarz formularza o nazwie frmoledatareader. Formularz ten zawiera jeden formant typu ListBox o nazwie cbopracownik. Do zmiennej globalnej strcostam przypisywane jest zapytanie zwracające dwie kolumny danych, pierwsza z nich zwraca identyfikator studenta, drugie kombinację dwóch pól (nazwisko i imię). Istotne są tutaj nazwy tych kolumn, w przypadku pierwszej będzie to nazwa pola, dla drugiej kolumny tworzymy nazwę (tu jest to Kto ). Kolejna instrukcja deklaruje i tworzy nowy egzemplarz klasy CMojeOle wykorzystując odpowiedni kontruktor. W efekcie tworzone i otwierane jest połączenie z bazą danych, za pomocą obiektu DataReader odczytywane są potrzebne dane i przypisywane do formantu listy. Jeżeli wszystko przebiegło poprawnie, to własność Komunikat jest pustym ciągiem znaków. Wykorzystując warunek If Then Else End if badamy, czy operacja pobrania danych i zbudowania źródła danych dla cbopracownik przebiegła poprawnie. Jeżeli tak, to pokazujemy formularz na ekranie, jak nie, to wyświetlamy stosowny komunikat. W kodzie formularza frmoledatareader mamy tylko jedną procedurę, jej zadaniem jest zwrócenie informacji o identyfikatorze wybranej przez użytkownika pozycji listy. Warto zwrócić uwagę na pierwszą instrukcję tej procedury, jest tu badanie, czy zdarzenie ma być obsługiwane czy też nie. Jeżeli zmienna globalna flaga nie jest True, to opuszczamy procedurę. 32

33 Tradycyjnie na zakończenie tego podrozdziału zrzut ekranowy pokazujący pracę tego formularza. 33

34 Przegląd tabel Ta pozycja menu OLEDB daje dostęp do trzech poleceń odpowiedzialnych za wyświetlenie indywidualnie zaprojektowanych formularzy dla tabel Pracownicy, Studenci i Przedmioty. Każdy z tych formularzy wyposażony jest w zestaw przycisków pozwalających na poruszanie się po rekordach tych tabel. Podpozycja Pracownicy w menu Przegląd tabel jest identyfikowana poprzez nazwę mnuppracownicy, a jej klik uruchamia pokazaną niżej procedurę. Pierwsza instrukcja tej procedury deklaruje i tworzy instancję (egzemplarz) formularza frmpracownicy (jego projekt będzie pokazany za chwilę). Kolejna instrukcja przypisuje do zmiennej prywatnej sql treść zapytania zwracającego wszystkie rekordy z tabeli Pracownicy. Deklarowany i tworzony jest egzemplarz klasy CMojeOle wykorzystujący jeden z konstruktorów tej klasy. Przekazujemy do niego łańcuch połączenia, treść zapytania oraz utworzony przed chwilą formularz. W klasie nastąpi otwarcie połączenia, pobranie potrzebnych danych, zwrócenie ich do obiektu typu DataSet oraz ustanowienie połączenia między polami 34

35 tekstowymi formularza a odpowiadającymi im kolumnami w tabeli o nazwie Test w DataSet. Utworzony obiekt DataSet będzie dostępny poprzez właściwość DajDS tej klasy. Jeżeli wszystko przebiegło poprawnie, to zmienna globalna mydataset otrzymuje potrzebny obiekt z instancji klasy, tworzony jest tytuł formularza i na końcu pokazujemy formularz. Gdyby coś poszło nie tak, to zamiast formularza wyświetlany jest stosowny komunikat. Poniżej pokazany jest projekt formularza frmpracownicy. Na jego powierzchni umieszczono pola tekstowe (TextBox) odpowiadające polom tabeli Pracownicy. Kolejno są to: txtid tu będzie wyświetlany identyfikator pracownika txtnazwisko jego nazwisko; txtimie i imię; txtadres oraz adres. Pola te poprzedzone są etykietami (Label), których właściwości Text zostały tak skomponowane, aby odpowiadały poszczególnym polom. Poniżej tych formantów umieszczono cztery przyciski o nazwach odpowiednio btnpierwszy, btnnastepny, btnpoprzedni oraz btnostatni. Właściwości Text tych przycisków zostały dostosowane do ich przeznaczenia, którym jest wymuszenie przejścia do wskazanego rekordu. Między tymi przyciskami umieszczono jeszcze jedno pole tekstowe, jego nazwa to NrRekordu (nie może zaczynać się od txt, bo wtedy była by próba skojarzenia tego pola z kolumną w obiekcie DataSet, a takiej kolumny nie ma). W polu tym będziemy wyświetlać numer bieżącego rekordu. 35

36 W kodzie klasy formularza frmpracownicy znajdziemy wiele ciekawych procedur. Prywatna procedura KtoryRekord ustala, jaki jest numer bieżącego rekordu, a następnie wyświetla go w polu tekstowym NrRekordu. Jej kolejnym zadaniem jest ustalenie, które z przycisków nawigacyjnych mają być dostępne, a które nie. Procedura obsługująca załadowanie formularza wywołuje tylko tą prywatną procedurę KtoryRekord. Kolejno budujemy procedury obsługujące poruszanie się po rekordach. 36

37 Tradycyjnie dwa zrzuty ekranowe tego formularza w pracy. 37

38 1.14 Opis pozycji ADO (COM) w menu Znajdziemy tu dwa polecenia, tak jak pokazano to niżej. Pierwsze z nich jest dostępne i pozwala na wskazanie pliku bazy danych MS Access w wersji 2003 (plik z rozszerzeniem *.mdb), jego otwarcie, pobranie listy tabel, a dla wybranej tabeli listy jej pól. Będziemy także mogli zbudować zapytanie SQL i zobaczyć efekt jego działania. Drugie z poleceń jest chwilo niedostępne, a będzie udostępnione dopiero po wskazaniu pliku bazy danych w pierwszym z pokazanych poleceń. Polecenie to jest ciekawe programistycznie, pokazuje bowiem jak programowo (dynamicznie) można budować formularze Pobieranie tabel i pól, test zapytania Klik tego polecenia powoduje wykonanie pokazanej niżej procedury. Jak widzimy nic ciekawego tu nie, pierwsza instrukcja tworzy instancję klasy formularza frmtestsql, a dwie kolejne odpowiadają za wyświetlenie formularza. Formularz frmtestsql jest dość skomplikowany, zawiera dwie listy, pole tekstowe do wyświetlenia treści zapytania, formant typu DataGridView do wyświetlenia wyników zapytania oraz kilka przycisków poleceń i etykiet opisujących niektóre formanty. Projekt formularza wraz z nazwami i przeznaczeniem poszczególnych formantów pokazany jest niżej. 38

39 lsttabele formant typu ListBox, będzie wyświetlał tabele wybranej bazy danych; lstpola także lista, będą tu pokazywane nazwy pól wybranej tabeli; txtsql pole tekstowe (TextBox), wyświetlimy w nim zapytanie. Jego właściwość Multiline została ustawiona na True, a wysokość formantu na 45 pkt (tak, aby można było pokazać dwa wiersze); dgvdane formant typu DataGridView, tu będziemy prezentować wyniki zapytania; btnaddwhere przycisk polecenia (Button), uruchamia dodanie do zapytania nazwy tabeli i słowa kluczowego Where; btnwykonaj przycisk uruchamiający procedurę odpowiedzialną za wykonanie zapytania; btnclearsql przycisk polecenia usuwający wszelkie informacje z pola txtsql. W kodzie klasy tego formularza umieszczono dość dużą liczbę procedur i funkcji odpowiedzialnych za jego funkcjonowanie. Kolejno będę je prezentował. 39

40 Zaczynamy od zaimportowania niezbędnych przestrzeni nazw (do współpracy z bazą danych MS Access. Pierwszą ważną funkcją w tej klasie jest GetFileName, funkcja odpowiedzialna za wyświetlenie okna dialogowe typu OpenFileDialog i pobranie od użytkownika pełnej nazwy pliku bazy danych (nazwy i ścieżki do niego wiodącej). Procedura obsługujące zdarzenia Load formularza korzysta z funkcji GetFileName. Jeżeli użytkownik wskazał plik bazy danych, to wykorzystując obiekt ADOX modelu ADO pobierane są informacje o tabelach tej bazy i umieszczane w liście lsttabele. 40

41 Ustalana jest liczna tabel dla wybranej bazy, ścieżka dostępu do niej umieszczane jest w zmiennej globalnej strconndynamic, a polecenie Zbudowanie dynamicznego formularza zostaje udostępnione. 41

42 Pokazana niżej procedura wykonywana jest w momencie, gdy użytkownik wybrał jedną z tabel. Musimy wtedy przejrzeć kolekcję tabel tej bazy, znaleźć tę tabelę, która została wybrana, a następnie pobrać listę pól dla tej wybranej tabeli. Nazwa pola (kolumny) może (choć lepiej byłoby gdyby nie) zawierać spację. W zapytaniu taka nazwa musi być opakowana w nawiasy kwadratowe. Pokazana niże funkcja realizuje właśnie to zadanie. 42

43 Kolejna procedura reaguje na klik jednej z pozycji w liście lstpola. Jej zadaniem jest skomponowanie treści zapytania wybierającego umieszczonego w polu txtsql. Klik przycisku Dodaj Where uruchamia procedurę, której zadaniem jest sprawdzenie, czy dotychczas skonstruowane zapytanie zawiera frazę From, jeżeli nie, to taka fraza jest dodawana do zapytania, następnie dodawana jest nazwa tabeli pobrana z lsttabele (czyli wybór użytkownika). Do sprawdzenia, czy w zapytaniu występowała fraza From wykorzystana została właściwość LastIndexOf zmiennej typu String. Inną przydatną ciekawostką jest ustawienia fokusa (kursora) w polu tekstowym w taki sposób, aby jego zawartość nie została zaznaczona. 43

44 Zadaniem prywatnej funkcji SprawdzZapytanie jest zbadanie, czy w treści zapytania mamy podaną informację z jakiej tabeli będziemy pobierać dane. Jeżeli wszystko jest OK., to funkcja zwraca True, jeżeli nie, to wyświetla stosowny komunikat i zwraca False. 44

45 Po skomponowaniu zapytania możemy sprawdzić jego funkcjonowanie poprzez klik przycisku opisanego jako Wykonaj (btnwykonaj), co powoduje wykonanie poniższej procedury. Pierwsza instrukcja tej procedury wywołuje funkcję SprawdzZapytanie, jeżeli funkcja zwraca False, to następuje wyjście z procedury. Do właściwości Text etykiety lblwynikzapytania chcemy zwrócić informację o liczbie zwróconych rekordów. Z uwago na język polski korzystamy z pomocniczej funkcji o nazwie OdmienRekordow, której zadaniem jest zwrócenie poprawnej odmiany słowa rekordów. Podobnie jak wcześniej pozostało już tylko pokazanie działania tego formularza. Poniżej dwa przykładowe zrzuty ekranowe. Zaczynamy od wskazania pliku bazy danych, tu jest to plik TestSP.mdb z dysku E:\. 45

46 Klik przycisku Otwórz wyświetla instancję formularza frmtestsql. Proszę zauważyć, że lista Dostępne tabele zawiera już tabele (użytkownika) utworzone w wybranej bazie danych. 46

47 Klik jednej z tych tabel powoduje pobranie jej listy pól i umieszczenie ich nazw w liście Pola wybranej tabeli. Jeżeli w liście pól klikniemy np. symbol gwiazdki, to do pola Budowane zapytanie zostanie wstawiony poniższy tekst. Klik przycisku Wykonaj (przy niekompletnym zapytaniu brakuje From Studenci ) może spowodować dwojaką reakcję. Albo zostanie zgłoszony błąd wynikający z konstrukcji zapytania albo funkcja SprawdzZapytanie poprawnie uzupełni zapytanie. 47

48 Klik przycisku powoduje taki efekt jak poniżej. Wyraźnie widzimy, że funkcja SprawdzZapytanie niezbyt poprawnie skorygowała nasze zapytanie, w rezultacie wystąpił błąd czasu wykonania, skwitowany pokazanym komunikatem. Możemy ręcznie poprawić zapytanie lub zastanowić się, jaki błąd został popełniony w funkcji SprawdzZapytanie. Drugi sposób jest trudniejszy, ale my zajmiemy się poprawieniem funkcjonowania tej funkcji. Co się stało i dlaczego wywołanie tej funkcji zmieniło wyjściowy tekst zapytania Select * na Select From Studenci zamiast Select * From Studenci? Przyczyna jest stosunkowo prosta. W procedurze obsługującej klik pozycji w liście lstpola jest fragment wskazany strzałką. 48

49 Jeżeli użytkownik wybrał symbol gwiazdki, to do pola txtsql został wstawiony tekst Select * (po gwiazdce jest jeszcze spacja). Z kolei w oryginalnej funkcji SprawdzZapytanie jest taki fragment: Jeżeli w treści zapytania nie było frazy From (a w naszym przykładzie nie było), to treść zapytania została skrócona o dwa znaki w naszym przypadku została skasowana *! Dotychczasowy fragment był dobrze pomyślany w tych sytuacjach, gdy użytkownik wybrał nie gwiazdkę, ale konkretne pole. Wtedy do pola txtsql wstawiany jest tekst Select nazwa_pola, (po nazwie pola dodawany jest przecinek i spacja). W takich sytuacjach poprawienie zapytania polegające na usunięciu dwóch ostatnich znaków i dodanie frazy From jest poprawne! Rozwiązanie jest banalnie proste, wystarczy w przypadku wybrania gwiazdki dodać do instrukcji select nie gwiazdkę i spację, lecz dwie spacje!. Po tej korekcie wszystko jest OK. 49

50 Zbudowanie dynamicznego formularza Korzystając z obiektu ADOX możemy pobrać informacje o strukturze bazy MS Access (o jej tabelach i polach tych tabel), co daje nam możliwość zbudowania formularza z formantem typu TabControl, gdzie w poszczególnych zakładkach umieścimy zestaw etykiet i pól tekstowych wyświetlających pojedyncze rekordy dla każdej z tabel Projekt formularza frmpojedynczyrekord jest stosunkowo prosty, umieszczono w nim wspomniany wyżej formant TabControl nadając mu nazwę tbczakladki. Wysokość formantu tbczakladki została tak dobrana, aby na dole formularza pozostał wolny pasek, w którym umieszczono cztery przyciski do obsługi nawigacji po rekordach oraz pole tekstowe do wyświetlenia numeru bieżącego rekordu. W prezentowanym rozwiązaniu wysokość formularza została ustawiona na 300 pkt, szerokość na 496 pkt. Z kolei wysokość formantu tbczakladki ustawiono na 227 pkt przy szerokości 475 pkt. Formant ten został ustawiony na pozycji 2, 2 względem lewego górnego narożnika formularza. Przyciski btnpierwszy, btnnastepny, btnpoprzedni oraz btnostatni będą funkcjonować jako wspólne przyciski nawigacyjne pozwalając na przemieszczanie kursora po zestawie rekordów danej tabeli. Między nimi umieszczono pole txtnrrekordu, będzie w nim wyświetlany numer bieżącego rekordu dla bieżącej zakładki (dokładniej: dla tabeli prezentowanej na bieżącej zakładki). Poniżej pełny kod klasy formularza frmpojedynczyrekord, prezentowane są wszystkie procedury i funkcje zabezpieczające funkcjonowanie tego formularza. 50

51 Imports System Imports System.Data ' import przestrzeni nazw niezbędnej do współpracy z bazą MS Access Imports System.Data.OleDb Public Class frmpojedynczyrekord Private nrzakladki As Integer Private mydataset As New DataSet Private myadapter As OleDbDataAdapter ' tablica X() będzie przechowywać numery bieżących ' rekordów dla każdego z formularzy (tabeli) Private X() As Long Private tabela As String Private Sub frmpojedynczyrekord_load(byval sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Dim adoconn As New ADODB.Connection, i As Integer = 0 ' deklaracja i utworzenie obiektu ADOX.Catalog Dim mycat As New ADOX.Catalog ' deklaracja zmiennej tbl typu tabela obiektu ADOX na ' potrzeby pętli For Each Dim tbl As ADOX.Table, col As ADOX.Column ' otwieramy połączenie z bazą danych, wywołujemy metodę ' Open obiektu adoconn adoconn.open(strconndynamic) ' wskazujemy aktywne połączenie dla obiektu mycat mycat.activeconnection = adoconn ' deklaracja formantów Dim mylbl As Label Dim mytxt As TextBox Dim j, nrz As Integer, yl As Integer = 10 Dim yt As Integer = 10 ' deklaracja zakładki formantu TabControl Dim mytab As TabPage nrz = -1 For Each tbl In mycat.tables ' jeżeli nie jest to tabela systemowa MS Access If tbl.name.substring(0, 2) <> "MS" Then nrz += 1 ' tworzymy egzemplarz nowej zakładki mytab = New TabPage ' komponujemy jej nazwę mytab.name = "tab" & tbl.name & "_" & nrz.tostring ' definuyjemy jej tytuł mytab.text = tbl.name 51

52 ' dodajemy utworzoną zakładkę do formantu TabControl Me.tbcZakladki.Controls.Add(myTab) ' a teraz dodajemy pola tekstowe i etykiety pól dla danej tabeli j = 0 For Each col In tbl.columns ' tworzymy egzemplarz etykiety mylbl = New Label ' właściwości Text przypisujemy nazwę kolumny mylbl.text = col.name ' tworzymy nazwę etykiety mylbl.name = "lbl" & UsunSpacje(col.Name) ' definiujemy wyrównanie tekstu w etykiecie mylbl.textalign = ContentAlignment.MiddleRight ' ustawiamy właściowość Location ' pierwszy argument jest stały i określa odsunięcie ' etykiety w poziomie od lewej krawędzi formantu ' drugi argument określa położenie pionowe i jest ' dynamicznie zmieniany mylbl.location = New System.Drawing.Point(15, j * ) ' ustawiamy także rozmiar etykiety (stały, bo nie wiadomo ' jaki będzie potrzebny) mylbl.size = New System.Drawing.Size(80, 13) ' tworzymy nowy egzemplarz formantu TextBox mytxt = New TextBox ' dynamicznie ustalamy jego położenie mytxt.location = _ New System.Drawing.Point(100, j * ) ' określamy rozmiar (szerokość, wysokość) tego formantu mytxt.size = New System.Drawing.Size(330, 20) ' nadajemy mu nazwę skomponowaną z prefiksu 'txt' i nazwy ' kolumny mytxt.name = "txt" & col.name ' dodajemy oba formanty do kolekcji formantów utworzonej ' zakładki mytab.controls.add(mylbl) mytab.controls.add(mytxt) ' powiększamy zmienną j o jeden (liczba par pól ' tekstowych i etykiet j += 1 Next ' wywołujemy prywatną procedurę, jej zadaniem jest pobranie ' danych z bazy i przypięcie ich do odpowiednich pól ' tekstowych 52

53 PobierzDane(nrZ) End If ' pobranie danych z tabeli zakończone, uruchamiamy kolejną ' Pętlę (obrót) Next ' sprzątamy po sobie adoconn.close() adoconn = Nothing ' jeżeli w bazie była co najmniej jedna kolumna, to If nrz > -1 Then ' zmieniamy rozmiar tablicy X() ReDim X(nrZ) ' w pętli ustawiamy zero na każdej pozycji tej tablicy For i = 0 To nrz X(i) = 0 ' ustawienie zerowego rekordu dla każej zakładki Next ' zakładką bieżącą będzie ta o indeksie 0 nrzakladki = 0 Me.tbcZakladki.TabPages.Item(nrZakladki).Select() ' wywołujemy procedurę wyświetlającą numer aktualnego rekordu ' dla bieżącej zakładki KtoryRekord() Else MsgBox("Nie odczytano żadnej tabeli użytkownika") End If End Sub Private Function UsunSpacje(ByVal nazwa As String) As String ' jeżeli nazwa pola zawiera spacje, to będą zastąpione podkreśleniem Return nazwa.replace(" ", "_") End Function Private Sub PobierzDane(ByVal nrz As Integer) ' ustawiamy zakładkę o indeksie nrz jako aktywną Me.tbcZakladki.TabPages(nrZ).Select() Dim txtsql As String, i As Integer tabela = tbczakladki.tabpages(nrz).text ' zbudowanie dynamicznego zapytania select * from nazwa_tabeli txtsql = "select * from " & tabela ' deklarujemy i tworzymy instancję obiektu Connection Dim jg As New OleDbConnection(strConnDynamic) ' kolejne instrukcje w bloku Try - Catch Try jg.open() ' otwarcie połączenia 53

54 ' zbudowanie egzemplarza obiektu Adapter w oparciu ' o zdefiniowane zapytanie i otwarte połączenie myadapter = New OleDbDataAdapter(txtSql, jg) ' wywołanie metody Fill z poleceniem przeniesienia do ' obiektu mydataset pobranych rekordów, zaczynając od rekordu ' o numerze 0, z określeniem maksymalnej liczby rekordów, ' pobrane dane mają utworzyć obiekt DataSet o nazwie tabela ' do zmiennej 'i' metoda Fill zwraca liczbę pobranych rekordów i = myadapter.fill(mydataset, 0, MaxLiczbaRekordow, tabela) ' jeżeli pobrano jakieś rekordy,... If i > 0 Then ' deklaracja obiektu ctl na potrzeby pętli For Each Dim ctl As Control ' przeglądamy kolekcję kontrolek wskazanej zakładki For Each ctl In tbczakladki.tabpages(nrz).controls ' jeżeli aktualny formant jest polem tekstowym, to... If TypeOf (ctl) Is TextBox Then ' wywołujemy metodę DataBindings tego formantu ' nakazując przypięcie do właściwości Text danych, ' Które będą pobierane z obiektu mydataset z obiektu ' typu DataTable o nazwie 'tabela' z kolumny, której ' nazwa jest zgodna z nazwą formantu ctl po odrzuceniu ' prefiksu txt ctl.databindings.add("text", mydataset, _ tabela & "." & ctl.name.substring(3, _ ctl.name.length - 3)) End If Next End If Catch ex As Exception MsgBox("Problem z pobraniem lub przypięciem danych do pól " & _ "tekstowych", MsgBoxStyle.Critical, "Dynamiczne formularze") Finally jg.close()' sprzątamy po sobie jg = Nothing End Try End Sub Private Sub btnpoprzedni_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnpoprzedni.click ' Dim tabela As String = tbczakladki.selectedtab.text Me.BindingContext(myDataSet, tabela).position -= 1 KtoryRekord() End Sub 54

55 Private Sub tbczakladki_click(byval sender As Object, _ ByVal e As System.EventArgs) Handles tbczakladki.click tabela = tbczakladki.selectedtab.text nrzakladki = Me.tbcZakladki.SelectedIndex Me.BindingContext(myDataSet, tabela).position = X(nrZakladki) KtoryRekord() End Sub Private Sub btnnastepny_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnnastepny.click Dim tabela As String = tbczakladki.selectedtab.text Me.BindingContext(myDataSet, tabela).position += 1 KtoryRekord() End Sub Private Sub btnpierwszy_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnpierwszy.click Dim tabela As String = tbczakladki.selectedtab.text Me.BindingContext(myDataSet, tabela).position = 0 KtoryRekord() End Sub Private Sub btnostatni_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnostatni.click Dim tabela As String = tbczakladki.selectedtab.text Me.BindingContext(myDataSet, tabela).position = _ mydataset.tables(tabela).rows.count KtoryRekord() End Sub Private Sub KtoryRekord() Dim pozycja As Long = _ Me.BindingContext(myDataSet, tabela).position X(nrZakladki) = pozycja Me.txtNrRekordu.Text = "Rekord nr " & (pozycja + 1).ToString If pozycja + 1 = mydataset.tables(tabela).rows.count Then Me.btnOstatni.Enabled = False Me.btnNastepny.Enabled = False Else Me.btnOstatni.Enabled = True Me.btnNastepny.Enabled = True End If If pozycja = 0 Then Me.btnPierwszy.Enabled = False Me.btnPoprzedni.Enabled = False 55

56 Else Me.btnPierwszy.Enabled = True Me.btnPoprzedni.Enabled = True End If End Sub End Class Instancja formularza frmpojedynczyrekord jest uruchamiana tylko wtedy, gdy wcześnie wykonane zostało polecenie Pobranie tabel i pól, test zapytania z menu ADO (COM), ponieważ wtedy do zmiennej globalnej strconndynamic zostanie przypisana ścieżka do pliku bazy danych MS Access. Poniżej stosowny fragment kodu z klasy formularza głównego naszej aplikacji (czyli frmmdiform). Private Sub mnudynamiczneformularze_click(byval sender As _ System.Object, ByVal e As System.EventArgs) _ Handles mnudynamiczneformularze.click If strconndynamic.length > 0 Then Dim frm As New frmpojedynczyrekord frm.mdiparent = Me frm.show() Else MsgBox("Polecenie niedostępne, baza danych nie jest znana") End If End Sub Poniżej widok zbudowanego formularza w tracie pracy, pokazany jest formularz ekranowy tabeli Pracownicy. 56

57 1.15 Opis pozycji SQL Ten fragment aplikacji wykorzystuje przykładową tabelę o nazwie Klienci, której definicję przedstawiono w rozdziale 2.1 tej pozycji. Kolejno zostanie przedstawione wykorzystanie obiektu Adapter do przeglądania i modyfikowania rekordów tej tabeli oraz bardziej zaawansowane przetwarzanie informacji z tej tabeli z pomocą procedur przechowywanych Adapter Formularz frmadaptersqlcmdb zawiera dwa formanty: DataGridView o nazwie dgvdane, w którym będziemy prezentować rekordy tabeli Klienci oraz przycisk polecenia (Button) o nazwie btnupdate. Przyciski minimalizacji i maksymalizacji formularza zostały pozostawione po to, aby użytkownik mógł modyfikować rozmiar tego formularza, jeżeli będzie zachodziła taka potrzeba. Z tych samych powodów pozostawiono możliwość ręcznego zmodyfikowania rozmiarów tego formularza (właściwość FormBorderStyle ustawiona na Sizable). Z tych powodów (dopuszczenia modyfikacji rozmiarów formularza) zmodyfikowano właściwość Anchor obu formantów. W przypadku dgvdane została ona ustawiona na zakotwiczenie tego formantu wg wszystkich czterech krawędzi formularza. 57

58 W przypadku przycisku btnupdate właściwość Anchor ustawiono wg prawej i dolnej krawędzi formularza. W kodzie klasy formularza zadeklarowano potrzebne zmienne oraz utworzono dwie procedury odpowiedzialne za jego funkcjonowanie. Poniżej kod tych procedur wraz z obszernymi komentarzami. ' Import potrzebnych przestrzeni nazw Imports System.Data Imports System.Data.SqlClient Public Class frmsqlupdateklienci ' deklaracja zmiennych modułu dla klasy formularza ' ich deklaracja w tym miejscu powoduje, że będą dostępne ' dla wszystkich procedur i funkcji w tej klasie Dim sqladapter As SqlDataAdapter Dim ds As DataSet ' tablica xupdate ma pełnić rolę wskaźnika czy jest potrzebna ' aktualizacja Dim xupdate() As Boolean Private Sub frmsqladaptercmdb_load(byval sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load ' dekalracja i utworzenie obiektu SQLConnection ' zmienna globalna strconnsql zawiera łańcuch połączenia do ' bazy SQL Dim conn As New SqlConnection(strconnSqL) ' utworzenie nowego egzemplarza obiektu DataSet ds = New DataSet ' dalsze instrukcje mogą spowodować błąd, stąd są w bloku ' Try-Catch Try ' otwieramy połaczenie z bazą conn.open() ' tworzymy nowy obiekt SqlDataAdapter przekazując do niego ' polecenie SQL i otwarte połączenie. Efektem jest dostarczenie ' do niego danych zgodnie z zapytaniem 58

59 sqladapter = New SqlDataAdapter("select * from dbo.klienci", _ conn) ' utworzenie egzemplarza obiektu SqlCommandBuilder przekazując ' mu obiekt Adapter ' rezultatem jest utworzenie 3 poleceń wykonujących Insert, ' Update i Delete Dim cmdbuilder As New SqlCommandBuilder(sqlAdapter) ' wywołanie metody Fill nakazujacej wypełnienie pobranymi ' danymi obiektu ds (DataSet) sqladapter.fill(ds) ' określamy żródło danych obiektu DataGridView Me.dgvDane.DataSource = ds.tables(0) ' zerowa kolumnna ma być niewidoczna Me.dgvDane.Columns(0).Visible = False Catch ex As Exception ' wystąpił błąd, zwracamy komunikat MsgBox("Problem z dostępem do bazy damych") Finally ' ten fragment jest wykonywany zawsze ' zamykamy połączenie conn.close() ' i zwalniamy zasób conn = Nothing End Try End Sub Private Sub btnupdate_click(byval sender As Object, _ ByVal e As System.EventArgs) Handles btnupdate.click Dim conn As New SqlConnection(strconnSqL) ' deklaracja i utworzenie nowego obiektu typu DataTable Dim dtzmiany As New DataTable Try conn.open() ' do obiektu DataTable pobieramy zmiany z tabeli o ' indeksie 0 z DataSet dtzmiany = ds.tables(0).getchanges ' jeżeli były zmienione rekordy to... If dtzmiany IsNot Nothing Then ' wywołujemy metodę Update obiektu Adapter ' metoda aktualizuje dane w bazie danych wykorzystując ' obiekt dtzmiany sqladapter.update(dtzmiany) ' komunikat na ekran MsgBox("AKtualizacja tabeli w bazie SQL zrobiona") 59

60 End If Catch ex As Exception ' ewentualny komunikat o błędzie MsgBox(ex.ToString) Finally 'sprzątamy conn.close() conn = Nothing End Try End Sub End Class Poniżej widok tego formularza w pracy. Pierwszy zrzut ekranowy pokazuje ten formularz w takich rozmiarach, jak został zaprojektowany. Efekt jest taki, że w formancie dgvdane został uaktywniony pasek poziomego przewijania, ponieważ część informacji (kolumn) pobranych z bazy danych nie jest widoczna. Możemy za pomocą myszy zmodyfikować rozmiar tego formularza tak, aby wyświetlał komplet kolumn (zniknie wtedy pasek poziomego przewijania). Dzięki ustawieniu właściwości Anchor dla formantu dgvdane tak, aby były zachowane jego odległości od wszystkich krawędzi formularza oraz ustawieniu tej samej właściwości dla przycisku btnupdate na trzymanie odległości względem prawej i dolnej krawędzi formularza jego wygląd po zmianie rozmiaru jest dokładnie taki, jakiego oczekujemy. 60

61 A co by było, gdybyśmy nie zmienili właściwości Anchor dla obu formantów? Konsekwencje pokazane są poniżej. Bez problemy zmieniamy rozmiar formularza, ale rozmiary i położenie obu formantów pozostały bez zmian. W przypadku dgvdane nic nam nie dało powiększenie rozmiarów formularza, ponieważ nie nastąpiło powieszenie rozmiarów tego formantu (aby zachować stałe, nadane na etapie projektowania, odległości od krawędzi formularza). Z kolei przycisk btnupdate pozostał na swoim miejscu, efekt jest taki, że albo będzie dla nas niedostępny, albo będzie nam przeszkadzał (wtedy, gdybyśmy ustawili poprawnie właściwość Anchor dla dgvdane). 61

62 Update tabeli via procedura przechowywana (klasycznie) Kolejna pozycja w menu SQL dotyczy wykonania aktualizacji danych w bazie za pośrednictwem procedury przechowywanej SQL. Działanie takie jest zdecydowanie lepsze od wykorzystania możliwości, jakie daje obiekt CommandBuilder, zwłaszcza w sytuacjach, gdy aktualizacja dotyczy tabeli powiązanej relacjami z innymi tabelami. Dla zademonstrowania takiego podejścia potrzebna nam będzie procedura przechowywana SQL realizująca zadanie aktualizacji wskazanego rekordu danej tabeli. Kod takiej procedury o nazwie pupdateklienci został zaprezentowany w rozdziale 2.1. Procedura pupdateklienci jest procedurą z parametrami, dla jej wykonania musimy przekazać do obiektu Command w modelu ADO.NET nie tylko nazwę procedury, lecz także szereg właściwości charakteryzujących poszczególne parametry. Będą to takie informacje jak nazwa parametru, jego typ, rozmiar, wartość oraz kierunek (może być parametr typu input lub output). Parametry te będą tworzyć kolekcję parametrów, która będzie elementem obiektu Command. Wykorzystamy w sensie projektu analogiczny formularz jak w poprzednim rozdziale, tym razem jego nazwa to frmsqlupdateklienci. Umieszczono na nim formant typu DataGridView o nazwie dgvdane oraz przycisk polecenie o nazwie btnupdate. Oba formanty mają, podobnie jak w formularzu frmadaptersqlcmdb, zmodyfikowaną właściwość Anchor w celu umożliwienia swobodnej zmiany rozmiaru formularza. Zasadnicza różnica kryje się w kodzie klasy tego formularza. Poniżej wszystkie instrukcje tej klasy wraz ze stosownymi komentarzami. Imports System.Data Imports System.Data.SqlClient Public Class frmsqlupdateklienci ' delaracja potrzebnych stałych i zmiennych Const txtkom As String = "Klasyczne wywołanie procedury SQL" Dim sqladapter As SqlDataAdapter Dim ds As DataSet ' tablica ta będzie wykorzystana jako wskaźnikowa ' w tym sensie, czy mamy robić update czy nie danego rekordu Dim xupdate() As Boolean Private Sub frmsqladaptercmdb_load(byval sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load ' deklarujemy i tworzymy instancję obiektu connection Dim conn As New SqlConnection(strconnSqL) ' deklarujemy i tworzymy instację obiektu Command 62

63 Dim cmd As New SqlCommand ' deklarujemy i tworzymy instancję obiektu dataset Dim ds As New DataSet Dim i As Integer ' reszta działań może spowodować błądm stąd użycie bloku ' Tray-Catch Try conn.open() ' przypisanie do właściowości Connection obiektu cmd ' otwartego połączenia cmd.connection = conn ' określenie typu polecenia cmd.commandtype = CommandType.StoredProcedure ' podanie nazwy procedury przechowywanej cmd.commandtext = "dbo.pdajdaneklientow" ' przygotowania do odebrania danych, które zwróci procedura ' deklarujemy obiekt typu DataReader Dim dr As SqlDataReader ' poprzez wywołanie metody ExecuteReader dostarczamy dane ' do DataReader dr = cmd.executereader ' deklarujemy i tworzymy obiekt typu Dataset Dim dt As New DataTable ' wywołujemy metodę Load utworzonego obiektu wskazując jako ' źródło danych obiekt dr (DataReader) dt.load(dr) ' tworzymy źródło danych dla obiektu DataGridView Me.dgvDane.DataSource = dt ' ukrywamy zerową kolumnę Me.dgvDane.Columns(0).Visible = False ' deklarujemy wymiary tablicy ReDim xupdate(dt.rows.count - 1) ' na wszystkich pozycjach tablicy ustawiamy wartość False For i = 0 To UBound(xUpdate) xupdate(i) = False Next Catch ex As Exception MsgBox("Problem z wykonaniem procedury pdajdaneklientow") Finally conn.close() cmd = Nothing conn = Nothing End Try ' ustawienie zmiennej globalnej flaga na True 63

64 flaga = True End Sub Private Sub btnupdate_click(byval sender As Object, _ ByVal e As System.EventArgs) Handles btnupdate.click Dim conn As New SqlConnection(strconnSqL), i, j As Integer Try conn.open() ' deklaracja i utworzenie egzemplarza (instancji) ' obiektu Command Dim cmd As New SqlCommand ' przypisanie mu potrzebnych informacji cmd.connection = conn cmd.commandtype = CommandType.StoredProcedure cmd.commandtext = "dbo.pupdateklienci" ' zerujemy kolekcję parametrów cmd.parameters.clear() ' deklarujemy nowy parametr Dim param As SqlParameter ' w pętli po wszystkich rekordach badamy, czy jest potrzebna ' aktualizacja For i = 0 To UBound(xUpdate) If xupdate(i) Then ' jest potrzebna, a więc... ' tworzymy kolekcję parametrów ' obiekt param staje się nowym parametrem o określonej ' nazwie. typie danych i rozmiarze ' rozmiar (ostatni parametr) jest niezerowy dla zmiennych typu String param = New SqlDbType.Int, 0) ' do właściwości Value przypisujemy wartość parametru ' pobraną z odpowiedniej kolumny i wiersza obiektu typu ' DataGridView. Musimy pamiętać o tym, ' że rekordy i kolumny są indeksowane od zera param.value = Me.dgvDane.Rows(i).Cells(0).Value ' określamy, czy parametr jest wchodzący czy wychodzący param.direction = ParameterDirection.Input ' dodajemy utworzony parametr do kolekcji parametrów cmd.parameters.add(param) ' param = New _ SqlDbType.NVarChar, 100) param.value = Me.dgvDane.Rows(i).Cells(1).Value param.direction = ParameterDirection.Input cmd.parameters.add(param) 64

65 ' param = New _ SqlDbType.NVarChar, 100) param.value = Me.dgvDane.Rows(i).Cells(2).Value param.direction = ParameterDirection.Input cmd.parameters.add(param) ' param = New SqlDbType.NVarChar, 13) param.value = Me.dgvDane.Rows(i).Cells(3).Value param.direction = ParameterDirection.Input cmd.parameters.add(param) ' param = New SqlDbType.NVarChar, 50) param.value = Me.dgvDane.Rows(i).Cells(4).Value param.direction = ParameterDirection.Input cmd.parameters.add(param) ' param = New _ SqlDbType.NVarChar, 50) param.value = Me.dgvDane.Rows(i).Cells(5).Value param.direction = ParameterDirection.Input cmd.parameters.add(param) ' param = New _ SqlDbType.NVarChar, 100) param.value = Me.dgvDane.Rows(i).Cells(6).Value param.direction = ParameterDirection.Input cmd.parameters.add(param) ' wszystkie parametry dla danego wiersza są już określone ' wywołujemy więc polecenie (metodę) ExewcuteNonQuery ' która odpowiedzialna jest za wykonanie polecenia ' modyfikującego cmd.executenonquery() End If Next ' wszystkie rekordy wymagające aktualizacji zostały Zmodyfikowane, sprzątamy po sobie param = Nothing cmd = Nothing MsgBox("Aktualizacja zakończona", MsgBoxStyle.Information, _ txtkom) Catch ex As Exception ' komunikat o błędzie 65

66 MsgBox("problem z wykonaiem procedury przechowywanej", _ MsgBoxStyle.Critical, txtkom) Finally ' zamykamy i zwalniamy obiekt Connection conn.close() conn = Nothing End Try End Sub Private Sub dgvdane_cellendedit(byval sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles dgvdane.cellendedit ' procedura wywoływana jest w momencie zakończenia edycji dowolnej ' komórki w danym wierszu DataGridView ' jeżeli flaga nie jest True to wyjdź If Not flaga Then Exit Sub ' konieczna jest zmiana w tabeli xupdate na pozycji, która jest ' Określona właściwością RowIndex argumentu e przekazanego do tej ' procedury z obiektu DataGridView. Inną właściwością argumentu e ' jest ColumnIndex, w sumie obie właściwości dają nam ' pełną informację o komórce, która została zaktualizowana ' poniższa instrukcja najpierw sprawdza, czy ten wiersz już nie ' został oznaczony jako wymagający aktualizacji, jeżeli nie, to na ' pozycji e.rowindex wpisujemy True If Not xupdate(e.rowindex) Then xupdate(e.rowindex) = True End Sub End Class Poniżej widok tego formularza w trakcie pracy. Po jego otwarciu został zmodyfikowany jego rozmiar tak, aby pola (kolumny) Adres oraz OsobaKontaktowa były w pełni widoczne. W ostatniej kolumnie pierwszego wiersza dopiszemy imiona do istniejącego nazwiska Abacki. 66

67 Dane zostały uzupełnione, symbol ołówka na początku gridu identyfikuje aktualnie modyfikowany rekord (wiersz). Klik przycisku Aktualizuj uruchamia procedurę aktualizującą. Po jej zakończeniu wyświetlany jest stosowny komunikat. Dla pokazania, że faktycznie zmiany w tabeli Klienci zostały utrwalone formularz został zamknięty i ponownie otwarty, jak widzimy pierwszy rekord został zmodyfikowany. Z przedstawionego kodu wynika, że taka standardowa (klasyczna) metoda wywołania procedury przechowywanej, zwłaszcza z dużą liczbą parametrów, jest dość uciążliwa. W kolejnym podrozdziale pokazana zostanie rozwiązanie, które znacznie ułatwia tworzenie takiego kodu (obsługującego wywołanie procedur przechowywanych SQL). 67

68 Update tabeli via procedura przechowywana wg JG W tym przykładzie wykorzystamy formularz o nazwie frmsqlupdateklienci2, ma on dokładnie taki sam zestaw formantów jak swój poprzednik, ale całkowicie inny kod. Wynika on między innymi z tego, że zaprojektujemy klasę, z pomocą której będziemy obsługiwać funkcjonowanie tego formularza. Klasa CTestSql Jest to klasa potomna (dziedzicząca) po klasie bazowej CForStorageSub, której kod będzie omówiony w kolejnym rozdziale. W klasie na potrzeby tego przykładu utworzono jeden interfejs z trzema metodami. Pełny kod wraz z komentarzami pokazany jest niżej. Imports System.Data Imports System.Data.SqlClient ' dekalrujemy interfejs klasy Public Interface IKlienci ' ten interfejs będzie obsługiwał operacje na tabeli Klienci ' deklarujemy funkcję, która będzie zwracać komunikat o ' ewentualnym błędzie Function Komunikat() As String ' dekalrujemy metodę odpowiedzialną za pobranie danych z ' tabeli Klienci Sub PrzygotujDaneDoEdycji(ByVal strconn As String, _ ByVal frm As frmsqlupdateklienci2) ' deklarujemy metodę odpowiedzialną za wykonanie aktualizacji ' danychx Sub WykonajUpdate(ByVal strconn As String, ByVal Xb() As Boolean, _ ByVal dgv As DataGridView) End Interface Public Class CTestSql ' tworzona klasa dziedziczy po klasie bazowej CForStorageSub Inherits CForStorageSub ' kod będzie implementował interfejs IKlienci Implements IKlienci ' deklarujemy prywatną zmienną mkomunikat i inicjalizujemy ją pustym ' ciągiem znaków Private mkomunikat As String = "" Public Function Komunikat() As String Implements IKlienci.Komunikat ' funkcja (metoda) zwraca zmienną prywatną mkomunikat Return mkomunikat End Function 68

69 Public Sub PrzygotujDaneDoEdycji(ByVal strconn As String, _ ByVal frm As frmsqlupdateklienci2) _ Implements IKlienci.PrzygotujDaneDoEdycji ' do metody przekazujemy jako parametry (argumenty) łańcuch ' połączenia oraz formularz będący instancją formularza ' frmsqlupdateklienci2 ' ' deklarujemy i tworzymy instancję obiektu Connection Dim conn As New SqlConnection(strconn) ' dekalrujemy obiekt typu DataTable Dim dt As DataTable ' reszta instrukcji w bloku obsługi ewentualnego błędu Try ' otwracie połączenia z bazą SQL conn.open() ' korzystamy z metody klasy bazowej i wywołujemy funkcję ' DajRekordset. Lista publicznych zmiennych, metod i ' właściwości klasy bazowej jest dostępna po słowie kluczowym ' MyBase i kropce. Wszystkie metody klasy bazowej, które ' wykorzystują pojedynczą procedurę przechowywaną mają podobny ' zestaw argumentów. Jest to składnia: ' Nazwa_Metody(obiekt_Connection, nazwa_procedury, ' lista_parametrow) ' jeżeli procedura nie ma parametrów, to ostatni składnik jest ' słowem "brak" ' w tym przypadku przekazujemy obiekt conn, nazwę procedury ' wraz z jej prefiksem oraz wyraz "brak" jako sygnał, że ' procedura nie ma argumentów. ' Metoda DajRekordset zwraca obiekt typu DataTabel, który ' przypisujemy do zmiennej dt dt = MyBase.DajRekordset(conn, "dbo.pdajdaneklientow", "brak") ' definiujemy teraz żródło danych dla formantu dgvdane frm.dgvdane.datasource = dt ' ukrywamy kolumnę zerową z kluczem tabeli frm.dgvdane.columns(0).visible = False Catch ex As Exception mkomunikat = "Problem z wykonaniem procedury pdajdaneklientow" Finally ' sprzątamy po sobie conn.close() conn = Nothing End Try End Sub 69

70 Public Sub WykonajUpdate(ByVal strconn As String, ByVal Xb() As _ Boolean, ByVal dgv As DataGridView) _ Implements IKlienci.WykonajUpdate ' ta metoda odpowiada za aktualizację tych rekordów gridu dgv, ' które wymagają aktualizacji. Informacja o tym, które rekordy ' zawarte jest w tablicy Xb Dim conn As New SqlConnection(strconn) Try conn.open() ' wywołujemy metodę UpdateWieleRekordow z klasy bazowej ' przekazujemy do niej argumenty: otwarte połączenie, nazwę ' procedury SQL, obiekt typu DataGridView jako źródło rekordów ' do aktualizacji, tablicę logiczną oraz zestaw nazw parametrów ' zawierających dla każdego z nich następujące informacje: ' nazwa parametru, jego typ, rozmiar oraz numer kolumny gridu, ' z której ma być pobrana jego wartość MyBase.UpdateWieleRekordow(conn, "dbo.pupdateklienci", _ dgv, Xb, _ jgtyp.jginteger, 0, 0, _ jgtyp.jgstring, 100, 1, _ jgtyp.jgstring, 100, 2, _ jgtyp.jgstring, 13, 3, _ jgtyp.jgstring, 50, 4, _ jgtyp.jgstring, 50, 5, _ jgtyp.jgstring, 100, 6) Catch ex As Exception mkomunikat = "Problem z update wielu rekordów" Finally conn.close() conn = Nothing End Try End Sub End Class Kod formularza frmsqlupdateklienci2 Fakt utworzenia klasy CTestSql znakomicie skraca i upraszcza kod, który musimy utworzyć w klasie tego formularza dla zabezpieczenia jego poprawnego funkcjonowania. Public Class frmsqlupdateklienci2 'deklaracja stałej i tablicy Const txtkom As String = "Wywołanie procedury SQL wg JG" Dim xupdate() As Boolean 70

71 Private Sub frmsqlupdateklienci2_load(byval sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load 'przedefiniowanie rozmiarów tablicy xupdate ReDim xupdate(me.dgvdane.rows.count - 1) ' ustawienie na każdej składowej wartości False For i As Integer = 0 To Me.dgvDane.Rows.Count - 1 xupdate(i) = False Next ' przypisanie wartości True do zmiennej globalnej flaga ' umożliwi rejestrowanie ewentualnych aktualizacji w gridzie flaga = True End Sub Private Sub btnupdate_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles btnupdate.click ' deklarujemy obiekt klasy CTestSql wykorzystując interfejs ' IKlienci Dim w As IKlienci ' tworzymy instancję klasy CTestSql z ogranieczeniem dostępu do ' metod udostępnionych przez interfejs IKlienci w = New CTestSql ' wywołujemy metodę WykonajUpdate przekazując do niej potrzebne ' argumenty, czyli łańcuch połączenia, tablicę xupdate oraz grid ' dgvdane w.wykonajupdate(strconnsql, xupdate, Me.dgvDane) ' sprawdzamy, czy wszystko przebiegło poprawnie If w.komunikat.length > 0 Then ' niestety nie, komunikat na ekran, jego treść została ' przygotowana w klasie CTestSql MsgBox(w.Komunikat, MsgBoxStyle.Critical, txtkom) Else MsgBox("Aktualizacja rekordów zakończona", _ MsgBoxStyle.Information, txtkom) End If End Sub Private Sub dgvdane_cellendedit(byval sender As Object, _ ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _ Handles dgvdane.cellendedit If Not flaga Then Exit Sub ' jeżeli jeszcze nie odnotowano, że wiersz (rekord) o indeksie ' e.rowindex jest aktualizowany, to ustaw na jego pozycji True If Not xupdate(e.rowindex) Then xupdate(e.rowindex) = True End Sub End Class 71

72 Kod uruchamiający formularz Formualarz frmsqlupdateklienci2 będzie uruchamiany poprzez klik odpowiedniego polecenia w menu SQL tej aplikacji. Musimy zadbać o to, aby formularz był pokazany dopiero wtedy, gdy pomyślnie pobrano dane z bazy danych. Jeżeli nie, to formularz nie jest pokazywany, a w jego miejsce wyświetlamy stosowny komunikat wyjaśniający sytuację. Poniżej kod procedury obsługującej klik polecenia mnuupdatejg z formularza frmmdiform. Private Sub mnuupdatejg_click(byval sender As System.Object, _ ByVal e As System.EventArgs) Handles mnuupdatejg.click Dim frm As New frmsqlupdateklienci2 flaga = False ' dekalracja obiektu klasy CTestSql ' z wykorzystaniem interfejsu IKlienci Dim w As IKlienci ' utworzenie instancji klasy CTestSql ' z uwagi na sposób deklaracji dostępne będa ' metody zadekalrowane w interfejsie IKlienci w = New CTestSql ' wywołanie metody PrzygotujDaneDoEdycji w.przygotujdanedoedycji(strconnsql, frm) ' sprawdzenie, czy pomyślnie pobrano dane z bazy ' i czy zostały przypisane do gridu formularza If w.komunikat.length = 0 Then ' tak, pokazujemy formularz ' ale obiekt w nie jest już potrzebny, zwalniamy zasób w = Nothing frm.mdiparent = Me frm.show() Else ' nie, komunikat na ekran MsgBox(w.Komunikat, MsgBoxStyle.Critical, _ "Błąd przygotowania danych") End If End Sub Klika zrzutów pokazujących pracę tego formularza Na zakończenie klika zrzutów pokazujących formularz w trakcie edycji danych zapisanych w tabeli Klienci. Powiedzmy, że w ostatniej kolumnie drugie imię Kamil dopisano pomyłkowo w pierwszym rekordzie zamiast w drugim. 72

73 Poprawiamy błąd kasując Kamil w pierwszym rekordzie i dopisując to imię w drugim. Błędy poprawione, wykonujemy klik przycisku Aktualizuj. Procedura aktualizująca wykonuje swoją pracę i wyświetla stosowny komunikat. Na zakończenie zamykamy formularz i ponownie go otwieramy, jak widzimy zmiany są w bazie. 73

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013 Prowadzący: mgr inż. Tomasz Jaworski Strona WWW: http://tjaworski.kis.p.lodz.pl/ Visual Basic.NET dostęp do bazy danych Baza Microsoft SQL Server Compact

Bardziej szczegółowo

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Projekt Hurtownia, realizacja rejestracji dostaw produktów Projekt Hurtownia, realizacja rejestracji dostaw produktów Ćwiczenie to będzie poświęcone zaprojektowaniu formularza pozwalającego na rejestrację dostaw produktów dla naszej hurtowni. Dane identyfikujące

Bardziej szczegółowo

Materiały do laboratorium MS ACCESS BASIC

Materiały do laboratorium MS ACCESS BASIC Materiały do laboratorium MS ACCESS BASIC Opracowała: Katarzyna Harężlak Access Basic jest językiem programowania wykorzystywanym w celu powiązania obiektów aplikacji w jeden spójny system. PROCEDURY I

Bardziej szczegółowo

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Projekt Hurtownia, realizacja rejestracji dostaw produktów Projekt Hurtownia, realizacja rejestracji dostaw produktów Ćwiczenie to będzie poświęcone zaprojektowaniu formularza pozwalającego na rejestrację dostaw produktów dla naszej hurtowni. Dane identyfikujące

Bardziej szczegółowo

Architektura ADO.NET Dostawcy danych Modele dostępu do danych model połączeniowy Model bezpołączeniowy

Architektura ADO.NET Dostawcy danych Modele dostępu do danych model połączeniowy Model bezpołączeniowy Architektura ADO.NET Dostawcy danych Modele dostępu do danych model połączeniowy Model bezpołączeniowy 2015-12-18 1 Języki i paradygmaty - 9 Architektura ADO.NET - zestaw abstrakcyjnych klas, które udostępniają

Bardziej szczegółowo

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją

3 Delegacje. 3.1 Tworzenie delegacji. 3.2 Skojarzenie delegacji z procedurą czy funkcją 3 Delegacje Delegacja to specjalny typ danych, który przechowuje referencję (adres) do procedury lub funkcji. W środowisku.net delegacja jest odpowiednikiem wskaźnika (pointer) do funkcji znanego z języka

Bardziej szczegółowo

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji Tworzenie bazy danych w postaci aplikacji Access - Aplikacja 1. Otwórz plik zawierający bazę danych Wypożyczalni kaset video o nazwie Wypożyczalnia.mdb. 2. Utworzy kwerendę, która wyświetli tytuły i opisy

Bardziej szczegółowo

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre) Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie

Bardziej szczegółowo

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI LABORATORIUM TECHNOLOGIA SYSTEMÓW INFORMATYCZNYCH W BIOTECHNOLOGII Aplikacja bazodanowa: Cz. II Rzeszów, 2010 Strona 1 z 11 APLIKACJA BAZODANOWA MICROSOFT ACCESS

Bardziej szczegółowo

Microsoft Access zajęcia 3 4. Tworzenie i wykorzystanie kwerend, formularzy i raportów

Microsoft Access zajęcia 3 4. Tworzenie i wykorzystanie kwerend, formularzy i raportów Microsoft Access zajęcia 3 4 Tworzenie i wykorzystanie kwerend, formularzy i raportów Kwerendy służą do tworzenia unikalnych zestawów danych, niedostępnych bezpośrednio z tabel, dokonywania obliczeń zawartych

Bardziej szczegółowo

Praca z bazą danych. Rysunek 1. Projekt tabeli UZYTKOWNIK bazy KURSY

Praca z bazą danych. Rysunek 1. Projekt tabeli UZYTKOWNIK bazy KURSY Praca z bazą danych Aby móc korzystać z niniejszego kursu musimy utworzyć bazę danych o nazwie KURSY, tabelę o nazwie UZYTKOWNIK, a w tabeli tej utworzyć następujące kolumny: user_id typu integer/autonumer

Bardziej szczegółowo

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS UNIWERSYTET ZIELONOGÓRSKI INSTYTUT INFORMATYKI I ELEKTROTECHNIKI ZAKŁAD INŻYNIERII KOMPUTEROWEJ Przygotowali: mgr inż. Arkadiusz Bukowiec mgr inż. Remigiusz Wiśniewski LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

Bardziej szczegółowo

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości część 2 Zaprojektowaliśmy stronę dodaj_dzial.aspx proszę jednak spróbować dodać nowy dział nie podając jego nazwy

Bardziej szczegółowo

LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika

LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika Prowadzący: Dr inż. Jacek Habel Instytut Technologii Maszyn i Automatyzacji Produkcji Zakład Projektowania Procesów

Bardziej szczegółowo

5.4. Tworzymy formularze

5.4. Tworzymy formularze 5.4. Tworzymy formularze Zastosowanie formularzy Formularz to obiekt bazy danych, który daje możliwość tworzenia i modyfikacji danych w tabeli lub kwerendzie. Jego wielką zaletą jest umiejętność zautomatyzowania

Bardziej szczegółowo

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,

Bardziej szczegółowo

Dostęp do baz danych w ASP.NET.

Dostęp do baz danych w ASP.NET. Ćwiczenie 12 Temat: Dostęp do baz danych w ASP.NET. Kontrolki źródeł danych i wizualizacyjne. Wyświetlanie i edycja danych. Cel ćwiczenia: W ramach ćwiczenie student zapozna się z kontrolkami umożliwiającymi

Bardziej szczegółowo

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Laboratorium nr 4. Temat: SQL część II. Polecenia DML Laboratorium nr 4 Temat: SQL część II Polecenia DML DML DML (Data Manipulation Language) słuŝy do wykonywania operacji na danych do ich umieszczania w bazie, kasowania, przeglądania, zmiany. NajwaŜniejsze

Bardziej szczegółowo

Tworzenie bazy danych na przykładzie Access

Tworzenie bazy danych na przykładzie Access Tworzenie bazy danych na przykładzie Access Tworzenie tabeli Kwerendy (zapytania) Selekcja Projekcja Złączenie Relacja 1 Relacja 2 Tworzenie kwedend w widoku projektu Wybór tabeli (tabel) źródłowych Wybieramy

Bardziej szczegółowo

DECLARE VARIABLE zmienna1 typ danych; BEGIN

DECLARE VARIABLE zmienna1 typ danych; BEGIN Procedury zapamiętane w Interbase - samodzielne programy napisane w specjalnym języku (właściwym dla serwera baz danych Interbase), który umożliwia tworzenie zapytań, pętli, instrukcji warunkowych itp.;

Bardziej szczegółowo

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości Rozpoczniemy od zaprojektowania bazy danych w programie SYBASE/PowerDesigner umieszczamy dwie Encje (tabele) prawym

Bardziej szczegółowo

Bazy danych Karta pracy 1

Bazy danych Karta pracy 1 Bazy danych Karta pracy 1 Bazy danych Karta pracy 1 1. Utwórz katalog Bazy danych służący do przechowywania wszelkich danych dotyczących kursu. 2. W katalogu Bazy danych stwórz podkatalog BD1 służący jako

Bardziej szczegółowo

Zapytania i wstawianie etykiet z bazy danych do rysunku

Zapytania i wstawianie etykiet z bazy danych do rysunku Zapytania i wstawianie etykiet z bazy danych do rysunku Pracujemy z gotową bazą danych MSAccess o nazwie KOMIS.MDB. Baza ta składa się z kilku tabel, rys. 1 Rys. 1. Diagram relacji. Wybierając w MSAccess,

Bardziej szczegółowo

Laboratorium 7 Blog: dodawanie i edycja wpisów

Laboratorium 7 Blog: dodawanie i edycja wpisów Laboratorium 7 Blog: dodawanie i edycja wpisów Dodawanie nowych wpisów Tworzenie formularza Za obsługę formularzy odpowiada klasa Zend_Form. Dla każdego formularza w projekcie tworzymy klasę dziedziczącą

Bardziej szczegółowo

Wykład III. dr Artur Bartoszewski www.bartoszewski.pr.radom.pl. Wydział Nauczycielski, Kierunek Pedagogika Wprowadzenie do baz danych

Wykład III. dr Artur Bartoszewski www.bartoszewski.pr.radom.pl. Wydział Nauczycielski, Kierunek Pedagogika Wprowadzenie do baz danych Wydział Nauczycielski, Kierunek Pedagogika Wprowadzenie do baz danych dr Artur Bartoszewski www.bartoszewski.pr.radom.pl Wykład III W prezentacji wykorzystano fragmenty i przykłady z książki: Joe Habraken;

Bardziej szczegółowo

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,

Bardziej szczegółowo

ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA

ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA LABORATORIUM SYSTEMÓW MOBILNYCH ZAPOZNANIE SIĘ ZE SPOSOBEM PRZECHOWYWANIA DANYCH NA URZĄDZENIACH MOBILNYCH I. Temat ćwiczenia II. Wymagania Podstawowe wiadomości z zakresu obsługi baz danych i języka SQL

Bardziej szczegółowo

Rozdział 4 KLASY, OBIEKTY, METODY

Rozdział 4 KLASY, OBIEKTY, METODY Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej

Bardziej szczegółowo

Makra Access 2003 wg WSiP Wyszukiwanie, selekcjonowanie i gromadzenie informacji Ewa Mirecka

Makra Access 2003 wg WSiP Wyszukiwanie, selekcjonowanie i gromadzenie informacji Ewa Mirecka Makra Access 2003 wg WSiP Wyszukiwanie, selekcjonowanie i gromadzenie informacji Ewa Mirecka Makra pozwalają na zautomatyzowanie często powtarzających się czynności. Opierają się na akcjach np.: otwarcie

Bardziej szczegółowo

MsAccess - ćwiczenie nr 3 (zao) Budowa formularzy

MsAccess - ćwiczenie nr 3 (zao) Budowa formularzy Opracowanie: dr hab. Marzena Nowakowska, dr Maria Szczepańska, mgr Grażyna Gębal MsAccess - ćwiczenie nr 3 (zao) Budowa formularzy 1. Opracować formularz Pracownicy edycja wg wzorca przedstawionego na

Bardziej szczegółowo

Tworzenie raportów. Ćwiczenie 1. Utwórz Autoraport przedstawiający tabelę Studenci. - 1 -

Tworzenie raportów. Ćwiczenie 1. Utwórz Autoraport przedstawiający tabelę Studenci. - 1 - - 1 - Tworzenie raportów 1. Wstęp Raporty-zawierają dane z tabel lub kwerend odpowiednio uporządkowane w pożądany przez użytkownika sposób. Raport jest wygodnym sposobem prezentacji danych w postaci wydrukowanej.

Bardziej szczegółowo

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE,

Programowanie w SQL. definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, Programowanie w SQL definicja bloku instrukcji BEGIN...END, warunkowe wykonanie instrukcji IF...ELSE, wyrażenie CASE, kontynuacja działania od instrukcji za podaną etykietą GOTO etykieta, wyjście bezwarunkowe

Bardziej szczegółowo

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1 1 LINQ 1 1. Cel zajęć Celem zajęć jest zapoznanie się z technologią LINQ oraz tworzeniem trójwarstwowej aplikacji internetowej. 2. Zadanie Proszę przygotować aplikację WWW, która: będzie pozwalała na generowanie

Bardziej szczegółowo

15. Funkcje i procedury składowane PL/SQL

15. Funkcje i procedury składowane PL/SQL 15. Funkcje i procedury składowane PLSQL 15.1. SQL i PLSQL (Structured Query Language - SQL) Język zapytań strukturalnych SQL jest zbiorem poleceń, za pomocą których programy i uŝytkownicy uzyskują dostęp

Bardziej szczegółowo

BAZY DANYCH Formularze i raporty

BAZY DANYCH Formularze i raporty BAZY DANYCH Formularze i raporty Za pomocą tabel można wprowadzać nowe dane, przeglądać i modyfikować dane już istniejące. Jednak dla typowego użytkownika systemu baz danych, przygotowuje się specjalne

Bardziej szczegółowo

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio

Podstawy programowania. Ćwiczenie. Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio Podstawy programowania Ćwiczenie Pojęcia bazowe. Języki programowania. Środowisko programowania Visual Studio Tematy ćwiczenia algorytm, opis języka programowania praca ze środowiskiem, formularz, obiekty

Bardziej szczegółowo

Przewodnik Szybki start

Przewodnik Szybki start Przewodnik Szybki start Program Microsoft Access 2013 wygląda inaczej niż wcześniejsze wersje, dlatego przygotowaliśmy ten przewodnik, aby skrócić czas nauki jego obsługi. Zmienianie rozmiaru ekranu lub

Bardziej szczegółowo

Leszek Stasiak Zastosowanie technologii LINQ w

Leszek Stasiak Zastosowanie technologii LINQ w Leszek Stasiak Zastosowanie technologii LINQ w C# 1. Wstęp - połączenie Do naszych zadań będziemy używać Microsoft Visual Studio 2010. Stwórzmy nowy projekt Windows Form Application. Mając do dyspozycji

Bardziej szczegółowo

Ekran główny lista formularzy

Ekran główny lista formularzy Administracja modułem formularzy dynamicznych Konfigurator formularzy dynamicznych Funkcjonalność konfiguratora formularzy dynamicznych pozwala administratorowi systemu na stworzenie formularza, w którym

Bardziej szczegółowo

Aplikacje w środowisku VBA. Visual Basic for Aplications

Aplikacje w środowisku VBA. Visual Basic for Aplications Aplikacje w środowisku VBA Visual Basic for Aplications Podstawowe informacje o VBA Visual Basic for Aplications, w skrócie VBA, to język programowania rozwijany przez Microsoft, którego zastosowanie pozwala

Bardziej szczegółowo

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika Programowanie w SQL procedury i funkcje UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika 1. Funkcje o wartościach skalarnych ang. scalar valued

Bardziej szczegółowo

MS Word 2010. Długi dokument. Praca z długim dokumentem. Kinga Sorkowska 2011-12-30

MS Word 2010. Długi dokument. Praca z długim dokumentem. Kinga Sorkowska 2011-12-30 MS Word 2010 Długi dokument Praca z długim dokumentem Kinga Sorkowska 2011-12-30 Dodawanie strony tytułowej 1 W programie Microsoft Word udostępniono wygodną galerię wstępnie zdefiniowanych stron tytułowych.

Bardziej szczegółowo

Formularze w programie Word

Formularze w programie Word Formularze w programie Word Formularz to dokument o określonej strukturze, zawierający puste pola do wypełnienia, czyli pola formularza, w których wprowadza się informacje. Uzyskane informacje można następnie

Bardziej szczegółowo

Zaawansowane aplikacje internetowe - laboratorium

Zaawansowane aplikacje internetowe - laboratorium Zaawansowane aplikacje internetowe - laboratorium Web Services (część 3). Do wykonania ćwiczeń potrzebne jest zintegrowane środowisko programistyczne Microsoft Visual Studio 2005. Ponadto wymagany jest

Bardziej szczegółowo

Programowanie w MS Visual Studio 2005 z wykorzystaniem MS SQL Server 2005

Programowanie w MS Visual Studio 2005 z wykorzystaniem MS SQL Server 2005 Programowanie w MS Visual Studio 2005 z wykorzystaniem MS SQL Server 2005 Lekcja 3 Zapisywanie i anulowanie zmian wprowadzonych w DataGridView do pliku z Bazą Danych. Formatowanie DataGridView. Wymagania:

Bardziej szczegółowo

1. Zarządzanie informacją w programie Access

1. Zarządzanie informacją w programie Access 1. Zarządzanie informacją w programie Access a. 1. Cele lekcji i. a) Wiadomości Uczeń: zna definicję bazy danych i jej zadania, zna pojęcia: rekord, pole, klucz podstawowy, zna obiekty bazy danych: tabele,

Bardziej szczegółowo

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych Języki programowania wysokiego poziomu PHP cz.4. Bazy danych PHP i bazy danych PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych: MySQL moduł mysql albo jego nowsza wersja mysqli (moduł

Bardziej szczegółowo

Instrukcja obsługi aplikacji MobileRaks 1.0

Instrukcja obsługi aplikacji MobileRaks 1.0 Instrukcja obsługi aplikacji MobileRaks 1.0 str. 1 Pierwsze uruchomienie aplikacji. Podczas pierwszego uruchomienia aplikacji należy skonfigurować połączenie z serwerem synchronizacji. Należy podać numer

Bardziej szczegółowo

Materiały pomocnicze do zajęć z przedmiotu Projekt ADP

Materiały pomocnicze do zajęć z przedmiotu Projekt ADP Dr Janusz Górczyński Materiały pomocnicze do zajęć z przedmiotu Projekt ADP Czym jest projekt ADP? Projekt Microsoft Access (.adp) jest typem pliku programu Access, który zapewnia skuteczny dostęp w trybie

Bardziej szczegółowo

Podstawy JavaScript ćwiczenia

Podstawy JavaScript ćwiczenia Podstawy JavaScript ćwiczenia Kontekst:

Bardziej szczegółowo

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Wykład 12. Programowanie serwera MS SQL 2005 w C# Wykład 12 Programowanie serwera MS SQL 2005 w C# Budowa procedur składowanych w C# Budowa funkcji składowanych w C# Wykorzystanie funkcji składowanych w C# po stronie klienta Tworzenie typów definiowanych

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

DAO. tworzenie tabeli

DAO. tworzenie tabeli Mały poradnik do projektu z baz danych macie przykładowe kody DAO I ADODB, pewnie nie wszystkie, jak będą prośby to się dopisze co trzeba na razie będzie to wersja: 0.1 tego dokumentu. Na czerwono zaznaczyłem

Bardziej szczegółowo

Wykład 12. ADO.NET model bezpołączeniowy

Wykład 12. ADO.NET model bezpołączeniowy Wykład 12 ADO.NET model bezpołączeniowy Klasa DataSet kolekcja DataTable Obiekty DataColumn Obiekty DataRow Ładowanie danych do obiektu DataSet użycie DataReader i DataAdapter Aktualizacja bazy za pomocą

Bardziej szczegółowo

Ref. 7 - Język SQL - polecenia DDL i DML

Ref. 7 - Język SQL - polecenia DDL i DML Ref. 7 - Język SQL - polecenia DDL i DML Wprowadzenie do języka SQL. Polecenia generujące strukturę bazy danych: CREATE, ALTER i DROP. Polecenia: wprowadzające dane do bazy - INSERT, modyfikujące zawartość

Bardziej szczegółowo

Wprowadzenie do projektu QualitySpy

Wprowadzenie do projektu QualitySpy Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować

Bardziej szczegółowo

Janusz Górczyński. Opis projektu WynajemSal

Janusz Górczyński. Opis projektu WynajemSal Janusz Górczyński Opis projektu WynajemSal WSZiM w Sochaczewie, 2011 Spis treści 1 WSTĘP...3 2 BAZA DANYCH...4 2.1 TABELE...4 2.2 PROCEDURY PRZECHOWYWANE...11 3 APLIKACJA WINDOWSOWA...15 3.1 UTWORZENIE

Bardziej szczegółowo

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem. WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM NetBeans Wykonał: Jacek Ventzke informatyka sem. VI 1. Uruchamiamy program NetBeans (tu wersja 6.8 ) 2. Tworzymy

Bardziej szczegółowo

Obsługa zdarzeń w formularzach przy pomocy makr

Obsługa zdarzeń w formularzach przy pomocy makr Opracowanie: dr hab. Marzena Nowakowska, dr Maria Szczepańska, mgr Grażyna Gębal MsAccess 2013- ćwiczenie nr 6 Obsługa zdarzeń w formularzach przy pomocy makr W trakcie projektowania makra należy ujawnić

Bardziej szczegółowo

wstawianie przycisków umożliwiających wybieranie wartości poprzez klikanie strzałek

wstawianie przycisków umożliwiających wybieranie wartości poprzez klikanie strzałek VBA Excel Formularz Formanty Label wstawianie etykiet TextBox wstawianie pól tekstowych ComboBox wstawianie pól kombi ComboBox wstawianie pól kombi ComboBox wstawianie pól kombi OptionButton wstawianie

Bardziej szczegółowo

OpenOfficePL. Zestaw szablonów magazynowych. Instrukcja obsługi

OpenOfficePL. Zestaw szablonów magazynowych. Instrukcja obsługi OpenOfficePL Zestaw szablonów magazynowych Instrukcja obsługi Spis treści : 1. Informacje ogólne 2. Instalacja zestawu a) konfiguracja połączenia z bazą danych b) import danych z poprzedniej wersji faktur

Bardziej szczegółowo

Imię i Nazwisko Data Ocena. Laboratorium 7

Imię i Nazwisko Data Ocena. Laboratorium 7 Imię i Nazwisko Data Ocena Laboratorium 7 Celem tego ćwiczenia jest pokazanie, że w MoscowML można pisać aplikacje użytkowe, np. prosty interpreter języka SQL (MLSQL) Listy i krotki Różnica pomiędzy krotkami

Bardziej szczegółowo

WebMobile7 and Sello Integrator wersja 1.1.2

WebMobile7 and Sello Integrator wersja 1.1.2 Instrukcja obsługi aplikacji WebMobile7 and Sello Integrator wersja 1.1.2 Piotr Taraszkiewicz Strona 1 Spis treści 1 WSTĘP O APLIKACJI 3 2 KONFIGURACJA APLIKACJI 4 2.1 KONFIGURACJA POŁĄCZENIA 4 2.2 POZOSTAŁE

Bardziej szczegółowo

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main. Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo

Bardziej szczegółowo

Manipulowanie danymi przy użyciu DAO

Manipulowanie danymi przy użyciu DAO Manipulowanie danymi przy użyciu DAO DAO Data Access Objects Korzystając z obiektów DAO można manipulować danymi z kodu procedur VBA np. Otwarta baza danych jest reprezentowana przez obiekt Database TableDef

Bardziej szczegółowo

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka 1. Kompilacja aplikacji konsolowych w środowisku programistycznym Microsoft Visual Basic. Odszukaj w menu startowym systemu

Bardziej szczegółowo

Dodanie nowej formy do projektu polega na:

Dodanie nowej formy do projektu polega na: 7 Tworzenie formy Forma jest podstawowym elementem dla tworzenia interfejsu użytkownika aplikacji systemu Windows. Umożliwia uruchomienie aplikacji, oraz komunikację z użytkownikiem aplikacji. W trakcie

Bardziej szczegółowo

Podstawy Programowania 2

Podstawy Programowania 2 Podstawy Programowania 2 Laboratorium 7 Instrukcja 6 Object Pascal Opracował: mgr inż. Leszek Ciopiński Wstęp: Programowanie obiektowe a programowanie strukturalne. W programowaniu strukturalnym, któremu

Bardziej szczegółowo

Budowa aplikacji ASP.NET współpracującej z bazą dany do przeprowadzania ankiet internetowych

Budowa aplikacji ASP.NET współpracującej z bazą dany do przeprowadzania ankiet internetowych Budowa aplikacji ASP.NET współpracującej z bazą dany do przeprowadzania ankiet internetowych widok ankiety w przeglądarce Rozpoczniemy od zaprojektowania bazy danych w programie SYBASE/PowerDesigner umieszczamy

Bardziej szczegółowo

MS Excell 2007 Kurs podstawowy Filtrowanie raportu tabeli przestawnej

MS Excell 2007 Kurs podstawowy Filtrowanie raportu tabeli przestawnej MS Excell 2007 Kurs podstawowy Filtrowanie raportu tabeli przestawnej prowadzi: dr inż. Tomasz Bartuś Kraków: 2008 04 04 Przygotowywanie danych źródłowych Poniżej przedstawiono zalecenia umożliwiające

Bardziej szczegółowo

Kurs walut. Specyfikacja projektu. Marek Zając 2013-12-16

Kurs walut. Specyfikacja projektu. Marek Zając 2013-12-16 Kurs walut Specyfikacja projektu Marek Zając 2013-12-16 Spis treści 1. Podsumowanie... 2 1.1 Wstęp... 2 1.2 Projekt interfejsu... 2 1.2.1 Rozmiar głównego okna... 2 2. Słownik pojęć... 2 2.1 Definicja

Bardziej szczegółowo

Pracownia internetowa w szkole ZASTOSOWANIA

Pracownia internetowa w szkole ZASTOSOWANIA NR ART/SBS/07/01 Pracownia internetowa w szkole ZASTOSOWANIA Artykuły - serwery SBS i ich wykorzystanie Instalacja i Konfiguracja oprogramowania MOL Optiva na szkolnym serwerze (SBS2000) Artykuł opisuje

Bardziej szczegółowo

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3 3 ASP.NET MVC Podstawy 1 1. Cel zajęć Celem zajęć jest zapoznanie się z podstawami ASP.NET MVC 2.0 Framework. 2. Zadanie Proszę zbudować prostą aplikację WWW przy zastosowaniu framework a ASP.NET MVC 2.0

Bardziej szczegółowo

I. Interfejs użytkownika.

I. Interfejs użytkownika. Ćwiczenia z użytkowania systemu MFG/PRO 1 I. Interfejs użytkownika. MFG/PRO w wersji eb2 umożliwia wybór użytkownikowi jednego z trzech dostępnych interfejsów graficznych: a) tekstowego (wybór z menu:

Bardziej szczegółowo

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Microsoft.NET: LINQ to SQL, ASP.NET AJAX Microsoft.NET: LINQ to SQL, ASP.NET AJAX Do realizacji projektu potrzebne jest zintegrowane środowisko programistyczne Microsoft Visual Studio 2008 oraz serwer bazy danych SQL Server Express 2005 (lub

Bardziej szczegółowo

KASK by CTI. Instrukcja

KASK by CTI. Instrukcja KASK by CTI Instrukcja Spis treści 1. Opis programu... 3 2. Pierwsze uruchomienie... 4 3. Okno główne programu... 5 4. Konfiguracja atrybutów... 6 5. Nadawanie wartości atrybutom... 7 6. Wybór firmy z

Bardziej szczegółowo

1 Podstawy c++ w pigułce.

1 Podstawy c++ w pigułce. 1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,

Bardziej szczegółowo

Viatoll Calc v1.3. Viatoll Calc. Instrukcja użytkownika. Strona 1

Viatoll Calc v1.3. Viatoll Calc. Instrukcja użytkownika. Strona 1 Viatoll Calc Instrukcja użytkownika Strona 1 Spis treści 1 Wstęp...3 2 Opis panelu głównego...3 2.1 Menu aplikacji...4 2.2 Tabela z trasami...5 2.3 Strona kalkulatora viatoll...6 2.4 Pasek statusu...7

Bardziej szczegółowo

Microsoft Access materiały pomocnicze do ćwiczeń cz. 1

Microsoft Access materiały pomocnicze do ćwiczeń cz. 1 Microsoft Access materiały pomocnicze do ćwiczeń cz. 1 I. Tworzenie bazy danych za pomocą kreatora Celem ćwiczenia jest utworzenie przykładowej bazy danych firmy TEST, zawierającej informacje o pracownikach

Bardziej szczegółowo

SQL (ang. Structured Query Language)

SQL (ang. Structured Query Language) SQL (ang. Structured Query Language) SELECT pobranie danych z bazy, INSERT umieszczenie danych w bazie, UPDATE zmiana danych, DELETE usunięcie danych z bazy. Rozkaz INSERT Rozkaz insert dodaje nowe wiersze

Bardziej szczegółowo

Ćwiczenie: JavaScript Cookies (3x45 minut)

Ćwiczenie: JavaScript Cookies (3x45 minut) Ćwiczenie: JavaScript Cookies (3x45 minut) Cookies niewielkie porcje danych tekstowych, które mogą być przesyłane między serwerem a przeglądarką. Przeglądarka przechowuje te dane przez określony czas.

Bardziej szczegółowo

Założenia do ćwiczeń: SQL Server UWM Express Edition: 213.184.8.192\SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń.

Założenia do ćwiczeń: SQL Server UWM Express Edition: 213.184.8.192\SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń. Cel: polecenia T-SQL Założenia do ćwiczeń: SQL Server UWM Express Edition: 213.184.8.192\SQLEXPRESS Authentication: SQL Server Authentication Username: student01,, student21 Password: student01,., student21

Bardziej szczegółowo

Janusz Górczyński. Projekt WynajemSal realizowany w trakcie drugiego semestru studiów podyplomowych

Janusz Górczyński. Projekt WynajemSal realizowany w trakcie drugiego semestru studiów podyplomowych Janusz Górczyński Projekt WynajemSal realizowany w trakcie drugiego semestru studiów podyplomowych WSZiM w Sochaczewie, 2011 Spis treści 1 WSTĘP...3 2 BAZA DANYCH...4 2.1 TABELE...4 2.2 PROCEDURY PRZECHOWYWANE...11

Bardziej szczegółowo

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1 Bazy danych Wykład IV SQL - wprowadzenie Copyrights by Arkadiusz Rzucidło 1 Czym jest SQL Język zapytań deklaratywny dostęp do danych Składnia łatwa i naturalna Standardowe narzędzie dostępu do wielu różnych

Bardziej szczegółowo

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ

KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ Wykład 3 Katedra Inżynierii Komputerowej Jakub Romanowski jakub.romanowski@kik.pcz.pl POBIERANIE DANYCH C/AL Poniższe funkcje używane są do operacji pobierania

Bardziej szczegółowo

MsAccess 2013 - ćwiczenie nr 3 Kwerendy wybierające cd oraz kwerendy funkcjonalne

MsAccess 2013 - ćwiczenie nr 3 Kwerendy wybierające cd oraz kwerendy funkcjonalne Opracowanie: mgr Grażyna Gębal, dr hab. Marzena Nowakowska, dr Maria Szczepańska MsAccess 2013 - ćwiczenie nr 3 Kwerendy wybierające cd oraz kwerendy funkcjonalne 1. Zdefiniować kwerendę o nazwie Statystyka,

Bardziej szczegółowo

System zarządzania firmą specyfikacja techniczna.

System zarządzania firmą specyfikacja techniczna. System zarządzania firmą specyfikacja techniczna. 1. Zakres funkcjonalności Funkcjonalność aplikacji została podzielona na 3 grupy: Zbiór podstawowych danych dane kontrahentów, typy dokumentów, magazynów,

Bardziej szczegółowo

IIIIIIIIIIIIIIIMMIMMIII

IIIIIIIIIIIIIIIMMIMMIII IIIIIIIIIIIIIIIMMIMMIII O programie Program Itelix itender Manager przeznaczony jest do zarządzania zapytaniami ofertowymi przesyłanymi za pomocą poczty elektronicznej przez firmy korzystające z systemu

Bardziej szczegółowo

NIEZAWODNE ROZWIĄZANIA SYSTEMÓW AUTOMATYKI

NIEZAWODNE ROZWIĄZANIA SYSTEMÓW AUTOMATYKI NIEZAWODNE ROZWIĄZANIA SYSTEMÓW AUTOMATYKI Skrypty obsługi bazy danych. Przykład zastosowania do tworzenia własnego systemu receptur lub zdarzeniowego zapisu parametrów do bazy danych w systemie asix3.

Bardziej szczegółowo

Sposób tworzenia tabeli przestawnej pokażę na przykładzie listy krajów z podstawowymi informacjami o nich.

Sposób tworzenia tabeli przestawnej pokażę na przykładzie listy krajów z podstawowymi informacjami o nich. Tabele przestawne Tabela przestawna to narzędzie służące do tworzenia dynamicznych podsumowań list utworzonych w Excelu lub pobranych z zewnętrznych baz danych. Raporty tabeli przestawnej pozwalają na

Bardziej szczegółowo

Administracja i programowanie pod Microsoft SQL Server 2000

Administracja i programowanie pod Microsoft SQL Server 2000 Administracja i programowanie pod Paweł Rajba pawel@ii.uni.wroc.pl http://www.kursy24.eu/ Zawartość modułu 5 Kursory w SQL Serverze Wprowadzenie Modele kursorów Używanie kursorów Rodzaje kursorów Praca

Bardziej szczegółowo

Programowanie Obiektowe GUI

Programowanie Obiektowe GUI Programowanie Obiektowe GUI Swing Celem ćwiczenia jest ilustracja wizualnego tworzenia graficznego interfejsu użytkownika opartego o bibliotekę Swing w środowisku NetBeans. Ponadto, ćwiczenie ma na celu

Bardziej szczegółowo

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych Paweł Paduch paduch@tu.kielce.pl 06-04-2013 Rozdział 1 Wstęp Na dzisiejszych zajęciach zajmiemy się projektem bazy danych.

Bardziej szczegółowo

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Ćwiczenie 1. Kolejki IBM Message Queue (MQ) Ćwiczenie 1. Kolejki IBM Message Queue (MQ) 1. Przygotowanie Przed rozpoczęciem pracy, należy uruchomić "Kreator przygotowania WebSphere MQ" oraz przejść przez wszystkie kroki kreatora, na końcu zaznaczając

Bardziej szczegółowo

Oracle11g: Wprowadzenie do SQL

Oracle11g: Wprowadzenie do SQL Oracle11g: Wprowadzenie do SQL OPIS: Kurs ten oferuje uczestnikom wprowadzenie do technologii bazy Oracle11g, koncepcji bazy relacyjnej i efektywnego języka programowania o nazwie SQL. Kurs dostarczy twórcom

Bardziej szczegółowo

Ten odcinek Akademii PC Kuriera poświęcony zostanie tworzeniu i wykorzystaniu funkcji i procedur w języku Visual Basic.NET.

Ten odcinek Akademii PC Kuriera poświęcony zostanie tworzeniu i wykorzystaniu funkcji i procedur w języku Visual Basic.NET. Ten odcinek Akademii PC Kuriera poświęcony zostanie tworzeniu i wykorzystaniu funkcji i procedur w języku Visual Basic.NET. Czym są procedury? Efektywne tworzenie często polegać będzie na ponownym wykorzystywaniu

Bardziej szczegółowo

Tworzenie makr warunkowych

Tworzenie makr warunkowych Tworzenie makr warunkowych Czasami chcemy, aby makro lub akacja makra były wykonywane tylko wtedy, gdy spełniony jest jakiś warunek. Na przykład chcemy utworzyć makro drukujące raport, ale tylko wtedy,

Bardziej szczegółowo

Słowa kluczowe Sterowanie klawiaturą, klawiatura, klawisze funkcyjne, przesuwanie obiektów ekranowych, wydawanie poleceń za pomocą klawiatury

Słowa kluczowe Sterowanie klawiaturą, klawiatura, klawisze funkcyjne, przesuwanie obiektów ekranowych, wydawanie poleceń za pomocą klawiatury Obsługa za pomocą klawiatury Różnego typu interfejsy wykorzystują różne metody reagowania i wydawania poleceń przez użytkownika. W środowisku graficznym najpopularniejsza jest niewątpliwie mysz i inne

Bardziej szczegółowo

z przedmiotu: Techniki Informatyczne Stanisław Flaga (stanislaw.flaga@agh.edu.pl)

z przedmiotu: Techniki Informatyczne Stanisław Flaga (stanislaw.flaga@agh.edu.pl) mysql relacyjna baza danych wstęp Materiały pomocnicze do laboratorium z przedmiotu: Techniki Informatyczne Stanisław Flaga () Wydział Inżynierii Mechanicznej i Robotyki Katedra Automatyzacji Procesów

Bardziej szczegółowo