Avatar billede martinbk Nybegynder
01. december 2005 - 08:13 Der er 9 kommentarer og
1 løsning

hvordan indsætter jeg et C# floating point i en MSSQL tabel?

jeg har følgende kode:

public void addElement(int ordre_id, float xCord, float yCord, int pris)
        {
            handler.doNonQuery("INSERT INTO Elementer (ordre_id,xCord,yCord,pris)" +
                "VALUES ("+ordre_id+",'"+xCord+"','"+yCord+"','"+pris+"')");
        }

som jeg f.eks. kalder med addElement(1, 20.2F, 3.3F,2)

det producere med single quotes omkring floatværdierne følgende fejl:
Error converting data type varchar to float.

uden singlequotes følgende fejl:

There are fewer 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.


håber nogen har den gyldne løsning, da jeg er lidt tidspresset
Avatar billede Slettet bruger
01. december 2005 - 08:39 #1
Dit system er nok sat til at bruge danske sprogindstillinger, hvilket betyder at den vil udskrive dine float-tal med komma som decimaladskiller. Fejlen (uden quotes) kommer fordi din kode genererer denne SQL:

INSERT INTO Elementer (ordre_id,xCord,yCord,pris)VALUES (1,20,2,3,3,2)

og det er jo for mange værdier.

Jeg kan ikke huske, hvordan du gør det, men du kan løse problemet ved at sætte culture til noget andet end dansk.
Avatar billede the_party_dog Nybegynder
01. december 2005 - 08:45 #2
Er dit "handler" et sqlcommand object?

En her og nu løsning, vil være følgende:

public void addElement(int ordre_id, float xCord, float yCord, int pris)
        {
            handler.doNonQuery("INSERT INTO Elementer (ordre_id,xCord,yCord,pris)" +
                "VALUES ("+ ordre_id +",'"+ xCord.ToString().Replace(",",".") +"','"+ yCord.ToString().Replace(",",".") +"','"+pris+"')");
        }
Avatar billede the_party_dog Nybegynder
01. december 2005 - 08:50 #3
Men jeg vil foreslå følgende løsning, hvis din handler er et sqlcommand object.

handler.CommandText = "INSERT INTO Elementer(ordre_id, xCord, yCord, pris) VALUES(@OrdreID, @xCord, @yCord, @Pris)";

handler.Parameters.Add("@OrdreID", SqlDbType.Int)
handler.Parameters["@OrdreID"].Value = ordre_id;

handler.Parameters.Add("@xCord", SqlDbType.Float)
handler.Parameters["@xCord"].Value = xCord;

handler.Parameters.Add("@yCord", SqlDbType.Float)
handler.Parameters["@yCord"].Value = yCord;

handler.Parameters.Add("@Pris", SqlDbType.Int)
handler.Parameters["@Pris"].Value = pris;

og så kalder du ellers bare handlers.ExecuteNonQuery();
Avatar billede martinbk Nybegynder
01. december 2005 - 08:51 #4
min handler er en selvskreven klasse for at slippe for alt det ADO bøvl når jeg har 3000 forskellige SQL kald, og den virker ganske udemærket så snart jeg ikke har nogen floating points.

men sandbox din idé var skam glimrende

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbtskcustomizingsettingsforspecificcultures.asp

skide danskere grrr :)

smid et svar
Avatar billede the_party_dog Nybegynder
01. december 2005 - 08:56 #5
Gør udfra det er sandbox :-)
Avatar billede nielle Nybegynder
01. december 2005 - 08:57 #6
Man kan undgå den slags problemer, hvis man bruger Parameters:

http://www.eksperten.dk/artikler/831

Man man kan selvfølgeligt også kode sig ud af det på gammeldaws manér. Problemet er, som sandbox nævner, at der bliver blandet et par danske decimal-kommaer ind i billedet. Løsningen er derfor at konveretere disse til engelske decimal-punktumer on-the-fly:

handler.doNonQuery("INSERT INTO Elementer (ordre_id,xCord,yCord,pris)" + "VALUES (" + ordre_id + "," + xCord.ToString().Replace(",", ".") + "," + yCord.ToString().Replace(",", ".") + "," + pris + ")");

Et alternativ ville være at bruge en anden culture-info, men dette ville blive nogenlunde lige så grim kode (omend mindre "høker-agtig" kode).

... og den pæne løsning er som sagt at bruge paramaters, som i (parentes bemærket) også giver dig nogle andre fordele med i købet. Så læs arne_v's artikel om emnet.

PS: Der skal ikke '-tegn rundt om tal-værdier. Hvis man bruger dette, vil databasen forledes til at tro at der er tale om en tekst i stedet for et tal. Det er dette som giver dig den der varchar-fejlbesked.
Avatar billede Slettet bruger
01. december 2005 - 09:10 #7
Jeg vil anbefale dig at se på de andre løsninger også, da det er mere korrekte måder at gøre det på.

Men her er et svar.
Avatar billede martinbk Nybegynder
02. december 2005 - 08:44 #8
ahh ja, det giver jo mening, så aldrig rigtig pointen i de paramters, men når man kommer lænngere ind i ADO.NET verdenen giver det jo mening :)

the party dog og nielle smid et svar, så deler vi lidt mellem flere brugbare løsninger.
Avatar billede nielle Nybegynder
02. december 2005 - 15:05 #9
Jeg takker nej til point på denne her - andre kom før. Men takker for tilbudet. :^)
Avatar billede nielle Nybegynder
11. december 2005 - 19:33 #10
Lukketid?
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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