11. november 2008 - 10:31Der er
23 kommentarer og 1 løsning
indsætte dato i mssql
Når jeg indsætter en dato f.eks. 11-11-2008 i databasen og derefter slår op i databasen er datoen ændret til 03-07-1894 og sådan er det med alle datoer jeg der bliver sat ind i databasen.
Min kode:
for each i in Request.Form session(i) = SQLEncode(Request.Form(i)) next
Datoformatet er ikke korrekt. Hvis du vil have det korrekte format, så vil jeg anbefale at du benytter formatet: yyyy-mm-dd hh:nn:ss (du kan evt. undelade timer, minutter og sekunder).
Alternativt kan du angive overfor SQL Server hvilket format dine datoer kommer i, ved at lave en multikommando:
SET DATEFORMAT dmy; INSERT INTO...
forudsat at dit datoformat er med dato-måned-år... :-)
Husk at serverens regional settings har indflydelse på hvordan formatDateTime returnerer datoen.
Et andet (og bedre i mine øjne) alternativ er at benytte command-objektet, for så sker der ikke nogen tolkning af datoformatet mellem webserveren og SQL Serveren. Dette kan du komme afsted med vha.
For at du kan bruge ad-konstanterne (f.eks. adInteger og adDate og adCmdText) skal du have en reference til ADO's TypeLIB. Det kan du få ved at indsætte dette META-tag i toppen af den fil som benytter konstanterne eller endnu bedre i din global.asa, da du så ikke skal indsætte den andre steder i din applikation overhovedet.
Jeg kommer lige til at se på din brug af apostroffer i dit eget eksempel og du har IKKE apostroffer omkring dine datoer, hvilket er nødvendigt når du sender dato'er til SQL Server.
Med det sagt, vil jeg stadig anbefale løsningen med command-objektet, da den også sikrer dig mod SQL-injections (og det er rigtig godt at være sikret mog det!), så min kommentar er mest for at adressere hvad der, rent semantisk, er galt med din egen kode.
Det lyder jo spøjst at din connection lige pludselig ikke fungerer længere, da der ikke umiddelbart er noget i det jeg har foreslået, som lukker forbindelsen...
Det kunne i øvrigt også være du lige skulle kontrollere om connection-objektet er initieret inden du forsøger at tildele det til cmd.ActiveConnection. Det er naturligvis efter samme opskrift som med command-objektet... :-)
En integer i SQL Server er typisk 4 og en date er typisk 8 (men jeg tror dog ADO ignorerer størrelsesangivelser for parametre der benytter fastlængde typer - men jeg nævner det bare for en god ordens skyld).
Jeg gætter på at nogle af dine session-variable ikke indeholder det jeg forventede, og her er det specielt de parametre som anvender fastlængde typer (dvs. integer og datoerne). Derfor skal du sikre dig at der rent faktisk er datoer i datofelterne og en integer i client_id inden du putter den i parameteren. Hvis tabellen accepterer null-værdier i til- og fra-dato, samt client_id, kan du evt. undlade at initiere parameterens værdi i det tilfælde at den tilsvarende session-variabel ikke indeholder en værdi af den korrekte type. Således:
sql = "INSERT INTO tbl_AktivPeriode " & _ "(Client_ID,BrugerID,AntalUger,DatoFra2,DatoTil2,Ferie) " & _ "Values (?,?,?,?,?,?)" set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = strConn cmd.CommandText = sql cmd.CommandType = adCmdText if not isEmpty(Session("Client_ID")) and isnumeric(Session("Client_ID")) then cmd.Parameters.Append cmd.CreateParameter("@Client_ID", adInteger, adParamInput, 4, Session("Client_ID")) else cmd.Parameters.Append cmd.CreateParameter("@Client_ID", adInteger, adParamInput, 4) end if cmd.Parameters.Append cmd.CreateParameter("@Bruger_ID", adVarchar, adParamInput, 50, Session("Bruger_ID")) cmd.Parameters.Append cmd.CreateParameter("@AntalUger", adVarchar, adParamInput, 50, Session("AntalUger")) if isDate(Session("DatoFra")) then cmd.Parameters.Append cmd.CreateParameter("@DatoFra", adDate, adParamInput, 8, Session("DatoFra")) else cmd.Parameters.Append cmd.CreateParameter("@DatoFra", adDate, adParamInput, 8) end if if isDate(Session("DatoTil")) then cmd.Parameters.Append cmd.CreateParameter("@DatoTil", adDate, adParamInput, 8, Session("DatoTil")) else cmd.Parameters.Append cmd.CreateParameter("@DatoTil", adDate, adParamInput, 8) end if cmd.Parameters.Append cmd.CreateParameter("@Ferie", adVarchar, adParamInput, 50, Session("Ferie")) cmd.Execute
Aah ok, det er fordi adCmdText enten ikke er derfineret (f.eks. fordi jeg ikke har stavet det korrekt), eller fordi din ændring i global.asa ikke slår igennem.
Iflg. http://msdn.microsoft.com/en-us/library/ms675946(VS.85).aspx har jeg ikke skrevet forkert ;-), så det må være fordi METADATA-elementet ikke er indsat korrekt i global.asa, eller du ikke har placeret global.asa i roden af dit site (for lige at nævne de to muligheder jeg lige kunne komme i tanke om :-)).
Slog fejlen op hos microsoft og fik denne løsning:
When the sample code is run, it gives this error: Run-time error '2147217887 (80040e21)': [Microsoft][ODBC SQL Server Driver] Optional feature not Implemented. This is because SQL Server does not support the adDBDate datatype. To correct this problem, change the datatype of the @theDate parameter to adDBTimeStamp.
og har nu i stedet fået denne fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver]Invalid use of default parameter
Ehm, du bør måske benytte OLE DB-driveren for SQL Server til at slå op i SQL Server i stedet for ODBC-driveren. Provider i din connectionstring skal lige opdateres. Kig evt på www.connectionstrings.com for at se hvordan connectionstrengen til din database kan se ud.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.