从数字数据类型转换为十进制时出错

本文关键字:十进制 出错 类型转换 数字 数据 | 更新日期: 2023-09-27 18:00:30

这是我的问题,我有一个包含以下列的表:

asis_doc_minutos decimal(4,1)

如果我用一个简单的插入查询插入下面的数字(1.5),它就会插入它!但是我的SP程序不插入数据。这是我的Sp:

 ALTER procedure [dbo].[insertar_pla_asis_doc]
  @fecha datetime,
  @tema varchar(500),
  @minutos decimal(2,2),
  @cod_docente int,
  @cod_materia varchar(25),
  @cod_seccion int,
  @cod_ciclo int,
  @cod_escuela int
  as
  begin
 insert into pla_asis_doc(asis_doc_fecha, asis_doc_tema,
 asis_doc_fecha_realizo, asis_doc_cod_docente, asis_doc_cod_mat, asis_doc_seccion,
     asis_doc_cod_ciclo, 
 asis_doc_cod_escuela, asis_doc_minutos)
 values (@fecha, @tema, getdate(), @cod_docente, @cod_materia, @cod_seccion,
 @cod_ciclo, @cod_escuela, @minutos);
   end

我在C#中称之为Sp,我就是这样做的:

 int valor_devuelto = puente.insertar(fecha, txtTema.Text,
 Convert.ToDecimal(lblHoras.Text), cod_emp, cod_materia, seccion,
 Convert.ToInt32(ciclo.Text), cod_esc);

请注意,(lblHoras.Text)是从TextBox调用的,因此我将其转换为Decimal,因为这正是我的专栏所期望的。这行调用了另一个类中的一个方法,这个类在我的数据库中调用了我的Sp,我在哪里得到了错误,下面是代码:

public int insertar(DateTime fecha, string tema, decimal minutos, int docente, string materia_codigo, int seccion, int ciclo, int escuela_cod)
{
    int valor = 0;
    try
    {
        cn.Open();
        cmd.Connection = cn;                
        cmd.CommandText = "insertar_pla_asis_doc";
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.Add("@fecha", System.Data.SqlDbType.DateTime).Value = fecha;
        cmd.Parameters.Add("@tema", System.Data.SqlDbType.VarChar).Value = tema;
        cmd.Parameters.Add("@minutos", System.Data.SqlDbType.Decimal).Value = minutos;
        cmd.Parameters.Add("@cod_docente", System.Data.SqlDbType.Int).Value = docente;
        cmd.Parameters.Add("@cod_materia", System.Data.SqlDbType.VarChar).Value = 
        materia_codigo;
        cmd.Parameters.Add("@cod_seccion", System.Data.SqlDbType.Int).Value = seccion;
        cmd.Parameters.Add("@cod_ciclo", System.Data.SqlDbType.Int).Value = ciclo;
        cmd.Parameters.Add("@cod_escuela", System.Data.SqlDbType.Int).Value = 
        escuela_cod;
        valor = cmd.ExecuteNonQuery();
        cn.Close();
    }
    catch (Exception ex)
    {
    }
    return valor;
}

每次我运行此代码时,都会出现一个错误:将数据转换为十进制数字时出错。(转换错误)我该如何解决?

从数字数据类型转换为十进制时出错

过程中的参数被声明为

@minutos decimal(2,2)

它的意思是两个数字,都在小数点的右边。

检查此样本:

create table #t (d decimal(2,2))
insert #t values (1.5)

增大参数的大小。

上面@dean的回答不是很准确。

正如@steve提到的那样,它将失败。

创建表格#t(d十进制(2,2))插入#t值(1.5)

结果将是:"Msg 8115,级别16,状态8,第1行将数字转换为数据类型numeric时发生算术溢出错误。语句已终止"

更正:

创建表格#t(十进制(3,2))插入#t值(1.5)

请参阅以下解释:


十进制和数字参数:

十进制[(p[,s])]和数字[(p],s])]

固定精度和刻度数字。使用最大精度时,有效值为-10^38+1到10^38-1。十进制的ISO同义词是dec和dec(p,s)。numeric在功能上等同于decimal。p(精度)将存储在小数点左侧和右侧的最大小数位数。精度必须是从1到最大精度38之间的值。默认精度为18。s(标度)

将存储在小数点右侧的小数位数。这个数字是从p减去的,以确定小数点左边的最大位数。可以存储在小数点右侧的最大小数位数比例必须是从0到p的值。只有指定了精度,才能指定比例。默认比例为0;因此0<=s<=p.根据精度的不同,最大存储大小各不相同。