Frage

Wenn Daten an eine gespeicherte Prozedur über einen Parameter liefert bin ich ein wenig verwirrt über das Format für die Tage, zu verwenden. Meine ursprüngliche VBA-Syntax verwendet, um das ADO-Connection-Objekt die gespeicherte Prozedur auszuführen:

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

Dies funktioniert gut für mich das Datum Syntax yyyy-mm-dd verwenden, aber wenn ein anderer Benutzer den Code ausführt, sie empfangen den Fehler: 13 ‚Type Mismatch‘.

Nach einigen Experimenten fand ich, dass für den Benutzer im Format dd/mm/yyyy behebt diesen Fehler das Datum liefern, aber jetzt gibt mir den Fehler!

Ausführen der gespeicherten Prozedur eines Befehlsobjekt mit Parametern arbeitet unabhängig vom Format des Datums (Ich gehe davon aus ADO Pflege der Formatierung hinter den Kulissen nimmt). Ich dachte, dass das Format yyyy-mm-dd mit universell mit SQL Server funktionieren würde?

Ich bin auch ratlos, warum dieses Problem benutzerspezifische zu sein scheint? Ich bemerkte, dass meine Standardsprache auf SQL Server ist ‚Englisch‘, während die Standardsprache des anderen Benutzers ist ‚British English‘, könnte das das Problem verursachen?

Ich bin mit ADO 2.8 mit Access 2003 und SQL Server 2000, SQL Server-Anmeldung ist über die Windows-Sicherheit integriert.

War es hilfreich?

Lösung

Seien Sie vorsichtig, und glaube nicht, dass ADO das Problem der Pflege nimmt. Universal SQL Datumsformat ist ‚JJJJMMTT‘, während beide SQL und ACCESS von den regionalen Einstellungen der Maschine in der Art und Weise beeinflusst werden sie Daten angezeigt werden und wandeln sie in Zeichenkette.

Vergessen Sie nicht, dass die Datumstrenn ist # in Access, während es in SQL

ist

Mein bester Rat wird systematisch Access # MM-DD-YYYY # (oder ähnlich) in ‚JJJJMMTT‘ konvertiert werden, bevor die Anweisung an den Server zu senden.

: Sie könnten eine kleine Funktion wie bauen
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

Wenn Sie nicht programmatisch Ihre INSERT / UPDATE Zeichenfolge bauen, bevor sie an den Server gesendet werden, werde ich beraten Sie dann die regionalen Einstellungen aller Maschinen an die regionalen Einstellungen der Maschine als Host für SQL einzuschalten. Möglicherweise müssen Sie auch prüfen, ob es ein bestimmtes Datumsformat auf dem SQL-Server ist (ich bin nicht sicher). Personnaly, löste ich diese Art von Lokalisierungsprobleme (es kommt auch vor, wenn Koma als Dezimaltrennzeichen in Französisch verwendet wird) oder SQL bestimmte Zeichen Probleme (wenn oder doppelte Anführungszeichen in einer Zeichenfolge sind), indem Sie die SQL-Anweisungen zurückziehen, bevor sie an die Sende Server.

Andere Tipps

Ich würde vermuten, dass fCSQLDate Funktion kulturspezifisch ist - das heißt, sie das Datum auf das Gebietsschema des Benutzereinstellungen basierend analysieren wird. Deshalb sollten Sie das Problem zu sehen.

Wie auch immer, Abfragen mit verketteten Strings ist immer eine schlechte Idee (Injection-Angriffe). Sie sind besser dran, wenn Sie Parameter verwenden.

Access verwendet # als Datumsfeld Trennzeichen. Das Format sollte # mm / tt / # wahrscheinlich die # mm-dd-yyyy # wird auch sein funktionieren.

Sorry, ich weiß nicht, mysql, aber mit Oracle würde ich immer sagen, explicity das Format, das ich das Format erwarte in sein, zum Beispiel: 'DD-MM-YYYY' (regional) Datumsformat Probleme zu vermeiden

Warum nicht das Format verwenden

dd mmm yyyy

Es gibt nur einen Weg, es kann interpretiert werden.

Sie können die Date () Funktion verwenden, um ein Universal-Datum auf der Maschine Datums- und Uhrzeiteinstellungen auf Basis zurückzukehren. Die Region Einstellungen an der Maschine werden bestimmen, wie sie sich auf dem Client-Ende formatiert. Wenn Sie das Feld als strictle ein Datetime-Feld dann die cleint Regionseinstellungen das Datumsformat verlassen können.

Möchten Sie in den Server, mit dem Date () Funktion sollte Arbeit (Zurückgeben eines Universal-Datumswert) Aslo.

Verwenden Sie auch ein Befehlsobjekt und Parameter in der Abfrage, wenn Sie sie passieren, um SQL-Injection-Angriffe auf String-Felder zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top