La consulta INSERT debe indicar tantas columnas como valores se dan. Al no especificar columnas, se asume que son todas y por ello es que no coincide el número; tú sólo das valores para tres. Modifica tu consulta así:
Código SQL
[-]
insert into datospersonales
(idpersona, nombre, apellido, direccion)
values (0, :nombre, :apellido, :direccion)
Nota que agrego el campo idpersona, porque si no lo haces, el motor insertará un valor NULL y a la segunda inserción te marcará un
key violation. Al indicar explícitamente 0 como valor del campo, el motor sabe que deseas poner ahí el valor autonumérico que corresponda.
// Saludos