Aquí tienes el código para C# de la aplicación de ejemplo del artículo Error al guardar datos decimales: El valor del parámetro ‘xxx’ está fuera del intervalo.
Nota:
Si buscabas el código para Visual Basic está en este otro enlace:
Error al guardar datos decimales – El código para Visual Basic.
Cuando lo tenga publicado, te pondré el enlace para descargar la solución de Visual Studio 2017 tanto para VB como para C#.
El código de C#
//-----------------------------------------------------------------------------
// Ejemplo para el error de asignar a decimal(4,4) (07/Dic/18)
//
// (c) Guillermo (elGuille) Som, 2018
//-----------------------------------------------------------------------------
using System;
using System.Data.SqlClient;
using System.Text;
using System.Windows.Forms;
namespace SQL_Error_decimal_cs
{
public partial class Form1 : Form
{
//--------------------------------------------------------------------------
// Los campos para acceder a la base de datos
//--------------------------------------------------------------------------
/// <summary>
/// El usuario para acceder a la base de datos de SQL Server.<br />
/// Si es una cadena vacía se usará la seguridad integrada de Windows.
/// </summary>
private string userDb = "UsuarioErrDec";
/// <summary>
/// El password del usuario que accede a la base de datos de SQL Server
/// </summary>
private string passwordDB = "123456";
/// <summary>
/// El servidor donde está la base de datos.<br />
/// Normalmente será .\SQLEXPRESS o (local)
/// </summary>
private string serverName = @".\SQLEXPRESS";
/// <summary>
/// El nombre de la base de datos de SQL Server
/// </summary>
private string databaseName = "ErrorDecimal";
/// <summary>
/// Devuelve la cadena de conexión a la base de datos de SQL Server<br />
/// Si el usuario es una cadena vacía, se usará la seguridad integrada de Windows
/// </summary>
private string ConnectionString {
get {
var sb = new SqlConnectionStringBuilder();
sb.DataSource = serverName;
sb.InitialCatalog = databaseName;
if (String.IsNullOrWhiteSpace(userDb))
{
sb.IntegratedSecurity = true;
} else
{
sb.UserID = userDb;
sb.Password = passwordDB;
}
return sb.ConnectionString;
}
}
//--------------------------------------------------------------------------
// Añadir un valor a las tablas
//--------------------------------------------------------------------------
private (bool hayError, string msg) AñadirMiTabla1(decimal valor)
{
var sel = "INSERT INTO MiTabla1 (Decimal_4_4) " +
"VALUES (@Decimal_4_4)";
var retVal = (hayError: false, msg: "");
var sCon = ConnectionString;
using (SqlConnection con = new SqlConnection(sCon))
{
var cmd = new SqlCommand(sel, con);
cmd.Parameters.AddWithValue("@Decimal_4_4", valor);
con.Open();
try
{
var ret = Convert.ToInt32(cmd.ExecuteNonQuery());
retVal.hayError = (ret < 1);
retVal.msg = "Todo OK. cmd.ExecuteNonQuery() = " + ret.ToString();
}
catch (Exception ex)
{
retVal.msg = ex.Message;
retVal.hayError = true;
}
con.Close();
}
return retVal;
}
private (bool hayError, string msg) AñadirMiTabla2(decimal[] valores)
{
var sel = "INSERT INTO MiTabla2 (Decimal_6_4, Decimal_18_6) " +
"VALUES (@Decimal_6_4, @Decimal_18_6)";
var retVal = (hayError:false, msg:"");
var sCon = ConnectionString;
using (SqlConnection con = new SqlConnection(sCon))
{
SqlCommand cmd = new SqlCommand(sel, con);
cmd.Parameters.AddWithValue("@Decimal_6_4", valores[0]);
cmd.Parameters.AddWithValue("@Decimal_18_6", valores[1]);
con.Open();
try
{
var ret = Convert.ToInt32(cmd.ExecuteNonQuery());
retVal.hayError = (ret < 1);
retVal.msg = "Todo OK. cmd.ExecuteNonQuery() = " + ret.ToString();
}
catch (Exception ex)
{
retVal.msg = ex.Message;
retVal.hayError = true;
}
con.Close();
}
return retVal;
}
private string leerMiTabla(string tabla)
{
var sel = "SELECT * FROM " + tabla;
var retVal = "";
var sCon = ConnectionString;
using (SqlConnection con = new SqlConnection(sCon))
{
var cmd = new SqlCommand(sel, con);
con.Open();
try
{
var ret = cmd.ExecuteReader();
StringBuilder sb = new StringBuilder();
while (ret.Read())
{
sb.AppendLine(String.Format("{0} = {1}", ret.GetName(0), ret[0]));
if (ret.FieldCount > 1)
sb.AppendLine(String.Format("{0} = {1}", ret.GetName(1), ret[1]));
};
retVal = sb.ToString();
}
catch (Exception ex)
{
retVal = "ERROR: " + ex.Message;
}
con.Close();
};
return retVal;
}
//--------------------------------------------------------------------------
// Para aceptar la coma como decimal en las cajas numéricas
//--------------------------------------------------------------------------
/// <summary>
/// El separador de decimales para los campos numéricos
/// </summary>
const string SeparadorDecimal = ",";
/// <summary>
/// Para indicar qué tecla "decimal" no se debe admitir
/// </summary>
const string NoSeparadorDecimal = ".";
/// <summary>
/// Comprobar si se aceptan las teclas en una caja de texto.
/// En la pulsación de los controles numéricos
/// aceptar solo los caracteres numéricos,
/// el valor negativo, el separador de decimales
/// y las teclas Intro, Delete, Back (borrar hacia atrás)
///
/// Es raro, si teclasAceptadas es: ",-1234567890" también acepta el punto
/// </summary>
private char AceptarTeclas(KeyPressEventArgs e, string teclasAceptadas)
{
char c = e.KeyChar;
if (c == Convert.ToChar(Keys.Return))
{
// con esto hacemos que se ignore la pulsación
e.Handled = true;
// se manda al siguiente control
SendKeys.Send("{TAB}");
}
else if (c == Convert.ToChar(NoSeparadorDecimal))
{
e.KeyChar = Convert.ToChar(SeparadorDecimal);
}
else if (teclasAceptadas.Contains(c.ToString()))
{
// no hacer nada, se aceptan
}
else if (c == Convert.ToChar(Keys.Delete) || c == Convert.ToChar(Keys.Back))
{
// no hacer nada, se aceptan
}
else
{
e.Handled = true;
}
return c;
}
//--------------------------------------------------------------------------
// Los métodos de evento del formulario
//--------------------------------------------------------------------------
private void btnCerrar_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnAsignarTabla1_Click(object sender, EventArgs e)
{
var d = 0M;
Decimal.TryParse(txtTabla1_campo1.Text, out d);
var ret = AñadirMiTabla1(d);
txtMensaje1.Text = "";
if (ret.hayError)
txtMensaje1.Text = "ERROR\r\n";
txtMensaje1.Text += ret.msg;
}
private void btnAsignarTabla2_Click(object sender, EventArgs e)
{
var valores = new decimal[12];
var d = 0M;
Decimal.TryParse(txtTabla2_campo1.Text, out d);
valores[0] = d;
d = 0M;
Decimal.TryParse(txtTabla2_campo2.Text, out d);
valores[1] = d;
var ret = AñadirMiTabla2(valores);
txtMensaje2.Text = "";
if (ret.hayError)
txtMensaje2.Text = "ERROR\r\n";
txtMensaje2.Text += ret.msg;
}
private void btnMostrar1_Click(object sender, EventArgs e)
{
// mostrar los datos de MiTabla1
txtMensaje1.Text = leerMiTabla("MiTabla1");
}
private void btnMostrar2_Click(object sender, EventArgs e)
{
// mostrar los datos de MiTabla2
txtMensaje2.Text = leerMiTabla("MiTabla2");
}
private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
AceptarTeclas(e, SeparadorDecimal + "-1234567890");
}
public Form1()
{
InitializeComponent();
}
<
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
// detecta la pulsación de las teclas en el formulario
// antes de mandarla a los controles
// En el diseñador de formularios tienes que
// asignar un valor True a la propiedad KeyPreview
if (e.Modifiers == Keys.Control)
{
if (e.KeyCode == Keys.C)
{
// copiar el texto
if (ActiveControl is TextBox)
{
//Dim texto = ActiveControl.Text
//Clipboard.SetText(texto)
var txt = ActiveControl as TextBox;
if (txt == null) return;
txt.Copy();
e.Handled = true;
}
}
else if (e.KeyCode == Keys.V)
{
// pegar el texto
if (ActiveControl is TextBox)
{
var txt = ActiveControl as TextBox;
if (txt == null) return;
txt.Paste();
e.Handled = true;
}
}
else if (e.KeyCode == Keys.X)
{
// cortar el texto
if (ActiveControl is TextBox)
{
var txt = ActiveControl as TextBox;
if (txt == null) return;
txt.Cut();
e.Handled = true;
}
}
else if (e.KeyCode == Keys.Z)
{
//deshacer
if (ActiveControl is TextBox)
{
var txt = ActiveControl as TextBox;
if (txt == null) return;
if (txt.CanUndo)
{
txt.Undo();
}
e.Handled = true;
}
}
}
}
}
}
Espero que te sea de utilidad.
Nos vemos
Guillermo