Avatar billede maude Nybegynder
13. juni 2007 - 13:29 Der er 20 kommentarer og
1 løsning

Fejl: out-of-range ved insert af dato

Jeg har fået et problem med en insert der indeholder en dato. Sql ser sådan ud:

sql = "INSERT INTO Orders VALUES (" + kundeid + ",'" + ordredato +
      "','','',''," + total + "," + porto + ",'" + status + "')";

ordredato er af type datetime.

Jeg synes jeg har prøvet alt og det har jo virket.
Avatar billede thesurfer Nybegynder
13. juni 2007 - 14:14 #1
Har du prøvet med # i stedet for ' ved datoen?:

sql = "INSERT INTO Orders VALUES (" + kundeid + ",#" + ordredato +
      "#,'','',''," + total + "," + porto + ",'" + status + "')";
Avatar billede erikjacobsen Ekspert
13. juni 2007 - 14:19 #2
Hvad er indholdet af variablen ordredato - har du et eksempel?
Avatar billede maude Nybegynder
13. juni 2007 - 14:39 #3
sql="INSERT INTO Orders VALUES (1002,'13-06-2007 14:35:30','','','',32300,
3500,'Bestilt')SELECT @@IDENTITY"

selve indholdet af ordredato er: ordredato {13-06-2007 14:35:30} System.DateTime
Avatar billede maude Nybegynder
13. juni 2007 - 14:42 #4
# virker heller ikke
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 15:32 #5
ER det access eller sql ?
Du kan evt prøve med parametre.
Avatar billede maude Nybegynder
13. juni 2007 - 15:41 #6
Det er sql.

Hvordan ser det lige ud med parametre?
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 15:51 #7
Noget i denne stil:
System.Data.SqlClient.SqlCommand cmd = new SqlCommand("INSERT INTO Orders VALUES ?,?, '','','',?, ?, ?", new SqlConnection("dinconnectionstring"));
        cmd.Parameters.AddWithValue("@kundeid", kundeid);
        cmd.Parameters.AddWithValue("@ordredato",ordredato);
        cmd.Parameters.AddWithValue("@total",total);
        cmd.Parameters.AddWithValue("@porto",porto);
        cmd.Parameters.AddWithValue("@status ", status);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();

Måske burde du angive felt navne:
INSERT INTO Orders(felt1, felt2) VALUES (felt1værdi,felt2værdi)
Avatar billede maude Nybegynder
13. juni 2007 - 16:37 #8
Parameter løsningen giver følgende fejl: Object reference not set to an instance of an object. Men jeg har også lavet lidt om da jeg jo skal have identity med retur.

System.Data.SqlClient.SqlCommand cmd =
new SqlCommand("INSERT INTO Orders VALUES ?,?,'','','',?, ?, ?)SELECT @@IDENTITY", new SqlConnection("conStr"));

Jeg har aldrig arbejdet med parameteroverførsel til sql-sætninger så jeg har lidt svært ved at gennemskue fejl.

Den med feltnavne formoder jeg ikke har noget at gøre med parameter måden
           
og så anvender jeg selvfølgelid ExecuteScalar
Avatar billede maude Nybegynder
13. juni 2007 - 16:47 #9
angivelse af feltnavn giver også fejl:

string sql = "INSERT INTO Orders (CustomerId,OrderDate,Total,Postage,Status) VALUES " +
"(kundeid,ordredato,total,porto,status)SELECT @@IDENTITY";

Fejl: The name 'kundeid' is not permitted in this context. Only constants, expressions, or variables allowed here.
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 16:50 #10
string sql = "INSERT INTO Orders (CustomerId,OrderDate,Total,Postage,Status) VALUES " +
"(?,?,?,?,?)SELECT @@IDENTITY";
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 16:52 #11
cmd.Parameters.AddWithValue("@kundeid", kundeid);
        cmd.Parameters.AddWithValue("@ordredato",ordredato);
        cmd.Parameters.AddWithValue("@total",total);
        cmd.Parameters.AddWithValue("@porto",porto);
        cmd.Parameters.AddWithValue("@status ", status);
        cmd.Parameters.Add("@Out", SqlDbType.Int);
        cmd.Parameters[5].Direction = ParameterDirection.Output;
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
        int id = Convert.ToInt32(cmd.Parameters[5].Value);
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 16:52 #12
Du kan også overveje at lave en stored procedure.
Avatar billede maude Nybegynder
13. juni 2007 - 17:19 #13
Det vil jeg lige overveje
Avatar billede erikjacobsen Ekspert
13. juni 2007 - 17:36 #14
Og ellers skal formatet '2007-06-13 14:35:30' kunne bruges
Avatar billede maude Nybegynder
13. juni 2007 - 17:59 #15
Er det noget med at der findes sådan en omformer i C# der sikre det format?
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 18:40 #16
Nej men du kan evt bruger CONVERT(VARCHAR(10),@OrdreDato,102)
Avatar billede dr_chaos Nybegynder
13. juni 2007 - 18:42 #17
Du kan læse mere om konvert her:
http://msdn2.microsoft.com/en-us/library/ms187928(SQL.90).aspx
Avatar billede maude Nybegynder
17. juni 2007 - 23:12 #18
Undskyld ventetiden.

Jeg har nu forsøgt en masse ud fra alle forslagene, men kunne ikke rigtigt få noget til at virke.

Jeg har valgt manuelt at omforme datoen til erikjacobsen's foreslåede format. Det virker selvom det ikke så elegant en løsning.

Smid et svar, hvis du vil have point.
Avatar billede erikjacobsen Ekspert
18. juni 2007 - 07:36 #19
Nej tak. Manuelt?
Avatar billede erikjacobsen Ekspert
18. juni 2007 - 14:17 #20
Det jeg mener er at en DateTime i C#/VB.NET kan udskrives på det format med fx
  Now.ToString("yyyy-MM-dd hh:mm:ss")
Avatar billede maude Nybegynder
18. juni 2007 - 22:31 #21
Manuelt ja jeg mener
string dato = dagsdato.Year.ToString() + "-" +.......

og så skal man lige huske 1-cifrede dage og måneder.

Dit første svar forstod jeg åbenbart ikke helt, men nu virker det også med 24-timers værk.
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
Computerworld tilbyder specialiserede kurser i database-management

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