Question

Problems with comma "," and dot "." in decimals-values when inserting data in Access-db from .net-code

Asked by: it-row

Hi,
I have problems with inserting correct values into my database. I have written som code that gets a value from an input-field. When saving the value into a variable (double or decimal) the value are saved like  10.3. Because I live in Denmark where we use comma (10,3) instead of dot (10.3) it gives me some problems when i try to insert the data into my Access-db. When it get values with dot instead of comma, it just removes the dot so the result in the db is 103 instead of 10,3.

I use parameters, but it doesn't help me.

int a1 = _recipeID;
decimal a2 = _qty;
int a3 = _ingredientID;
int a4 = _unitTypeID;
			
OleDbCommand cmd = new OleDbCommand("INSERT INTO TableName (field1, field2, field3, field4) VALUES (?, ?, ?, ?)", aConnection);
 
cmd.Parameters.Add("@a1", OleDbType.Integer).Value = a1;
cmd.Parameters.Add("@a2", OleDbType.Decimal).Value = a2;
cmd.Parameters.Add("@a3", OleDbType.Integer).Value = a3;
cmd.Parameters.Add("@a4", OleDbType.Integer).Value = a4;

                                  
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

Select allOpen in new window

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-09-18 at 10:38:44ID24744015
Tags

.net and access-database

Topics

C# Programming Language

,

Databases Miscellaneous

,

Open Source Programming

Participating Experts
3
Points
500
Comments
13

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Decimal number with comma
    When i write the result of an addition to textBox, there always a comma, "12,34" but to make an SQL query(to access) with this number i need to change this comma to a dot ... How do i do that ?? What the easy way ??
  2. Converting decimal point to decimal comma in a table
    I'm writing a VB program that will be used in accounting. Regional options Number has Decimal Symbol set to "," (comma). Contacting MSSql database with SQL Query and inserting values in fields with numeric value containing "," comma as seperator, produces ...
  3. Commas problem in decimal numbers
    I get a decimal value from a combo box and I use it to build an sql statement and it appears with a comma (1,2) and returns to me as syntax error (comma). I am trying to know how to get this value with the period not with commas. how can i fix it? working in my local host (X...
  4. decimal comma in Access
    I live in Europe, land of the comma is it possible to change the decimal character from point into comma I 've just set my windows settings into comma, but access keeps the decimal point I searched in Access but can't find it I need this because i must export to excel, bu...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: ajitha75Posted on 2009-09-18 at 11:47:22ID: 25368752

Convert the values to en-US culture and then save it to the database. While retrieving it from the database, use the CurrentThread's culture to format the values to local culture.

Thanks
Ajitha

 

by: cactus_dataPosted on 2009-09-18 at 14:57:31ID: 25370331

Or you may get away passing integers only ...

/gustav

int a1 = _recipeID;
int a2 = (int)(_qty * 100);
int a3 = _ingredientID;
int a4 = _unitTypeID;
                        
OleDbCommand cmd = new OleDbCommand("INSERT INTO TableName (field1, field2, field3, field4) VALUES (?, ? / 100, ?, ?)", aConnection);
 
cmd.Parameters.Add("@a1", OleDbType.Integer).Value = a1;
cmd.Parameters.Add("@a2", OleDbType.Integer).Value = a2;
cmd.Parameters.Add("@a3", OleDbType.Integer).Value = a3;
cmd.Parameters.Add("@a4", OleDbType.Integer).Value = a4;

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

Select allOpen in new window

 

by: Priest04Posted on 2009-09-18 at 15:08:30ID: 25370392

it-row, its all about regional settings.

double myValue = Convert.ToDouble(textBox1.Text);

If RegionalSettings are set to English(UnitedStates), and user types 123.45 myValue will be 123.45.
If RegionalSettings are set to Danish, and user types 123,45 myValue will be 123,45.

So, in both cases result will be correct, its up to application user to select proper regional settings.

Goran

 

by: it-rowPosted on 2009-09-18 at 22:35:01ID: 25371617

My region-settings is danish and the user types a value with comma.
double a2 = Convert.ToDouble("3,4");
When I use the code above, the result (a2) is 3.4 and that is my problem. The result in .net is always saved with dot instead of a comma and the database is only saving decimals with comma.

 

by: ajitha75Posted on 2009-09-19 at 00:16:17ID: 25371860

Try this then........

cmd.Parameters.Add("@a2", OleDbType.Decimal).Value = a2.ToString()

Thanks
Ajitha

 

by: Priest04Posted on 2009-09-19 at 01:19:57ID: 25372039

The result will be 3 and 4/10, which is a correct result. I dont understand what do you mean by: "The result in .net is always saved with dot instead of a comma". The result is not "saved  in .NET", its saved in MS Access database, and it has nothing to do with .NET. MS Access will interpret decimal sign based on the regional settings. Example, set the regional settings in English (United States). OPen database MS Access, open this table that contains decimal valkues, enter 3.4 . Value will be saved as decimal number. Close MS Access database, Change REgionalSettings to Danish, reopen MS Accesss, go to rhe table you were before. Now you can see that record you have endeterd just before is displayed as 3,4 which is again a decimal number. If you now try to enter decimal number, you will need to enter it with comma.

I never had any problem with above approach (converting to decimal and save it to database using parameters). IF I dont understand your problem, please be more precise.

 

by: Priest04Posted on 2009-09-19 at 01:22:44ID: 25372047

In the above example I have used MS Access database (and left out .NET from scenario), so you can clearly see what is going one. When you see that it behaves correctly, you can then do the same with .NET and parameterized query. Just remember that when you change regional settings, its important to close and reopen application, since it needs to pick up new settings.

 

by: cactus_dataPosted on 2009-09-19 at 02:06:39ID: 25372155

> its up to application user to select proper regional settings.

It just has to build a correct SQL string. This involves converting decimal values to string expressions where dot is the decimal separator.

> its up to application user to select proper regional settings.

No, it uses the regional settings if no other locale is specified which is the typical case. Thus, as in this case, when comma is the decimal separator, a decimal value typed by the user is expected to have a comma as the decimal separator.

> MS Access will interpret decimal sign based on the regional settings

Nothing specific to Access here. It is an SQL string that is created and this must contain a dot as the decimal separator. If a numeric is passed as a parameter, it will be casted to a string and it is done according to the locale in use which - here - is read from the regional settings.

All this mess can be avoided by using DataTableAdapters avoiding all the low level SQL stuff, but that is another discussion.

Two secure solutions exist. One is the work-around described previously (passing integers only), the other is to convert a decimal to a string expression in SQL by using the native function Str which always converts to a decimal expression with a dot.

/gustav

int a1 = _recipeID;
decimal a2 = _qty;
int a3 = _ingredientID;
int a4 = _unitTypeID;
			
OleDbCommand cmd = new OleDbCommand("INSERT INTO TableName (field1, field2, field3, field4) VALUES (?, STR(?), ?, ?)", aConnection);
 
cmd.Parameters.Add("@a1", OleDbType.Integer).Value = a1;
cmd.Parameters.Add("@a2", OleDbType.Decimal).Value = a2;
cmd.Parameters.Add("@a3", OleDbType.Integer).Value = a3;
cmd.Parameters.Add("@a4", OleDbType.Integer).Value = a4;
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

Select allOpen in new window

 

by: Priest04Posted on 2009-09-19 at 10:21:59ID: 25373743

this smells like a debate to me. :)

