La syntaxe correcte pour ajouter un NOUVEL enregistrement à votre table devrait être
Dim SqlQuery As String = "INSERT INTO presence(id_presence,id,hours,date) " & _
"VALUES (@Id_presence,@Id,@Hours,@Date)"
Et, bien sûr, chaque commande doit être exécutée sinon ce ne sont que des lignes de code inutiles.
Il vous manque cette ligne après la création des paramètres.
SQLcmd.ExecuteNonQuery()
À partir de votre image, il n'est pas possible d'être sûr, mais si l'idpresence est un champ AUTOINCREMENT, vous ne devriez pas essayer de définir sa valeur avec votre commande et votre paramètre, mais laissez la base de données le faire pour vous. (Des problèmes de clés en double peuvent survenir si plusieurs utilisateurs insèrent des enregistrements en même temps)
Enfin, le type de vos paramètres n'est pas spécifié et ne correspond donc pas au schéma de table de données sous-jacent. Vous pouvez utiliser AddWithValue et convertir les valeurs de la zone de texte d'entrée au type de base de données correct
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))