SQL - Potwierdzanie wykonania dowolnej operacji

0

Z racji nauki postawiłem sobie w chmurze Azure serwer SQL, a na nim darmową bazę danych SQL. Po kilku dniach walki z excelem połączyłem go z bazą i mogę robić z danymi co tylko mi się wyśni. I tu pojawił się problem niewiedzy. To mój pierwszy kontakt z z bazami danych, być może pytam o rzecz trywialną, ale dla mnie to zagadka.
Czy sql potwierdza jakoś wykonanie zadanej operacji? Czy można takie potwierdzenie przechwycić? Jak to zrobić? Gdzie o tym poczytać?
Poniżej opisuję moje działania, aby było jasne co chcę uzyskać.

Z poziomu excela wykonuję następujące kroki. Od 1 do 3 wiem co i jak na tyle, że spokojnie nabieram praktyki dalej. punkt 4 wydaje się dla mnie kluczowym, gdyż chcę mieć zapisane w excelu samo działanie przesłane do DB oraz potwierdzenia wykonania przez DB.

  1. Pobieram do excela porcję danych z DB.
  2. Przetwarzam je dowolnie.
  3. Przetworzone dane układam sobie i zapisuję w arkuszu excel
  4. Zapisane dane wysyłam do tabeli DB, dodając do niej kolejne wiersze.
    4.0 - pobieram z pliku wiersz do wysłania - (opanowane)
    4.1 - sprawdzam czy danego wpisu już przypadkiem w tabeli DB nie ma - (opanowane)
    4.2 - Wysyłam wpis do DB - (opanowane)
    4.3 - Oczekuję na potwierdzenie wykonania - (???)
    4.4 - Zapisuję w arkuszu excel operację i potwierdzenie jej wykonania - (jak zapisać wiem, skąd je dostać???)
    4.5 - wracam do 4.0 aż do wyczerpania danych - (opanowane)
    5.0 Koniec.

Podejrzewam, że DB w jakiś sposób potwierdza to co robi, ale albo to jest tak podstawowa wiedza, że nie ma o niej nic, albo zwyczajnie nie wiem czego szukać.
Proszę o wskazanie kursu na wiedzę w tym zakresie.

M.

2

A jak robisz punkt 4.2? tam masz odpowiedź...

1

Milczę, bo wgryzam się w problem.
Drugi raz mi odpowiadasz w tym forum i drugi raz zagadką wskazującą kierunek :)
Doceniam to, bo samodzielnie szukać rozwiązania jest fajnie i pomaga w nauce.
M.

1

Nie zagadką, tylko taką odpowiedzią, jaką mogę ci udzielić... Punkt 4.2, czyli wpisanie danych do bazy można zrobić na kilka sposobów z poziomu Excela i nie wiedziałem, który wybrałeś... Ale w kążdym z nich od razu dostajesz odpowiedź, czy się powiodło...

0

W moim sposobie o dziwo o powodzeniu dowiaduję się tylko pośrednio sprawdzając tabelę przez portal azure.
A zagadki lubię ;)

Działam mniej więcej tak:

1

   Set Conn = New ADODB.Connection
   With Conn
       .ConnectionString = "Driver={SQL Server};Server=" + host + _
                           ";Database=" + dbname + _
                           ";Uid=" + login + _
                           ";Pwd=" + password + _
                           ";Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"
       .Open
    End With


SQLstr = "INSERT INTO TestTab (numer, slowo) VALUES (231, 'ssssso')"
Conn.Execute (SQLstr)

Conn.Close

W efekcie mam w tabeli kilkanaście zapisów "231 ssssso". Całość się wykonuje bez żadnego odzewu ze strony exela. Klikam, sprawdzam przez portal azure i w bazie jest.

2