> t just has to build a correct SQL string. This involves converting decimal values to string expressions where dot is the decimal separator.

No, it doesnt. MS Access will accept comma as decimal sign IF comma is the decimal sign set in regional settings.

> Nothing specific to Access here. It is an SQL string that is created and this must contain a dot as the decimal separator.

This is again incorrent, sql can contain comma as decimal separator. Try it yourself. Set comma as decimal sign in regional settings, and crate a quick parametrized query that qill insert some double value in MS Access. It will work correclty with comma as decimal, and incorrectly if dot is used as decimal separator. Then open database in MS Access, see the inserted value, and see how it is displayed (with comma). The main

> All this mess can be avoided by using DataTableAdapters avoiding all the low level SQL stuff, but that is another discussion.

Please explain what does table adapter do so special, that command object with parameterized query cant do (which is what it-row is using in code)? They all do the same thing, table adapter uses internally command object to do CRUD operations.

The information I have provided here is based on the fact that my programs is working flawlessly for years, without any problems with decimal sign, and most of my users use comma as decimal sign.

Interpreting numbers as strings is a very bad idea, and leads to many problems in the future, when the application starts growing, so it is the last option to consider.

What I believe it_row wants here, when user presses dot key on numeric keypad, is to convert this sign to comma, Is this correct?

 

by: cactus_dataPosted on 2009-09-19 at 15:44:37ID: 25375057

> MS Access will accept comma as decimal sign IF comma is the decimal sign set in regional settings.

Not when passed as an SQL string as here.
SQL strings like this example will fail:
INSERT INTO TableName (field1, field2, field3, field4) VALUES (2, 0,75, 5, 11)
while these will succeed:
INSERT INTO TableName (field1, field2, field3, field4) VALUES (2, 0.75, 5, 11)
INSERT INTO TableName (field1, field2, field3, field4) VALUES (2, 75/100, 5, 11)

