Avatar billede software Nybegynder
11. november 2008 - 10:31 Der 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

datoFra = Session("DatoFra")
strDatoFra = Day(datoFra) & "-" & Month(datoFra) & "-" & Year(datoFra)

datoTil = Session("DatoTil")
strDatoTil = Day(datoTil) & "-" & Month(datoTil) & "-" & Year(datoTil)

sql = "INSERT INTO tbl_AktivPeriode (Client_ID,BrugerID,AntalUger,DatoFra,DatoTil,Ferie) Values ('"
sql = sql & Session("Client_ID") & "','"
sql = sql & Session("BrugerID") & "','"
sql = sql & Session("AntalUger") & "','"
sql = sql & FormatDateTime(strDatoFra) & ","
sql = sql & FormatDateTime(strDatoTil) & ",'"
sql = sql & Session("Ferie") & "')"
Call DoSQL(sql)

Hvad går der galt ???
Avatar billede softspot Forsker
11. november 2008 - 10:36 #1
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.
Avatar billede softspot Forsker
11. november 2008 - 10:43 #2
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.

sql = "INSERT INTO tbl_AktivPeriode " & _
      "(Client_ID,BrugerID,AntalUger,DatoFra,DatoTil,Ferie) " & _
      "Values (?,?,?,?,?,?)"
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = dinConnection
cmd.CommandText = sql
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("@Client_ID", adInteger, adParamInput, 4, Session("Client_ID"))
cmd.Parameters.Append cmd.CreateParameter("@Bruger_ID", adInteger, adParamInput, 4, Session("Bruger_ID"))
cmd.Parameters.Append cmd.CreateParameter("@AntalUger", adInteger, adParamInput, 4, Session("AntalUger"))
cmd.Parameters.Append cmd.CreateParameter("@DatoFra", adDate, adParamInput, 8, Session("DatoFra"))
cmd.Parameters.Append cmd.CreateParameter("@DatoTil", adDate, adParamInput, 8, Session("DatoTil"))
cmd.Parameters.Append cmd.CreateParameter("@Ferie", adInteger, adParamInput, 4, Session("Ferie"))
cmd.Execute

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.

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
Avatar billede softspot Forsker
11. november 2008 - 10:57 #3
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.
Avatar billede software Nybegynder
11. november 2008 - 11:44 #4
Hejsa, jeg får følgende fejl:

"The connection cannot be used to perform this operation. It is either closed or invalid in this context."

Min forbindelse til databasen:

Dim conn
strConn = DB_CONNECTIONSTRING   
set conn=server.createobject("adodb.connection")
conn.Open strConn
Avatar billede softspot Forsker
11. november 2008 - 11:50 #5
Hmm... hvilken af løsningsforslagene benytter du?

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...
Avatar billede software Nybegynder
11. november 2008 - 11:54 #6
Jeg bruger forslag 2...prøvede at flytte METADATA TYPE fra global.asa til øverst på siden og får så følgende fejl:

Object required: 'cmd.ActiveConnection'
Avatar billede softspot Forsker
11. november 2008 - 12:03 #7
Det virker næsten som om cmd ikke bliver initieret i linien:

    set cmd = Server.CreateObject("ADODB.Command")

Prøv at tjekke om cmd er sat (forskellig fra nothing) umiddelbart efter initieringen:

    if cmd is nothing then
      response.write "commandobjektet kunne ikke initieres!"
      response.end
    end if
Avatar billede softspot Forsker
11. november 2008 - 12:04 #8
Linien med METADATA skal i øvrigt ligge udenfor script-blokken i global.asa. Altså:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<script language="vbscript">
...
</script>
Avatar billede softspot Forsker
11. november 2008 - 12:05 #9
Øøøh...

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<script language="vbscript" runat="server">
...
</script>
Avatar billede softspot Forsker
11. november 2008 - 12:06 #10
Der behøver i øvrigt ikke være noget script i global.asa, hvis du ikke har behov for det. Det er fint nok alene bare at have METADATA-tag'et.
Avatar billede softspot Forsker
11. november 2008 - 12:07 #11
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... :-)
Avatar billede software Nybegynder
11. november 2008 - 12:38 #12
Har nu gjort alt hvad du har skrevet og får stadig samme fejl...ved ikke om det er mig som har gjort noget galt:

