Avatar billede scarface335 Nybegynder
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
Avatar billede Slettet bruger
01. september 2006 - 10:27 #1
;
Avatar billede jokkejensen Novice
01. september 2006 - 10:28 #2
bruger de skøre amerikanere ikke punktum til decimaler..

altså 2.35

/JJ
Avatar billede jokkejensen Novice
01. september 2006 - 10:32 #3
ellers skal de 2,35 vel pakkes ind som en streng..

'2,35'
Avatar billede scarface335 Nybegynder
01. september 2006 - 10:39 #4
Jeg har prøvet både med punktum og med '2,35' det virker ikke
Avatar billede nielle Nybegynder
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 ')
Avatar billede scarface335 Nybegynder
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
Avatar billede scarface335 Nybegynder
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
Avatar billede nielle Nybegynder
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.
Avatar billede nielle Nybegynder
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 + "')";
Avatar billede nielle Nybegynder
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. :^)
Avatar billede scarface335 Nybegynder
01. september 2006 - 11:06 #11
Det ved jeg godt men synes ikke det var nødvendigt her
Avatar billede scarface335 Nybegynder
01. september 2006 - 11:07 #12
Har prøvet den sætning du har skrevet og det virker heller ikke
Avatar billede nielle Nybegynder
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?
Avatar billede scarface335 Nybegynder
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
Avatar billede nielle Nybegynder
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.
Avatar billede nielle Nybegynder
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.
Avatar billede scarface335 Nybegynder
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
Avatar billede nielle Nybegynder
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.
Avatar billede scarface335 Nybegynder
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
Avatar billede nielle Nybegynder
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;
Avatar billede scarface335 Nybegynder
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/
Avatar billede scarface335 Nybegynder
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.
Avatar billede nielle Nybegynder
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.
Avatar billede scarface335 Nybegynder
01. september 2006 - 14:51 #24
det virker heller ikke
Avatar billede nielle Nybegynder
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.
Avatar billede scarface335 Nybegynder
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'.
Avatar billede nielle Nybegynder
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).
Avatar billede scarface335 Nybegynder
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'.
Avatar billede scarface335 Nybegynder
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
Avatar billede scarface335 Nybegynder
05. september 2006 - 09:30 #30
Jeg har selvfælgelig også denne linje:

DateTime dt = System.DateTime.Today;
Avatar billede nielle Nybegynder
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).
Avatar billede scarface335 Nybegynder
06. september 2006 - 08:23 #32
Kan det være fordi at min sql connection køre som odbc
Avatar billede nielle Nybegynder
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?
Avatar billede scarface335 Nybegynder
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
Avatar billede scarface335 Nybegynder
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
Avatar billede nielle Nybegynder
06. september 2006 - 18:23 #36
Cool :^)
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