La sintaxis correcta para agregar un NUEVO registro a su tabla debería ser
Dim SqlQuery As String = "INSERT INTO presence(id_presence,id,hours,date) " & _
"VALUES (@Id_presence,@Id,@Hours,@Date)"
Y, por supuesto, todos los comandos deben ejecutarse; de lo contrario, son solo líneas de código inútiles.
Te falta esta línea después de la creación de los parámetros.
SQLcmd.ExecuteNonQuery()
No es posible estar seguro a partir de su imagen, pero si la idpresence es un campo AUTOINCREMENT, entonces no debe intentar establecer su valor con su comando y parámetro, sino que debe dejar que la base de datos lo haga por usted. (Podrían surgir problemas de claves duplicadas si más de un usuario inserta registros al mismo tiempo)
Por último, el tipo de sus parámetros no se especifica, por lo que no coinciden con el esquema de la tabla de datos subyacente. Podría usar AddWithValue y convertir los valores del cuadro de texto de entrada al tipo de base de datos correcto
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))