vijay_bale Ответов: 1

Ошибка арифметического переполнения при преобразовании numeric в тип данных numeric при работе с базой данных сервера


Я использую хранимые процедуры для обновления таблиц или вставки в таблицы.
При работе с локальной базой данных (база данных в той же системе и приложение также в той же системе, нет сети или общей базы данных) все работают хорошо без каких-либо ошибок.
Мое приложение находится в Visual C#.

Когда я преобразовал приложение для использования в многопользовательской среде и использовал ту же существующую базу данных с теми же хранимыми процедурами с теми же значениями и ту же версию SQLServer Express, я столкнулся с ошибкой
"Ошибка арифметического переполнения при преобразовании numeric в тип данных numeric".
Я попытался ограничить переменные, объявив их в виде десятичной дроби с заданной длиной, и увеличил столбцы таблицы на одну десятичную дробь больше, чем было объявлено в хранимой процедуре. Но та же ошибка приходит и не может найти решение.

Существуют ли какие-либо ограничения с SQL server по сравнению с локальной системной базой данных и базой данных удаленного сервера?
И то и другое-одни и те же данные, одни и те же значения, один и тот же код, одно и то же приложение. Ничего не изменилось, кроме строки подключения.

Код хранимой процедуры, который я использую, выглядит следующим образом.

USE [inventoryDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF  -- this is added now because in some place someone said that it will overcome the error.
GO
CREATE PROCEDURE [dbo].[SalesMainInsert]
    (
      @cblno INT=0,
      @bldate DATETIME ='',
      @rname VARCHAR(50)='',
      @custname VARCHAR(50)='',
      @custcode VARCHAR(50)='',
      @smaname VARCHAR(50)='',
      @mblno VARCHAR(50)='',       
      @bldis1per decimal(20,2)=0,
      @bldis1amt decimal(20,2)=0,
      @bldis2 decimal(20,2)=0,
      @bldis3 decimal(20,2)=0,
      @dis3narr VARCHAR(500)='',
      @blcash BIT=0,
      @billnet decimal(20,2)=0,
      @bltax decimal(20,2)=0,
      @addless decimal(20,3)=0,
      @billtot decimal(20,3)= 0,
      @rndval decimal(9,2)=0,
      @blgross decimal(20,2)=0,
      @remarks VARCHAR(50)='',
      @TotalCessAmt decimal(20,3)=0,
      @TotalAddlCessAmt decimal(20,3)=0,
      @cstat AS BIT = 0,
      @bstat AS VARCHAR(10)='',
      @custtype AS VARCHAR(1)='',
      @ReturnValue AS INT = 0 OUT
    )
AS 
    BEGIN
    
    INSERT INTO dbo.salesHDB
(
cblno,
bldate,
rname,
custname,
custcode,
smaname,
mblno,       
bldis1per,
bldis1amt,
bldis2,
bldis3,
dis3narr,
blcash,
billnet,
bltax,
addless,
bltotal,
rndval,
blgross,
remarks,
TotalCessAmt,
TotalAddlCessAmt,
cstatus,
bstatus,
custtype
)
VALUES  ( 
@cblno,
                        @bldate,
                        @rname,
                        @custname,
                        @custcode,
                        @smaname,
                        @mblno,       
                        @bldis1per,
                        @bldis1amt,
                        @bldis2,
                        @bldis3,
                        @dis3narr,
                        @blcash,
                        @billnet,
                        @bltax,
                        @addless,
                        @billtot,
                        @rndval,
                        @blgross,
                        @remarks,
                        @TotalCessAmt,
                        @TotalAddlCessAmt,
                        @cstat,
                        @bstat,
                        @custtype
  )
                        
IF @@ERROR = 0 
    BEGIN
            SET  @ReturnValue = 1
    END
ELSE 
    BEGIN
            SET  @ReturnValue = -1
    END
END


Что я уже пробовал:

Я погуглил, но не нашел подходящего решения

1 Ответов

Рейтинг:
2

OriginalGriff

Нет, локальный экземпляр - это тот же код, что и удаленный экземпляр, при условии, что они являются одной и той же версией SQL.

Я бы начал с использования отладчика для того, что вызывает хранимую процедуру, и выяснил бы точно, что вы передаете ей в каждом параметре. Может быть, вы не передаете значение, которое вы думаете, что вы есть, и это вызывает проблему.

Мы не можем сделать это за вас - мы даже не знаем, на каком языке написан ваш код, не говоря уже о том, что вы с ним делаете, - и такого рода проблемы необходимо рассматривать во время работы приложения, чтобы "прибить" именно то, что происходит.
И отладчик-идеальный инструмент для этого, независимо от того, какой язык вы используете!


vijay_bale

visual c# и sql server express2014

OriginalGriff

Так что используйте отладчик Visual Studio и посмотрите, что происходит!

vijay_bale

система тестирования имеет sql2016 и сервер системы, имеющие в SQL 2014express

vijay_bale

В режиме отладки значения не придет за процедуры магазине на. Потому что здесь я передаю значения из DEVX banded grid как показано ниже
УМК.Параметры.AddWithValue ("@itmtax", SqlDbType.Плыть).Значение = Преобразовать.ToDouble (item ["GAmount"]);
УМК.Параметры.AddWithValue ("@itmtot", SqlDbType.Плыть).Значение = Преобразовать.ToDouble (item ["NetAmount"]);
//cmd.параметры.AddWithValue ("@itmqty", SqlDbType.Плыть).Значение = Преобразовать.ToDouble (item ["Qty"]);
УМК.Параметры.AddWithValue ("@itmqty", SqlDbType.Плыть).Значение = Преобразовать.ToDouble (item ["NewQty"]);
УМК.Параметры.AddWithValue ("@cblno", SqlDbType.Int).Значение = Преобразовать.ToInt32(txtBillNo. Text);
УМК.Параметры.AddWithValue ("@ItemId", SqlDbType.Int).Значение = Преобразовать.ToInt32(item ["ItemId"]);
УМК.Параметры.AddWithValue ("@itmusrcode", SqlDbType.VarChar).Значение = Преобразовать.ToString(item ["itmusrcode"]);
УМК.Параметры.AddWithValue ("@itmunit", SqlDbType.VarChar).Value = item ["itmunit"].Метод toString();
УМК.Параметры.AddWithValue ("@itmbyp", SqlDbType.Плыть).Значение = Преобразовать.ToDouble (item ["itmbyp"]);