这是我的问题,我有一个包含以下列的表:
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。 (转换错误)我该如何解决?
答案 0 :(得分:3)
过程中的参数声明为
@minutos decimal(2,2)
这意味着两个数字,都是小数点右边。
检查此样本:
create table #t (d decimal(2,2))
insert #t values (1.5)
增加参数的大小。
答案 1 :(得分:2)
上面@dean的答案不太准确。
@steve提到它会失败。
创建表#t(d decimal(2,2)) 插入#t values(1.5)
结果将是: “Msg 8115,Level 16,State 8,Line 1 算术溢出错误将数字转换为数据类型数字。 该声明已被终止。“
校正:
创建表#t(d decimal(3,2)) 插入#t values(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 <= s <= p。最大存储大小因精度而异。