Solved

decimal datatype not behaving correctly

Posted on 2007-11-14
11
2,108 Views
Last Modified: 2013-11-26
I have a field in a table of type decimal(10,3)
so I want it sohuld be able to save the number upto 3 decimal places.

This is in SQL Server 2005

Now while saving this data the stored procedure has declared this field as decimal.


What is passes from the application-->
shippingquantity = CType(sShippingQty, Decimal)

sShippingQty is takrn from a text box

If I enter 20.345 the value in shippingquantity  is 20.345

but when it saves this to the database it saves it as 20.000

Why so? Is decimal datatype not the correct datatype for this requirement?
What shall i use..what precision?
0
Comment
Question by:sonalj
  • 6
  • 4
11 Comments
 
LVL 75

Accepted Solution

by:
Anthony Perkins earned 500 total points
ID: 20282398
>>Now while saving this data the stored procedure has declared this field as decimal.<<
You need to define the parameter in your stored procedure also as decimal(10,3)
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 20282407
Also, make sure you are declaring the precision and scale in VB.NET
0
 

Author Comment

by:sonalj
ID: 20282446
I defined the datatype in stored procedure as decimal(10,3)
and it is working correctly..but please let me know how to declare  the precision and scale in VB.NET?
Thanks.
0
Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 20282469
Post your VB.NET code as it stands now.
0
 

Author Comment

by:sonalj
ID: 20282554
Dim sShippingQty As String = CType(oRowItem.FindControl("txtQty"), TextBox).Text
                            If Not String.IsNullOrEmpty(sQty) Then
                                Try
                                    Item.Fields("dQty") = CType(sShippingQty, Decimal)
                                Catch
                                End Try
                            End If


Actually its textbox in a gridview. Item is a class . Fields is a property of type hashtable in item class.
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 20282595
I was talking about the code you use to call the stored procedure, that is where you are supposed to set the Precision and Scale.
0
 

Author Comment

by:sonalj
ID: 20282642
Actually it is being saved in a different component and   Item.Fields("dQty")  actually is set in db.setparameter. Not sure how can we set the precesion here.  Otherwise modifying the stored proc works fine

Dim db As Database = DatabaseFactory.CreateDatabase(connection)
            Dim dbCommand As DbCommand = db.GetStoredProcCommand("sprocSaveItems")
            Try
                db.DiscoverParameters(dbCommand)            
                db.SetParameterValue(dbCommand, "_gId", Id)
 For Each sKey As String In Fields.Keys                  
                        db.SetParameterValue(dbCommand, sKey, Fields(sKey))
                    End If
                Next
0
 
LVL 25

Expert Comment

by:imitchie
ID: 20282699
                           If Not String.IsNullOrEmpty(sQty) Then
                                Try
                                    Item.Fields("dQty") = CType(sShippingQty, Decimal)

try Double instead of Decimal on the last line above. also, do you mean
String.IsNullOrEmpty(sShippingQty)  instead of just sQty?
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 20282705
You are not making this easy, so assuming you are using the SQLParameter object than you should set the Precision and Scale properties.
0
 
LVL 75

Expert Comment

by:Anthony Perkins
ID: 20282740
>>try Double instead of Decimal on the last line above.<<
Why in world would you want to lose the precision of a decimal data type by using a double data type instead?  In T-SQL terms, that is like saying replace decimal with the far less precise float or real.
0
 

Author Comment

by:sonalj
ID: 20283227
try Double instead of Decimal on the last line above. also, do you mean
String.IsNullOrEmpty(sShippingQty)  instead of just sQty?

Imitchei--> Oh yes i mean String.IsNullOrEmpty(sShippingQty)

acperkins-->
 Dim db As Database = DatabaseFactory.CreateDatabase(connection)
            Dim dbCommand As DbCommand = db.GetStoredProcCommand("sprocSaveItems")
            Try
                db.DiscoverParameters(dbCommand)            
                db.SetParameterValue(dbCommand, "_gId", Id)
 For Each sKey As String In Fields.Keys                  
                        db.SetParameterValue(dbCommand, sKey, Fields(sKey))
                    End If
                Next
               


I am taking the parameter and its value in a loop to set the precision and scale for 1 of the parameter..I'll have to check if parameter namel ike qty ( or whatever) then set the scale & precision.


But I think setting the scale and precision in the stored procedure should be enough..right?

There is no declaration as sql parameter in the above code..so i m not very sure where to give the scale and precision for 1 of the fields in the loop
 For Each sKey As String In Fields.Keys                  
                        db.SetParameterValue(dbCommand, sKey, Fields(sKey))
                    End If
                Next
0

Featured Post

Resolve Critical IT Incidents Fast

If your data, services or processes become compromised, your organization can suffer damage in just minutes and how fast you communicate during a major IT incident is everything. Learn how to immediately identify incidents & best practices to resolve them quickly and effectively.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Upgrading my SSIS package in VS 2012 6 62
Solar Winds can't see SQL Server Express 17 35
SQL Server / Update DB? 22 38
reading excel file in .net 2 19
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
Load balancing is the method of dividing the total amount of work performed by one computer between two or more computers. Its aim is to get more work done in the same amount of time, ensuring that all the users get served faster.
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question