Solved

Error calling MS SQL Server stored procedure in VB.NET. A bug in VB.NET ?

Posted on 2004-10-19
3
433 Views
Last Modified: 2010-04-23
I often call SQL Server stored procedures from VB.NET programs.

The error occurs for the following stored procedure:

     create procedure spDecimal(@in_arg decimal(10, 5),
                                                @out_arg decimal(10, 5) output)
     as
    begin
       set @out_arg = @in_arg
    end
    go

In fact, it does nothing more than giving back its first parameter.

The following VB.NET console application tries to call this stored procedure

'----------------------------------------------------------------------------------------------------
' Begin of code
Option Strict On
Option Explicit On
Imports System.Data.SqlClient

Module Module1
    Private sConnectionString As String = "Data Source=(local);initial         catalog=wrapper_test_db;User ID=sa;Password=sql;"

    Sub Main()
        Dim de1, de2 As Decimal
        de1 = 9.234D
        spDecimal(de1, de2)
        Console.WriteLine(de2)
    End Sub

    Public Sub spDecimal(ByVal in_arg As Decimal, _
                         ByRef out_arg As Decimal)
        Dim connection As SqlConnection = New SqlConnection(sConnectionString)
        Dim command As SqlCommand = New SqlCommand("spDecimal", connection)

        command.CommandType = CommandType.StoredProcedure
        command.Parameters.Add("@in_arg", SqlDbType.Decimal).Value = in_arg
        command.Parameters.Add("@out_arg", SqlDbType.Decimal).Value = out_arg
        command.Parameters("@out_arg").Direction = ParameterDirection.Output

        Try
            command.Connection.Open()
            command.ExecuteNonQuery()
        Finally
            command.Connection.Close()
        End Try

        out_arg = CType(command.Parameters("@out_arg").Value, Decimal)
    End Sub
End Module
'  End of code
'---------------------------------------------------------------------------------------------------------

Surprisingly, it prints 9 instead of expected value 9.234. The value of
output parameter is rounded.
This ONLY happens with the stored procedure with the parameter of type Decimal.
If we change the type of stored procedure to any other type (float, int, varchar etc.) and
change the type of corresponding parameters in VB.NET code, it works perfectly.

Does anybody have any idea about what happens with the decimal output parameter ?
Is there probably a bug in VB.NET ?

Gregory



0
Comment
Question by:GregBo
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 25

Expert Comment

by:RonaldBiemans
ID: 12348254
Hi gregory,

Yeah, the decimal output parameter does that, to avoid that you need something like this
You have to explicitly tell the output parameter, the total digits and decimal places
Public Sub spDecimal(ByVal in_arg As Decimal, _
                             ByRef out_arg As Decimal)

        Dim command As SqlClient.SqlCommand = New SqlClient.SqlCommand("spDecimal", SqlConnection1)
        Dim ss As New SqlClient.SqlParameter("@out_arg", SqlDbType.Decimal, 10, ParameterDirection.Output, True, 10, 5, "out_arg", DataRowVersion.Current, 0)

        command.CommandType = CommandType.StoredProcedure
        command.Parameters.Add("@in_arg", SqlDbType.Decimal).Value = in_arg
        command.Parameters.Add(ss).Value = out_arg
        command.Parameters("@out_arg").Direction = ParameterDirection.Output

        Try
            command.Connection.Open()
            command.ExecuteNonQuery()
        Finally
            command.Connection.Close()
        End Try

        out_arg = CType(command.Parameters("@out_arg").Value, Decimal)
    End Sub
0
 
LVL 25

Accepted Solution

by:
RonaldBiemans earned 200 total points
ID: 12348330
or this is easier

   Public Sub spDecimal(ByVal in_arg As Decimal, _
                         ByRef out_arg As Decimal)
        Dim connection As SqlConnection = New SqlConnection(sConnectionString)
        Dim command As SqlClient.SqlCommand = New SqlClient.SqlCommand("spDecimal", Connection)

        command.CommandType = CommandType.StoredProcedure
        command.Parameters.Add("@in_arg", SqlDbType.Decimal).Value = in_arg
        command.Parameters.Add("@out_arg", SqlDbType.Decimal).Value = out_arg
        command.Parameters("@out_arg").Direction = ParameterDirection.Output
        command.Parameters("@out_arg").Precision = 10
        command.Parameters("@out_arg").Scale = 3
        Try
            command.Connection.Open()
            command.ExecuteNonQuery()
        Finally
            command.Connection.Close()
        End Try

        out_arg = CType(command.Parameters("@out_arg").Value, Decimal)
    End Sub
0
 

Author Comment

by:GregBo
ID: 12355341
Thank you very much, Ronald

Regards,


Gregory
0

Featured Post

Enroll in June's Course of the Month

June’s Course of the Month is now available! Experts Exchange’s Premium Members, Team Accounts, and Qualified Experts have access to a complimentary course each month as part of their membership—an extra way to sharpen your skills and increase training.

Question has a verified solution.

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

Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
If you're a developer or IT admin, you’re probably tasked with managing multiple websites, servers, applications, and levels of security on a daily basis. While this can be extremely time consuming, it can also be frustrating when systems aren't wor…
In this video, viewers are given an introduction to using the Windows 10 Snipping Tool, how to quickly locate it when it's needed and also how make it always available with a single click of a mouse button, by pinning it to the Desktop Task Bar. Int…

696 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