Как исправить ошибку при преобразовании типа данных varchar в числовой - PullRequest
0 голосов
/ 30 апреля 2019

Я настраиваю устаревшее приложение ASP.NET MVC, которое использует как сырой SQL, так и модели.У меня есть некоторые данные для фиксации, которые имеют два десятичных знака, например, 4615,38, 11,51.Когда я пытаюсь зафиксировать данные, я получаю сообщение об ошибке

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

Мне нужна помощь, как правильно определить таблицу и хранимую процедуру.Должен ли я использовать какое-либо приведение в определении таблицы или LEFT функцию?

В TaxTableController.cs у меня есть:

                Models.TaxTable.Zimra zimra = new Models.TaxTable.Zimra();

            zimra.TableName = Helpers.SanitiseInput(Convert.ToString(formcollection["TableName"]));
            zimra.TierName = Helpers.SanitiseInput(Convert.ToString(formcollection["TierName"]));
            zimra.MinSalary = Convert.ToDouble(formcollection["MinSalary"]);
            zimra.MaxSalary = Convert.ToDouble(formcollection["MaxSalary"]);

            zimra.CreatedOn = DateTime.Now;
            zimra.CreatedBy = Convert.ToString(Session["UserId"]);

            if (ModelState.IsValid)
            {

                using (SqlConnection conn = new SqlConnection(Helpers.DatabaseConnect))
                {

                    SqlCommand cmd = new SqlCommand("SaveZimraTable", conn);
                    cmd.CommandType = CommandType.StoredProcedure;


                    cmd.Parameters.AddWithValue("@TableName", zimra.TableName);
                    cmd.Parameters.AddWithValue("@TierName", zimra.TierName);
                    cmd.Parameters.AddWithValue("@MaxSalary", zimra.MaxSalary);
                    cmd.Parameters.AddWithValue("@MinSalary", zimra.MinSalary);

                    cmd.Parameters.AddWithValue("@CreatedBy", zimra.CreatedBy);
                    cmd.Parameters.AddWithValue("@CreatedOn", zimra.CreatedOn);

Определение моей таблицы такое же, как показано ниже (с использованием Script Table As - Create):

    [Id] [int] IDENTITY(1,1) NOT NULL,
    [MinSalary] [decimal](18, 2) NOT NULL,
    [MaxSalary] [decimal](18, 2) NOT NULL,
    [CreatedBy] [varchar](50) NULL,
    [TableName] [varchar](50) NULL,
    [TierName] [varchar](50) NOT NULL,
    [CreatedOn] [datetime] NULL,
 CONSTRAINT [PK__Zimra__3214EC07397C51AA] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO 

И хранимая процедура выглядит следующим образом:

CREATE PROCEDURE [dbo].[SaveZimraTable] 
    @TableName varchar(50),
    @TierName varchar(50),
    @MinSalary decimal(18,2),
    @MaxSalary decimal(18,2),
    @CreatedBy varchar(50),
    @CreatedOn datetime

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    INSERT INTO Zimra VALUES (@TableName,@TierName,@MinSalary,@MaxSalary,@CreatedBy,@CreatedOn)
END
GO

1 Ответ

2 голосов
/ 30 апреля 2019

Всегда указывайте список столбцов в операторе вставки.В противном случае вы должны указать значения для всех столбцов (кроме столбцов идентификаторов), и вы должны сделать это в правильном порядке - что явно не так в вашем утверждении.Кроме того, вы рискуете нарушить оператор, если измените структуру таблицы - добавив столбец или изменив порядок столбцов.

INSERT INTO Zimra (TableName, TierName, MinSalary, MaxSalary, CreatedBy, CreatedOn)
VALUES (@TableName,@TierName,@MinSalary,@MaxSalary,@CreatedBy,@CreatedOn)

Кроме того, как отмечено в комментариях, не используйте AddWithValuesчтобы добавить параметры к объекту команды - вместо этого используйте Add:

cmd.Parameters.Add("@TableName", SqlDbType.VarChar).Value = zimra.TableName;
// do the same for all parameters.
...