However, I found out that my previous other suggestion:

INSERT INTO TableName (field1, field2, field3, field4) VALUES (?, STR(?), ?, ?)

doesn't work because the casting to a string takes place before STR can do anything.

If you don't like the method for using integers only, the parameter must be passed as a string as shown below. The OleDb parser seems to do the casting correctly using the code below even though the string in the locale in question will use comma as the decimal separator. This can be verified by appending the line:
  Console.WriteLine(cmd.Parameters[1].Value);

This I would recommend as the solution because the code shows what is taken place.
The a2.ToString() could be reduced to just a2 if you prefer.

As for the DataTableAdapters, the use of these or even other strongly typed higher level code like the ADO.NET Entity Model framework is highly recommended as they automatically take care for cases like this. Just google for it to find numerous tutorials - far too much to go into here.

/gustav

int a1 = _recipeID;
decimal a2 = _qty;
int a3 = _ingredientID;
int a4 = _unitTypeID;
			
OleDbCommand cmd = new OleDbCommand("INSERT INTO TableName (field1, field2, field3, field4) VALUES (?, ?, ?, ?)", aConnection);
 
cmd.Parameters.Add("@a1", OleDbType.Integer).Value = a1;
cmd.Parameters.Add("@a2", OleDbType.VarChar).Value = a2.ToString();
cmd.Parameters.Add("@a3", OleDbType.Integer).Value = a3;
cmd.Parameters.Add("@a4", OleDbType.Integer).Value = a4;
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

Select allOpen in new window

 

by: Priest04Posted on 2009-09-19 at 16:13:08ID: 25375157

> As for the DataTableAdapters, the use of these or even other strongly typed higher level code like the ADO.NET Entity Model framework is highly recommended as they automatically take care for cases like this. Just google for it to find numerous tutorials - far too much to go into here.

:) I still would like to hear from you what 'magic' do they do? I know what they do, and I have told you what they use internally, and nothing magic and unknown to be seen there. But, since you say that table adapters do better job than using command object with parameters, I would like to hear some facts about it. I personally don't use Data Tables for CRUID, and therefore do not use table Adapters, and I don't use Entity Framework (since its pretty new and green), but I use my own DAL, and never had a problem with comma as decimal sign being saved in database.

> Not when passed as an SQL string as here.
SQL strings like this example will fail:

If you have noticed, we are from the beginning talking about PARAMETERIZED queries, and what you post here as an example, and use as a starting base for your arguments, is a NON-PARAMETERIZED query. Big difference between the two, and if you have read numerous tutorials, you would find that parameterized query is preferred method for CRUD operations, and one of the easons for this is saving decimal numbers without any regard to their format (like we now have the case here).

 

by: cactus_dataPosted on 2009-09-20 at 11:39:40ID: 25378403

1.
We all have our preferences, and if you have a home-built DAL that of course fits your purpose. I don't have other purposes than what fits perfectly to what the DataTableAdapters are intended for so I didn't see any reason to reinvent the wheel, indeed as I prefer strongly typed code too (some don't and that's fine with me).
There is nothing magic about DataTableAdapters, they are just very well thought out; and so is the ADO.NET Entity Model framework - it is still not perfect, that's true, but improving.
I think the question here demonstrates better than many words why strongly typed code is preferable. I would find it very frustrating if I had to deal with converting very common data types as decimal and currency to string or integer to be sure my code would work under differenct locales.

You are right about the parameterized queries. I used the SQL strings to illustrate the issue even though I can see that the source of the issue is not the SQL built but how the parameter values are interpreted.

2.
Did some further testing as I recall the JET engine being buggy when handling decimal data type.
A (third and better) solution seems to switch to data type Double or (if count of decimals is four or less) Currency.

/gustav

int a1 = _recipeID;
decimal a2 = _qty;
int a3 = _ingredientID;
int a4 = _unitTypeID;
			
OleDbCommand cmd = new OleDbCommand("INSERT INTO TableName (field1, field2, field3, field4) VALUES (?, ?, ?, ?)", aConnection);
 
cmd.Parameters.Add("@a1", OleDbType.Integer).Value = a1;
cmd.Parameters.Add("@a2", OleDbType.Double).Value = a2;
cmd.Parameters.Add("@a3", OleDbType.Integer).Value = a3;
cmd.Parameters.Add("@a4", OleDbType.Integer).Value = a4;
                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:

Select allOpen in new window

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...