Poprawna składnia dodawania NOWEGO rekordu do tabeli powinna wyglądać następująco
Dim SqlQuery As String = "INSERT INTO presence(id_presence,id,hours,date) " & _
"VALUES (@Id_presence,@Id,@Hours,@Date)"
I oczywiście każde polecenie powinno zostać wykonane, w przeciwnym razie jest to tylko bezużyteczna linia kodu.
Po utworzeniu parametrów brakuje tej linii.
SQLcmd.ExecuteNonQuery()
Z Twojego obrazu nie można być pewnym, ale jeśli idpresence jest polem AUTOINCREMENT, to nie powinieneś próbować ustawiać jego wartości za pomocą polecenia i parametru, ale pozwól, aby baza danych zrobiła to za Ciebie. (Problemy ze zduplikowanymi kluczami mogą się pojawić, jeśli więcej niż jeden użytkownik wstawi rekordy w tym samym czasie)
Ostatnią rzeczą jest to, że typ parametrów nie jest określony, więc nie są one zgodne z bazowym schematem tabeli danych. Możesz użyć AddWithValue i przekonwertować wejściowe wartości pól tekstowych na właściwy typ bazy danych
SQLcmd.Parameters.AddWithValue("@Id_presence", Convert.ToInt32(TextBox1.Text))
SQLcmd.Parameters.AddWithValue("@Id", Convert.ToInt32(TextBox2.Text))
SQLcmd.Parameters.AddWithValue("@Hours", Convert.ToInt32(TextBox3.Text))
SQLcmd.Parameters.AddWithValue("@Date", Convert.ToDateTime(TextBox4.Text))