Tienes un error al decir que el tipo Date tiene un formato por default. El tipo Date NO TIENE FORMATO. Solo guarda los datos en binario (internamente son Integers para número de día, número de mes y número de año).
Cuando "haces algo" con el Date, convirtiéndolo a String, ese proceso de "convertir a string" es el que aplica un formato, y el formato que aplica no lo toma del Date (que no lo almacena), sino de algún otro sitio, tal como el CurrentCulture
del CurrentThread cuando es una conversión implícita. Cuando decimos "convertir a String", recuerda que hay muchos sitios donde se convierte automáticamente aunque tú no hayas escrito ninguna función de conversión. Por ejemplo si CONCATENAS un Date
con un String (para formar una sentencia SQL), ese operador de concatenación automáticamente resulta en una conversión a String cuando se compila el programa.
La solución consiste en no dejar que el sistema aplique las conversiones implícitas, sino escribir expresamente la operación de conversión, indicando el formato. Por ejemplo:
Dim d as Date=.... : Dim s as string = "select... where Fecha = '" & d.ToString("yyyy-MM-dd") & "'"
PERO: Si es para un parámetro de un procedimiento almacenado, NO HAGAS LA CONVERSIÓN. Declara correctamente el parámetro indicando que es de tipo DateTime, y asígnale directamente el valor del Date sin convertirlo a string. Cuando trabajas de esta manera,
los drivers de base de datos ya saben generar la sentencia con el formato correcto, sin que tengas que indicarlo en ningún sitio.