Esecuzione di procedure memorizzate con parametri di data:Oggetto comando e oggetto connessione

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

Domanda

Quando fornisco date a una procedura memorizzata tramite un parametro, sono un po' confuso su quale formato utilizzare per le date.La mia sintassi VBA originale utilizzava l'oggetto ADO Connection per eseguire la procedura memorizzata:

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

Funziona bene per me usando la sintassi della data yyyy-mm-dd ma quando un altro utente esegue il codice riceve l'errore:13 'Tipo non corrispondente'.

Dopo alcuni esperimenti ho scoperto che fornire la data nel formato dd/mm/yyyy corregge questo errore per l'utente ma ora mi dà l'errore!

L'esecuzione della procedura memorizzata utilizzando un oggetto comando con parametri funziona indipendentemente dal formato della data (presumo che ADO si occupi della formattazione dietro le quinte).Ho pensato che usando il formato yyyy-mm-dd funzionerebbe universalmente con SQL Server?

Sono anche perplesso sul motivo per cui questo problema sembra essere specifico dell'utente?Ho notato che la mia lingua predefinita su SQL Server è "inglese" mentre la lingua predefinita dell'altro utente è "inglese britannico". Potrebbe essere questo a causare il problema?

Utilizzo ADO 2.8 con Access 2003 e SQL Server 2000, l'accesso a SQL Server avviene tramite la sicurezza integrata di Windows.

È stato utile?

Soluzione

Fare attenzione e non credere che ADO si stia occupando del problema.Il formato della data SQL universale è "AAAAMMGG", mentre sia SQL che ACCESS sono influenzati dalle impostazioni regionali della macchina nel modo in cui visualizzano le date e le convertono in stringhe di caratteri.

Non dimenticare che il separatore della data è # in Access, mentre è ' in SQL

Il mio miglior consiglio sarà quello di convertire sistematicamente il tuo accesso #MM-GG-AAAA# (o simile) in "AAAAMMGG" prima di inviare l'istruzione al tuo server.Potresti creare una piccola funzione come:

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

Se non crei a livello di codice la stringa INSERT/UPDATE prima di inviarla al server, ti consiglierò di trasformare le impostazioni regionali di tutte le macchine nelle impostazioni regionali della macchina che ospita SQL.Potrebbe anche essere necessario verificare se esiste un formato di data specifico sul tuo server SQL (non ne sono sicuro).Personalmente, ho risolto questo tipo di problemi di localizzazione (succede anche quando si usa la virgola come separatore decimale in francese) o di caratteri specifici SQL (quando ci sono virgolette o virgolette doppie in una stringa) ritirando le istruzioni SQL prima di inviarle al server.

Altri suggerimenti

Immagino che la funzione fCSQLDate sia specifica della cultura, ad es.analizzerà la data in base alle impostazioni locali dell'utente.Ecco perché vedi il problema.

In ogni caso, utilizzare query con stringhe concatenate è sempre una cattiva idea (attacchi injection).Stai meglio se usi i parametri.

Access utilizza # come delimitatore del campo data.Il formato dovrebbe essere #mm/gg/aaaa# probabilmente anche #mm-gg-aaaa# funzionerà correttamente.

Mi dispiace, non conosco MySQL, ma con Oracle indicherei sempre esplicitamente il formato in cui mi aspettavo che fosse, ad esempio:"GG-MM-AAAA", per evitare problemi di formato della data (regionale).

Perché non utilizzare il formato

dd mmm yyyy

C'è solo un modo in cui può essere interpretato.

È possibile utilizzare la funzione Date() per restituire una data universale basata sulle impostazioni di data e ora della macchina.Le impostazioni della regione sulla macchina determineranno la modalità di formattazione sul lato client.Se lasci il campo come se fosse un campo DateTime, le impostazioni della regione cliente possono formattare la data.

Entrando nel server, anche l'utilizzo della funzione Date() dovrebbe funzionare (restituendo un valore di data universale).

Inoltre, utilizza un oggetto comando e parametri nella query quando li passi per evitare attacchi SQL injection sui campi stringa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top