La ejecución de procedimientos almacenados con parámetros de fecha:Objeto Command vs Objeto de Conexión

StackOverflow https://stackoverflow.com/questions/83038

Pregunta

Cuando el suministro de fechas a un procedimiento almacenado a través de un parámetro estoy un poco confundido sobre el formato a utilizar para las fechas.Mi original VBA sintaxis que se utiliza el objeto Connection de ADO para ejecutar el procedimiento almacenado:

Set SentDetailRS = Me.ADOConnectionToIntegrity.Execute("dbo.s_SelectAggregatedSentDetailList '" & fCSQLDate(EffectiveDate) & "'", , adCmdText)

Esto funciona bien para mí, usar la sintaxis de fecha yyyy-mm-dd pero cuando otro usuario ejecuta el código que recibe el mensaje de error:13 'Type Mismatch'.

Después de algunos experimentos he encontrado que el suministro de la fecha en el formato dd/mm/yyyy corrige este error para el usuario, pero ahora me da el error!

Ejecutar el procedimiento almacenado utilizando un objeto de comando con los parámetros de funciona independientemente del formato de la fecha (supongo ADO es cuidar el formato de detrás de las escenas).Pensé que con el formato yyyy-mm-dd funcionaría universalmente con SQL Server?

También estoy perplejo en cuanto a por qué este problema parece ser específico de un usuario?Me di cuenta de que mi idioma por defecto de SQL Server es 'inglés', mientras que la de otro usuario, el idioma por defecto es 'inglés', que podría causar el problema?

Estoy usando ADO 2.8 con Access 2003 y SQL Server 2000, SQL Server login es a través de la seguridad integrada de Windows.

¿Fue útil?

Solución

Tenga cuidado, y no creo que ADO es tomar el cuidado del problema.Universal SQL formato de fecha es 'YYYYMMDD', mientras que SQL y el ACCESO están influenciados por la configuración regional de la máquina en la forma de mostrar las fechas y convertirlos en cadenas de caracteres.

No hay que olvidar que la Fecha separador es # en el Acceso, mientras que es ' en SQL

Mi mejor consejo será sistemáticamente para convertir su Acceso #MM-DD-AAAA# (o similar) en 'YYYYMMDD' antes de enviar la instrucción a su servidor.Usted podría construir una pequeña función, tales como:

Public function SQLdateFormat(x_date) as string

SQLDateFormat = _
   trim(str(datePart("yyyy",x_date))) & _
   right(str(datePart("m",date)),2) & _
   right(str(datePart("d",date)),2)

   ''be carefull, you might get something like '2008 9 3'
SQLDateFormat = replace(functionSQLDateFormat," ","0")
   '' you will have the expected '20080903'

End function

Si usted no crear mediante programación de su INSERCIÓN/ACTUALIZACIÓN de cadena antes de enviarlos al servidor, a continuación, voy a aconsejar a su vez la configuración regional de todos los equipos a la configuración regional de la máquina host de SQL.También puede comprobar si hay un tipo específico de formato de fecha en SQL server (no estoy seguro).Personnaly, he resuelto este tipo de localización de problemas (que también ocurre cuando coma se utiliza como separador decimal en francés) o SQL caracteres específicos de los problemas (cuando se cita o dobles comillas en una cadena) por la retirada de las instrucciones SQL antes de enviarlos al servidor.

Otros consejos

Me imagino que fCSQLDate función es la cultura específica - es decir,se analizará la fecha basándose en la configuración regional del usuario.Es por eso que usted ve el problema.

De todos modos, a partir de consultas con cadenas concatenadas es siempre una mala idea (ataques de inyección).Es mejor si el uso de los parámetros.

Access utiliza # como fecha delimitador de campo.El formato debe ser #mm/dd/aaaa# probablemente el #mm-dd-aaaa# también funcionará bien.

Lo siento, no sé mysql, pero con oracle yo siempre explícitamente al estado el formato que yo estaba esperando el formato de estar en, por ejemplo:'DD-MM-YYYY', para evitar (regional) fecha de problemas de formato

¿Por qué no utilizar el formato

dd mmm yyyy

Sólo hay una forma en que puede ser interpretado.

Puede utilizar la función Fecha() para devolver una fecha universal basado en la máquina configuración de fecha y hora.La configuración de la región de la máquina va a determinar cómo se formatea en el cliente final.Si deja el campo como strictle un campo DateTime, a continuación, el cleint región ajustes del formato de la fecha.

Entrar en el servidor, mediante la función Fecha() debe también trabajar (la devolución de un universal fecha valor).

También, el uso de un objeto de comando y parámetros en la consulta cuando se pasa de ellos para evitar ataques de inyección de SQL en los campos de cadena.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top