Na tym komputerze nie mam Excela, ale powiniene to Execute przypisać do zmiennej. Wtedy w wyniku miałbyś coś... Tak jak jest to poisane tu: https://docs.microsoft.com/en-us/sql/ado/reference/ado-api/execute-method-ado-connection?view=sql-server-2017#remarks
a jeszcze lepiej, jakbyś uzył ADODB.Command, wtedy w wyniku miałby Long, czy się powiodło...

0

Strasznie jestem w tym lewy jakiś :)
Popełniłem takie coś:

    Set Conn = New ADODB.Connection
        With Conn
            .ConnectionString = "Driver={SQL Server};Server=" + host + _
                ";Database=" + dbname + _
                ";Uid=" + login + _
                ";Pwd=" + password + _
                ";Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;"
            .Open
        End With
    
    Dim RecordsAffected As Long
    SQLstr = "INSERT INTO TestTab (numer, slowo) VALUES (4534, 'dsbfsdhaerh')"
    
    Set cmd = New ADODB.Command
        With cmd
            .ActiveConnection = Conn
            .CommandText = SQLstr
            .CommandType = adCmdText
        End With
    cmd.Execute (RecordsAffected)
    Conn.Close

Zainsertowałem tym sposobem sporo wpisów w tabelę. RecordsAffected za każdym razem =0
Pora za późna, albo jednak jestem lewy.

3

Hehe, rozwiązanie miałem już dziś po północy (znaczy się domyśliłem się), ale musiałem się upewnić...
Zamień linijkę:

cmd.Execute (RecordsAffected)

na

cmd.Execute RecordsAffected

:)
Trzeba by było parę zdań napisać, czemu tak się dzieje, a mi się nie chce... :)

3

Dobra, ch...j, niech stracę. I tak już poświęciłem czas na sprawdzanie...

Public Function pierwiastek(ByRef liczba As Double) As Boolean

On Error Resume Next
    liczba = Sqr(liczba)
    pierwiastek = Err.Number = 0
On Error GoTo 0

End Function

To jest testowa funkcja w VBA. Która ma za zadanie obliczyć pierwiastek funkcji, a w wyniku dać Boolean, czy się powiodło. Kluczem jest przekazywanie parametru - ByRef, czyli przez referencję (wskaźnik).
I teraz testowa funkcja, która sprawdza wyniki dla różnych wartości:

Sub test()
Dim test1 As Double, test2 As Double, test3 As Double
Dim wynik1 As Boolean

test1 = -1
test2 = 8
test3 = 100

wynik1 = pierwiastek(test1)
Debug.Print test1
' prawidłowe działanie

pierwiastek test2
Debug.Print test2
'prawidłowe

pierwiastek (test3)
Debug.Print test3
' inaczej się zachowuje

End Sub

W okienku bezpośrednich wyników otrzymasz:

-1 
 2.82842712474619 
 100 

Czyli, że tylko liczba test2 zmieniła swoją wartość, czyli funkcja wykonała się prawidłowo...
VBA (nie pamiętam, czy VB6 też) jest tak skonstruowany, że jeśli do funkcji przekazujesz parametr w nawiasie, to NIE JEST przekazywany przez wskaźnik, a przez wartość (prawdopodobnie tworzona jest kopia obiektu/zmiennej). Chyba, że nawias ten dotyczy parametrów funkcji (kiedy przypisujemy wynik).
Możesz sprawdzić różnice w działaniu tej procedury testowej dodając po

pierwiastek test2
Debug.Print test2
'prawidłowe

takie linijki:

test2 = 400
wynik1 = pierwiastek((test2)) ' koniecznie dwa nawiasy - pierwszy dotyczy parametrów funkcji, drugi "otacza" zmienną, czyli przekazuje ją przez wartość
Debug.Print test2
0

To działa :)
Serdecznie dziękuję.

Teraz już tylko ładnie dopisać w raporcie w excelu datę wysyłki, strinag, login usera oraz potwierdzenie wykonania i gra muzyka :)

Muszę powiedzieć, że zabawa z DB coraz bardziej mi się podoba.

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