sql = "INSERT INTO tbl_AktivPeriode " & _
      "(Client_ID,BrugerID,AntalUger,DatoFra2,DatoTil2,Ferie) " & _
      "Values (?,?,?,?,?,?)"
set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = strConn
cmd.CommandText = sql
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("@Client_ID", adInteger, adParamInput, 4, Session("Client_ID"))
cmd.Parameters.Append cmd.CreateParameter("@Bruger_ID", adVarchar, adParamInput, 4, Session("Bruger_ID"))
cmd.Parameters.Append cmd.CreateParameter("@AntalUger", adVarchar, adParamInput, 4, Session("AntalUger"))
cmd.Parameters.Append cmd.CreateParameter("@DatoFra", adDate, adParamInput, 8, Session("DatoFra"))
cmd.Parameters.Append cmd.CreateParameter("@DatoTil", adDate, adParamInput, 8, Session("DatoTil"))
cmd.Parameters.Append cmd.CreateParameter("@Ferie", adVarchar, adParamInput, 4, Session("Ferie"))
cmd.Execute
Avatar billede softspot Forsker
11. november 2008 - 12:40 #13
Du skal sende connection-objektet over i ActiveConnection og ikke strengen.
Avatar billede softspot Forsker
11. november 2008 - 12:44 #14
Alternativt (hvis du vil benytte connectionstrengen) skal du ikke benytte "set" foran cmd.ActiveConnection
Avatar billede software Nybegynder
11. november 2008 - 13:10 #15
Okay...det ser ud til at der sker noget nu. får nu denne fejl:

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

har prøvet at rette til men bliver ved med at få fejlen:

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
cmd.Parameters.Append cmd.CreateParameter("@Client_ID", adInteger, adParamInput, 10, Session("Client_ID"))
cmd.Parameters.Append cmd.CreateParameter("@Bruger_ID", adVarchar, adParamInput, 50, Session("Bruger_ID"))
cmd.Parameters.Append cmd.CreateParameter("@AntalUger", adVarchar, adParamInput, 50, Session("AntalUger"))
cmd.Parameters.Append cmd.CreateParameter("@DatoFra", adDate, adParamInput, 10, Session("DatoFra"))
cmd.Parameters.Append cmd.CreateParameter("@DatoTil", adDate, adParamInput, 10, Session("DatoTil"))
cmd.Parameters.Append cmd.CreateParameter("@Ferie", adVarchar, adParamInput, 50, Session("Ferie"))
cmd.Execute
Avatar billede softspot Forsker
11. november 2008 - 13:27 #16
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
Avatar billede software Nybegynder
11. november 2008 - 13:41 #17
Fejl:

ADODB.Command error '800a0bb9'

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

tilfoj_AktivPeriode.asp, line 64

linie 64: "cmd.CommandType = adCmdText"

Aner ikke hvad det betyder ??
Avatar billede softspot Forsker
11. november 2008 - 14:02 #18
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 :-)).
Avatar billede software Nybegynder
11. november 2008 - 14:07 #19
Ny fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80040e21'

[Microsoft][ODBC SQL Server Driver]Optional feature not implemented

tilfoj_AktivPeriode.asp, line 83

Linie 83: cmd.Execute
Avatar billede software Nybegynder
11. november 2008 - 14:18 #20
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
Avatar billede softspot Forsker
11. november 2008 - 14:18 #21
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.
Avatar billede software Nybegynder
11. november 2008 - 16:27 #22
Yep, så virker det..Tak for hjælpen og tålmodigheden...husk svar :o)
Avatar billede softspot Forsker
11. november 2008 - 16:52 #23
Velbekomme :)
Avatar billede softspot Forsker
12. november 2008 - 08:33 #24
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester