01. september 2006 - 10:23
Der er
35 kommentarer og 1 løsning
skrivning af kommatal til database
Hej jeg har lavet en Asp.Net application som skriver til en microsoft sql database. men jeg har problemer med at skrive et decimal tal til et felt der er sat til at være decimal tal. Jeg får fejlen at der er for mange values i forhold til min insert sætning. INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe])VALUES (CONVERT(DATETIME, '2006-9-1',102),'2', 'Streamers ', 'Spar nord ', 'Anne graf timer ', 1,25 , 'av800/900/signflex ', 2,35 , '1', CONVERT(DATETIME, '2006-9-20', 102), '1 ') Fejlen er vel an det ikke kan finde ud af at nogle af kommaerne høre til komma tallet og ikke skiller to values, men hvad gør jeg så. De to komma tal er 1,25 og 2,35
Annonceindlæg fra IFS Danmark A/S
Slettet bruger
01. september 2006 - 10:27
#1
;
01. september 2006 - 10:28
#2
bruger de skøre amerikanere ikke punktum til decimaler.. altså 2.35 /JJ
01. september 2006 - 10:32
#3
ellers skal de 2,35 vel pakkes ind som en streng.. '2,35'
01. september 2006 - 10:39
#4
Jeg har prøvet både med punktum og med '2,35' det virker ikke
01. september 2006 - 10:42
#5
Det skal være med punktum, og det skal være begge steder: INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe]) VALUES (CONVERT(DATETIME, '2006-9-1',102), '2', 'Streamers ', 'Spar nord ', 'Anne graf timer ', 1.25, 'av800/900/signflex ', 2.35 , '1', CONVERT(DATETIME, '2006-9-20', 102), '1 ')
01. september 2006 - 10:45
#6
"INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe])" + "VALUES (CONVERT(DATETIME, '" + dt.Year + "-" + dt.Month + "-" + dt.Day + "',102),'" + TextBox2.Text + "', '" + GridView1.Rows[0].Cells[3].Text + "', '" + GridView1.Rows[0].Cells[2].Text + "', '" + DropDownList1.SelectedValue.ToString() + "', '" + 2.35 + "', '" + DropDownList2.SelectedValue.ToString() + "', '" + 2.35 + "', '" + TextBox1.Text + "', CONVERT(DATETIME, '" + Calendar1.SelectedDate.Year + "-" + Calendar1.SelectedDate.Month + "-" + Calendar1.SelectedDate.Day + "', 102), '" + GridView1.Rows[0].Cells[1].Text + "')"; Denne sætning virker ikke her er der brugt 2.35 og 2.35
01. september 2006 - 10:46
#7
"INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe])" + "VALUES (CONVERT(DATETIME, '" + dt.Year + "-" + dt.Month + "-" + dt.Day + "',102),'" + TextBox2.Text + "', '" + GridView1.Rows[0].Cells[3].Text + "', '" + GridView1.Rows[0].Cells[2].Text + "', '" + DropDownList1.SelectedValue.ToString() + "', " + 2.35 + ", '" + DropDownList2.SelectedValue.ToString() + "', " + 2.35 + ", '" + TextBox1.Text + "', CONVERT(DATETIME, '" + Calendar1.SelectedDate.Year + "-" + Calendar1.SelectedDate.Month + "-" + Calendar1.SelectedDate.Day + "', 102), '" + GridView1.Rows[0].Cells[1].Text + "')"; Den ser sådan ud unskyld
01. september 2006 - 10:51
#8
Hvis det er en .Net applikation bør du helt klart overveje at kigge på at gøre det med Parameters.
http://www.eksperten.dk/artikler/831 Det vil spare dig for mange problemer af den nævnte slags, og det vil samtidigt gøre din applikation mere sikker.
01. september 2006 - 10:52
#9
"INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe]) " + "VALUES (CONVERT(DATETIME, '" + dt.Year + "-" + dt.Month + "-" + dt.Day + "', 102),'" + TextBox2.Text + "', '" + GridView1.Rows[0].Cells[3].Text + "', '" + GridView1.Rows[0].Cells[2].Text + "', '" + DropDownList1.SelectedValue.ToString() + "', 2.35, '" + DropDownList2.SelectedValue.ToString() + "', 2.35, '" + TextBox1.Text + "', CONVERT(DATETIME, '" + Calendar1.SelectedDate.Year + "-" + Calendar1.SelectedDate.Month + "-" + Calendar1.SelectedDate.Day + "', 102), '" + GridView1.Rows[0].Cells[1].Text + "')";
01. september 2006 - 10:56
#10
Som et ekstra bonus, vil Parameters faktisk spare dig for at skulle gøre det trick du gør det med dine 2 "CONVERT(DATETIME, ...)". Men Parameters-baseret løsning vil du bare kunne indsætte datoerne direkte. :^)
01. september 2006 - 11:06
#11
Det ved jeg godt men synes ikke det var nødvendigt her
01. september 2006 - 11:07
#12
Har prøvet den sætning du har skrevet og det virker heller ikke
01. september 2006 - 11:12
#13
01/09-2006 11:06:17> Din SQL-sætning er f.eks. ikke beskyttet imod SQL-injection. Denne beskyttelse får du automatisk ved at bruge Parameters. 01/09-2006 11:07:04> Hvilken fejlbesked får du?
01. september 2006 - 12:41
#14
at der er for mange parametre i values den tolker . som komma og tror at det er to parametre og ikke et komma tal. Hvad er sql-injection
01. september 2006 - 12:50
#15
SQL-injection er et angreb fra Joe-the-Hacker som går ud på at han indsætter stumper af ondsinget SQL-kode i et af dine tekst-felter. Hvis du bare tager teksten råt fra dine indtsatningsfelter og indsætter dem i din SQL-streng, kan du dermed få dannet et stykke SQL som sletter din database, eller som tilføjer Joe som administrator til dit site.
01. september 2006 - 12:52
#16
Hvis du får en fejl med for mange paramener med SQL'en fra 01/09-2006 10:52:27 så er det ikke ',' vs. '.' den er galt med - så er det et af dine andre felter der svipser. Prøv at lade dit program om at udskrive den færdige SQL lige inden at du forsøger at udføre den. Post den så her sådan at vi kan se resultatet.
01. september 2006 - 12:53
#17
Ok, men det burde stadig kunne lade sig gøre at indsætte det decimal tal direkte, det virker ikke engang selvom jeg bare skriver et decimal tal og ikke en variabel, i ovenstående eksempel har jeg jo brugt 2,25 og 2.25, det burde kunne lade sig gøre på den ene elle´r anden måde
01. september 2006 - 13:12
#18
Problemet med at sætte det ind direkte, er at .Net så skal lave en konvertering fra float til string. Under denne konvertering forventer .Net at du ønsker dit tal repræsenteret på dansk format, og derfor ændre den decimal-punktummet til et dabsk decimal-komma. Det gør den fordi at den forventer at du ønsker at udskrive tallet i en tekst-sammenhæng. Dette er en normalt rimelig antagelse, men .Net er desværre ikke klar over at det er en rigtig dårlig ide i lige det konkrete tilfælde, da du jo skal bruge det i en SQL-sætning. Hvis du bruger Parameters så ved .Net at det er en SQL-sammenhæng der er tale om, og så behandler den floats derefter.
01. september 2006 - 13:30
#19
altså: SqlDataSource7.InsertParameters.add("@timerne", SqlDbType.Decimal); SqlDataSource7.InsertParameters["@timerne"].Value = enDoubleVariabel; Også så bruge @timerne i min sql sætning Er det forstået rigtigt
01. september 2006 - 14:02
#20
Ja, det ser rigtigt ud. Enten SqlDbType.Decimal eller SqlDbType.Float. Personligt ville jeg vælge at navngive parametrene efter de felter de svare til: "INSERT INTO RessourceReg (BogDato, OrdreNr, InternTekst, KundeNavn, TimeType, TimeAntal, RessourceType, RessourceAntal, MedarbejderId, Dato, OrdreGruppe) VALUES (@BogDato, @OrdreNr, @InternTekst, @KundeNavn, @TimeType, @TimeAntal, @RessourceType, @RessourceAntal, @MedarbejderId, @Dato, @OrdreGruppe)"; Dvs.: SqlDataSource7.InsertParameters.Add("@TimeAntal", SqlDbType.Decimal); SqlDataSource7.InsertParameters["@TimeAntal"].Value = 2.5; Og i stedet for at lave dit 2 x trick med CONVERT(DATETIME, ...) så kan du oven i købet bare gøre det sådan: SqlDataSource7.InsertParameters.Add("@BogDato", SqlDbType.DateTime); SqlDataSource7.InsertParameters["@BogDato"].Value = dt;
01. september 2006 - 14:10
#21
SqlDataSource7.InsertParameters.Add("@timerne", SqlDbType.Decimal);
SqlDataSource7.InsertParameters["@timerne"].Value = timerne;
SqlDataSource7.InsertParameters.Add("@resource", SqlDbType.Decimal);
SqlDataSource7.InsertParameters["@resource"].Value = resource;
disse sætninger giver disse fejl når jeg kompiler
Error 3 The best overloaded method match for 'System.Web.UI.WebControls.ParameterCollection.Add(string, string)' has some invalid arguments c:\inetpub\wwwroot\Registrering.aspx.cs 215 9
http://localhost/ Error 4 Argument '2': cannot convert from 'System.Data.SqlDbType' to 'string' c:\inetpub\wwwroot\Registrering.aspx.cs 215 57
http://localhost/ Error 5 'System.Web.UI.WebControls.Parameter' does not contain a definition for 'Value' c:\inetpub\wwwroot\Registrering.aspx.cs 216 53
http://localhost/ Error 6 The best overloaded method match for 'System.Web.UI.WebControls.ParameterCollection.Add(string, string)' has some invalid arguments c:\inetpub\wwwroot\Registrering.aspx.cs 217 9
http://localhost/ Error 7 Argument '2': cannot convert from 'System.Data.SqlDbType' to 'string' c:\inetpub\wwwroot\Registrering.aspx.cs 217 58
http://localhost/ Error 8 'System.Web.UI.WebControls.Parameter' does not contain a definition for 'Value' c:\inetpub\wwwroot\Registrering.aspx.cs 218 54
http://localhost/
01. september 2006 - 14:18
#22
Jeg kan kompile med denne kode: SqlDataSource7.InsertParameters.Add("@timerne", "SqlDbType.Decimal"); SqlDataSource7.InsertParameters["@timerne"].DefaultValue = TextBox3.Text.ToString(); SqlDataSource7.InsertParameters.Add("@resource", "SqlDbType.Decimal"); SqlDataSource7.InsertParameters["@resource"].DefaultValue = TextBox4.Text.ToString(); SqlDataSource7.InsertCommand = "INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe])" + "VALUES (CONVERT(DATETIME, '" + dt.Year + "-" + dt.Month + "-" + dt.Day + "',102),'" + TextBox2.Text + "', '" + GridView1.Rows[0].Cells[3].Text + "', '" + GridView1.Rows[0].Cells[2].Text + "', '" + DropDownList1.SelectedValue.ToString() + ", @timerne, " + DropDownList2.SelectedValue.ToString() + ",@resource , " + TextBox1.Text + "', CONVERT(DATETIME, '" + Calendar1.SelectedDate.Year + "-" + Calendar1.SelectedDate.Month + "-" + Calendar1.SelectedDate.Day + "', 102), '" + GridView1.Rows[0].Cells[1].Text + "')"; Men før igen samme fejl ERROR [21S01] [Microsoft][ODBC SQL Server Driver][SQL Server]There are more columns in the INSERT statement than values specified in the VALUES clause. The number of values in the VALUES clause must match the number of columns specified in the INSERT statement.
01. september 2006 - 14:24
#23
1) Jeg vil helt bestemt foreslå at du briúgere prameters på alle felterne. PÅ den måde undgår du som sagt SQL-injection. 2) Hvad fejlen angår: Prøv at flytte alle InsertParameter-linjerne ned bagefter InsertCommand-linjen.
01. september 2006 - 14:51
#24
det virker heller ikke
01. september 2006 - 15:02
#25
Kan du være lidt mere specifik. Hvad virker ikke? Prøv at udskrive hvordan din SQL kommer til at se ud. Der må være noget andet galt.
04. september 2006 - 10:45
#26
Jeg bruger nu denne kode: SqlDataSource7.InsertParameters.Add("@timerne", "SqlDbType.Decimal"); SqlDataSource7.InsertParameters["@timerne"].DefaultValue = TextBox3.Text.ToString(); SqlDataSource7.InsertParameters.Add("@resource", "SqlDbType.Decimal"); SqlDataSource7.InsertParameters["@resource"].DefaultValue = TextBox4.Text.ToString(); SqlDataSource7.InsertCommand = "INSERT INTO [RessourceReg] ([BogDato], [OrdreNr], [InternTekst], [KundeNavn], [TimeType], [TimeAntal], [RessourceType], [RessourceAntal], [MedarbejderId], [Dato], [OrdreGruppe])" + "VALUES (CONVERT(DATETIME, '" + dt.Year + "-" + dt.Month + "-" + dt.Day + "',102),'" + TextBox2.Text + "', '" + GridView1.Rows[0].Cells[3].Text + "', '" + GridView1.Rows[0].Cells[2].Text + "', '" + DropDownList1.SelectedValue.ToString() + "',@timerne , '" + DropDownList2.SelectedValue.ToString() + "' ,@resource , '" + TextBox1.Text + "', CONVERT(DATETIME, '" + Calendar1.SelectedDate.Year + "-" + Calendar1.SelectedDate.Month + "-" + Calendar1.SelectedDate.Day + "', 102), '" + GridView1.Rows[0].Cells[1].Text + "')"; Og får fejlen: ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the variable '@timerne'.
04. september 2006 - 19:23
#27
Jeg kan få dette her til at virke uden fejlbeskeder: SqlDataSource7.InsertCommand = "INSERT INTO RessourceReg (BogDato, OrdreNr, InternTekst, KundeNavn, TimeType, TimeAntal, RessourceType, RessourceAntal, MedarbejderId, Dato, OrdreGruppe) VALUES (@BogDato, @OrdreNr, @InternTekst, @KundeNavn, @TimeType, @TimeAntal, @RessourceType, @RessourceAntal, @MedarbejderId, @Dato, @OrdreGruppe)"; SqlDataSource7.InsertParameters.Add("BogDato", TypeCode.DateTime, dt.ToString()); SqlDataSource7.InsertParameters.Add("OrdreNr", TypeCode.String, TextBox2.Text); SqlDataSource7.InsertParameters.Add("InternTekst", TypeCode.String, "nielle1" /*GridView1.Rows[0].Cells[3].Text*/); SqlDataSource7.InsertParameters.Add("KundeNavn", TypeCode.String, "nielle2" /*GridView1.Rows[0].Cells[2].Text*/); SqlDataSource7.InsertParameters.Add("TimeType", TypeCode.String, "nielle3" /*DropDownList1.SelectedValue.ToString()*/); SqlDataSource7.InsertParameters.Add("TimeAntal", TypeCode.Double, TextBox3.Text); SqlDataSource7.InsertParameters.Add("RessourceType", TypeCode.String, "nielle4" /*DropDownList2.SelectedValue.ToString()*/); SqlDataSource7.InsertParameters.Add("RessourceAntal", TypeCode.Double, TextBox4.Text); SqlDataSource7.InsertParameters.Add("MedarbejderId", TypeCode.String, TextBox1.Text); SqlDataSource7.InsertParameters.Add("Dato", TypeCode.DateTime, Calendar1.SelectedDate.ToString()); SqlDataSource7.InsertParameters.Add("OrdreGruppe", TypeCode.String, "nielle5" /*GridView1.Rows[0].Cells[1].Text*/); SqlDataSource7.Insert(); Men den vil godt nok have at man skriver tallene med decimalkomma (altså efter dansk notation).
05. september 2006 - 08:25
#28
Jeg har skrevet din kode således: SqlDataSource7.InsertCommand = "INSERT INTO RessourceReg (BogDato, OrdreNr, InternTekst, KundeNavn, TimeType, TimeAntal, RessourceType, RessourceAntal, MedarbejderId, Dato, OrdreGruppe) VALUES (@BogDato, @OrdreNr, @InternTekst, @KundeNavn, @TimeType, @TimeAntal, @RessourceType, @RessourceAntal, @MedarbejderId, @Dato, @OrdreGruppe)"; SqlDataSource7.InsertParameters.Add("BogDato", TypeCode.DateTime, dt.ToString()); SqlDataSource7.InsertParameters.Add("OrdreNr", TypeCode.String, TextBox2.Text); SqlDataSource7.InsertParameters.Add("InternTekst", TypeCode.String, GridView1.Rows[0].Cells[3].Text); SqlDataSource7.InsertParameters.Add("KundeNavn", TypeCode.String, GridView1.Rows[0].Cells[2].Text); SqlDataSource7.InsertParameters.Add("TimeType", TypeCode.String, DropDownList1.SelectedValue.ToString()); SqlDataSource7.InsertParameters.Add("TimeAntal", TypeCode.Double, TextBox3.Text); SqlDataSource7.InsertParameters.Add("RessourceType", TypeCode.String, DropDownList2.SelectedValue.ToString()); SqlDataSource7.InsertParameters.Add("RessourceAntal", TypeCode.Double, TextBox4.Text); SqlDataSource7.InsertParameters.Add("MedarbejderId", TypeCode.String, TextBox1.Text); SqlDataSource7.InsertParameters.Add("Dato", TypeCode.DateTime, Calendar1.SelectedDate.ToString()); SqlDataSource7.InsertParameters.Add("OrdreGruppe", TypeCode.String, GridView1.Rows[0].Cells[1].Text); SqlDataSource7.Insert(); Og får fejlen: ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the variable '@BogDato'.
05. september 2006 - 08:26
#29
Kan det være fordi jeg skal tilføje noget til asp filen, kan bare ikke forstå det skulle være nødvendigt
05. september 2006 - 09:30
#30
Jeg har selvfælgelig også denne linje: DateTime dt = System.DateTime.Today;
05. september 2006 - 18:25
#31
Jeg har ikke skullet skrive noget i aspx-filen for at få det til at virke. Ud over at de relevante kontroller selvfølgeligt skal være på siden, så er det rent code-behind. Den fejl du får, kommer lige så snart linjen: SqlDataSource7.InsertParameters.Add("BogDato", TypeCode.DateTime, dt.ToString()); - mangler, men det er jo ikke tilfældet for dig... Prøv i øvrigt med: SqlDataSource7.InsertParameters.Add("@BogDato", TypeCode.DateTime, dt.ToString()); Det kunne jo være at det var det der skulle til (godt nok virkede det ikke for mig, så det er lidt et bud i blinde, men det var den kode jeg selv startede med).
06. september 2006 - 08:23
#32
Kan det være fordi at min sql connection køre som odbc
06. september 2006 - 11:45
#33
Muligvis... jeg undrede mig i øvrigt over hvorfor at du fik en ODBC-fejl. Hvorfor forbinder du ikke via ADO.Net i stedet for? Hjalp det ikke at sætte @-tegnet i starten?
06. september 2006 - 11:50
#34
Det hjælper ikke at sætte @ foran det har jeg prøvet, Grunden til at jeg bruger odbc er at sql databasen ligger på en server som jeg kun har rettigheder til gennem odbc
06. september 2006 - 12:50
#35
Jeg har fået opsat min datasource uden odbc men som sql client nu virker det så smid et svar for hele dit arbejde omkring parameters så får du dine point
06. september 2006 - 18:23
#36
Cool :^)
Computerworld tilbyder specialiserede kurser i database-management