Sql server 如何修复将数据类型varchar转换为数字的错误

Sql server 如何修复将数据类型varchar转换为数字的错误,sql-server,tsql,decimal,Sql Server,Tsql,Decimal,我正在定制一个既使用原始SQL又使用原始模型的传统ASP.NET MVC应用程序。我有一些数据需要提交,有两个小数位,例如4615.38,11.51。当我尝试提交数据时,我收到一个错误 将数据类型varchar转换为数字时出错 我需要关于如何正确定义表和存储过程的帮助。我应该在表定义或左函数中使用任何类型转换吗 在TaxTableController.cs中,我有: Models.TaxTable.Zimra zimra = new Models.TaxTable

我正在定制一个既使用原始SQL又使用原始模型的传统ASP.NET MVC应用程序。我有一些数据需要提交,有两个小数位,例如4615.38,11.51。当我尝试提交数据时,我收到一个错误

将数据类型varchar转换为数字时出错

我需要关于如何正确定义表和存储过程的帮助。我应该在表定义或左函数中使用任何类型转换吗

在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);
使用脚本表作为创建,我的表定义如下:

    [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 
存储过程如下所示:

创建过程[dbo]。[SaveZimraTable] @表名varchar50, @TierName varchar50, @小数点18,2, @MaxSalary小数点18,2, @由varchar50创建, @CreatedOn日期时间 像 开始 -已添加SET NOCOUNT以防止额外的结果集丢失 -干扰SELECT语句。 在Zimra值中插入@TableName、@TierName、@MinSalary、@MaxSalary、@CreatedBy、@CreatedOn 终止 去
始终在insert语句中指定列列表。否则,您必须为除标识列之外的所有列指定值,并且必须按照正确的顺序执行此操作—在您的语句中显然不是这样。此外,如果更改表结构(通过添加列或切换列顺序),可能会破坏语句

INSERT INTO Zimra (TableName, TierName, MinSalary, MaxSalary, CreatedBy, CreatedOn)
VALUES (@TableName,@TierName,@MinSalary,@MaxSalary,@CreatedBy,@CreatedOn)
此外,如注释中所述,不要使用AddWithValues将参数添加到命令对象,而是使用add:


始终在insert语句中指定列列表。否则,您必须为除标识列之外的所有列指定值,并且必须按照正确的顺序执行此操作—在您的语句中显然不是这样。此外,如果更改表结构(通过添加列或切换列顺序),可能会破坏语句

INSERT INTO Zimra (TableName, TierName, MinSalary, MaxSalary, CreatedBy, CreatedOn)
VALUES (@TableName,@TierName,@MinSalary,@MaxSalary,@CreatedBy,@CreatedOn)
此外,如注释中所述,不要使用AddWithValues将参数添加到命令对象,而是使用add:


您需要像cmd.Parameters.Addnew这样设置SQL参数{ParameterName=,Value=,DbType=DbType.String}看到存储过程中的第一条注释了吗?这是你应该做的——去添加代码。代码中的注释应该反映实际情况。您需要像cmd.Parameters.Addnew这样设置SQL参数{ParameterName=,Value=,DbType=DbType.String}看到存储过程中的第一条注释了吗?这是你应该做的——去添加代码。代码中的注释应该反映实际情况。我已经修改为使用Add as:``cmd.Parameters.Addnew SqlParameter{ParameterName=@MaxSalary,Value=zimra.MaxSalary,DbType=DbType.Double};您仍然需要修复insert语句。不需要显式创建参数,Add方法可以用较短的代码为您做到这一点。我已经重构了表定义,以反映存储过程中的列顺序(如果这是您的意思)。我有点卡住了,您不需要显式创建参数是什么意思您不需要重构表,您需要修复insert语句。我注意到我的答案中有一个小的复制粘贴错误,并修复了它。只需使用cmd.Parameters.Addname,type.Value=valuei已修改为使用addas:``cmd.Parameters.Addnew SqlParameter{ParameterName=@MaxSalary,Value=zimra.MaxSalary,DbType=DbType.Double};您仍然需要修复insert语句。不需要显式创建参数,Add方法可以用较短的代码为您做到这一点。我已经重构了表定义,以反映存储过程中的列顺序(如果这是您的意思)。我有点卡住了,您不需要显式创建参数是什么意思您不需要重构表,您需要修复insert语句。我注意到我的答案中有一个小的复制粘贴错误,并修复了它。只需使用cmd.Parameters.Addname,type.Value=Value