webForumDet fria alternativet

spara ett decimal/double-värde till mssql-databas

.NET

5 svar · 1 616 visningar · startad av Sanji

Medlem sedan juli 2009355 inlägg
Frågan#1

hej! Jag försöker spara ett decimal-värde till en databas, men det fungerar ej. datatypen på fältet i tabellen är decimal, och värdet innan det sparats ligger i en decimal-variabel. när jag använder decimal-variabeln i sql-queryn, så fungerar det inte. om jag däremot konverterar värdet till en sträng, så sparas ett värde till databasen, dock ett avrundat heltal, inga decimaler över huvud taget. jag har testat att använda mig av float/double, utan någon skillnad. Ska jag testa med datatypen "money" i databasen kanske? Värdet jag försöker spara är ändå en växelkurs.

public void UpdateInquirySupplierCurrency(Currency currency)
        {
            decimal exchangerate = currency.rate;
            string rate = exchangerate.ToString();//.Replace(",",".");

            //" "
            this.Connect();
            this.UpdateQuery("inquirysuppliers",
                    "exchangerate = " + rate +", currency ='" + currency.currency + "'",
                    " supplierID = '" + currency.supplierID + "' AND inquiryID = '" + currency.inquiryID + "'");
            this.Close();
        }

denna funktion ligger i en klass, och anropar en annan funktion som man hittar i basklassen:

protected void UpdateQuery(string table, string columnsandvalues, string condition)
        {
            if (this.Connected)
            {
                SqlCommand cmd = this.connection.CreateCommand();
                cmd.CommandText = "UPDATE " + table + " SET " + columnsandvalues + (string.IsNullOrEmpty(condition) ? "" : " WHERE " + condition);
                cmd.ExecuteNonQuery();
            }
            else
            {
                throw new Exception("Inte ansluten till databasen");
            }
        }

detta har jag gjort just för att jag har väldigt många underklasser med olika typer av queries, så att jag på ett snabbare sätt kan skriva dessa.

Jag har testat att skriva sql-frågan direkt i query-fönstret på sqlserver management studio, där värdet sparas och allt fungerar utmärkt(då jag skriver in ett förbestämt värde i sql-koden istället för variabeln i applikationen)

så, hur ska jag göra för att kunna spara ett decimaltal till databasen korrekt?

Mvh Marcus

Medlem sedan aug. 20003 575 inlägg
#2

Prövat decimal typen?

Funderat på att använda dig av en O/R-mapper så slipper du allt sådant här.
T.e.x. NHibernate

Medlem sedan feb. 20013 023 inlägg
#3

Det är ganska ful kod att själv bygga upp strängar med tabellnamn och variabler för uppdateringar . Du bör kika på Nhibernate (OR-mapper) som kan göra sånt på ett vackert sätt. Eller så kan du använda stored procedures.

edit: Lite sen---

Medlem sedan feb. 200711 inlägg
#4

Jag håller med övriga om att man bör bygga upp sådant här så att man inte bygger egna SQL-strängar på det sättet, men ändå, till det specifika problemet:

Sanji skrev:

string rate = exchangerate.ToString();//.Replace(",",".");

Här är det. Du använder metoden ToString på ett decimalvärde. Då får du olika resultat beroende på vilken locale användarsessionen använder, t ex komma som decimalseparator i Sverige eller punkt om du kör på en engelsk server. Du ska alltid använda en variant av ToString som tar en parameter som anger vilket du vill ha, komma eller punkt som decimalseparator, mellanslag, komma eller inget alls som tusentalsseparator osv. I ditt fall ska du använda någon Invariant-formatspecificerare.

Medlem sedan juli 2009355 inlägg
#5

jag fattar inte riktigt hur det där med teckenstandarder och så fungerar, någon som kan länka till en artikel där jag kan läsa mer?

Medlem sedan feb. 200711 inlägg
#6

Sanji skrev:

jag fattar inte riktigt hur det där med teckenstandarder och så fungerar, någon som kan länka till en artikel där jag kan läsa mer?

I .NET hanteras detta med klasserna i System.Globalization:
http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx

Numeriskt format bestämmer hur ett numeriskt värde ser ut som sträng. Det gäller t ex om det ska vara komma eller punkt som decimalavskiljare, komma eller mellanslag eller inget alls som tusentalsavgränsare osv. Mostvarande finns också för t ex datum som också skrivs olika i olika länder.

I databassammanhang vill man helst följa en standard som fungerar överallt och sedan bara konvertera till det aktuella landets format när något ska visas för användare, visas på webben eller skrivas ut på papper etc. För att lösa det har man en formatspecifikation som kallas "invariant".

Dim n = 2.34
Dim s = n.ToString(System.Globalization.NumberFormatInfo.InvariantInfo)

Här kommer strängen i s att vara "2.34".

Dim n = 2.34
Dim s = n.ToString(System.Globalization.NumberFormatInfo.CurrentInfo)

[i]eller enklare[/i]

Dim n = 2.34
Dim s = n.ToString()

Här kommer strängen i s att vara "2.34" eller "2,34" beroende på i vilket land programmet körs, enkelt uttryckt. Det blir då problem att spara detta värde i en databas som förväntar sig punkt, men bara när programmet körs i de delar av världen där man använder komma som decimalseparator. Alltså upplagt för onödigt krångliga fel framöver om man försöker ge sig på att justera detta manuellt.

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)