【问题标题】:Error converting from numeric data type to decimal从数字数据类型转换为十进制时出错
【发布时间】:2016-01-27 18:44:20
【问题描述】:

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

asis_doc_minutos decimal(4,1)

如果我用一个简单的插入查询插入以下数字 (1.5),它就会插入它!但 我的 SProcedure 不插入数据。这是我的 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;
}

每次我运行此代码时都会出现错误提示: 错误 al convertir el tipo de datos numeric a decimal。 (转换错误)我该如何解决?

【问题讨论】:

  • 要存储为十进制的值如何写?你的语言环境是什么?

标签: c# sql sql-server


【解决方案1】:

过程中的参数声明为

@minutos decimal(2,2)

表示两个数字,都在小数点右边。

检查此示例:

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

增加参数的大小。

【讨论】:

  • 虽然您的观察是正确的,但此代码引发了另一种异常。将数字转换为数字(或类似的东西)时算术溢出,而不是海报提到的错误。
  • 好吧,我不知道什么样的异常可能会引发这种情况,但对我来说,这个解决方案非常有效! (Y)谢谢院长!
【解决方案2】:

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

正如@steve 所说,它会失败。

创建表 #t (d decimal(2,2)) 插入 #t 值 (1.5)

结果将是: "Msg 8115, Level 16, State 8, Line 1 将数字转换为数字数据类型的算术溢出错误。 声明已终止。"

更正:

创建表 #t (d decimal(3,2)) 插入 #t 值 (1.5)

请看下面的解释:


十进制和数字参数:

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

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

将存储在小数点右侧的小数位数。从 p 中减去该数字以确定小数点左侧的最大位数。小数点右侧可以存储的最大小数位数。比例必须是从 0 到 p 的值。仅当指定精度时才能指定比例。默认比例为 0;因此,0

【讨论】:

    猜你喜欢
    • 2013-09-28
    • 2015-05-11
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多