如何防止从 DataGridView c# 将小数点存储在数据库中

本文关键字:存储 数据库 小数点 何防止 DataGridView | 更新日期: 2023-09-27 18:34:09

我是c#的新手,使用Windows表单。我将Datagridview设置为仅接受数字和一个小数点。

我将Datagridview单元格值存储/更新到 sql 表中(货币列类型(。我不想将小数点本身存储到 sql 表中,因为 sql 不会接受它并且会抛出异常(因为只接受双精度值(

所以我写了这段代码来防止小数点本身存储到 sql 表中:

private void updateButton_Click(object sender, EventArgs e) 
    {
   // connection string and the rest of sql stuff....
   MyCommand.CommandText = "UPDATE Table1 SET ........");
   MyCommand.Parameters.Add("@value1", SqlDbType.Money);
 if (Convert.ToChar(dataGridView1.Rows[0].Cells[1].Value) != '.')// if not dot then store it in database
            {
                MyCommand.Parameters["@value1"].Value = Convert.ToDecimal(dataGridView1.Rows[0].Cells[1].Value);
            } 
}

但是,每当我在Row0, column1中单独输入小数点并单击更新按钮时,此代码不起作用并且仍然会引发异常(输入字符串格式不正确(。谁能告诉我为什么 if 条件不起作用?我怎样才能让它工作。谢谢

如何防止从 DataGridView c# 将小数点存储在数据库中

这里的问题似乎不在于SQL命令,而在于从string(在DataGridView中(到double的转换失败(如@Kevin提到的(。

那么为什么会失败呢?我们只能猜测,因为我们不知道单元格目前持有的确切值。显然,对'.'字符的检查不起作用。如果您使用另一种语言(例如德语,其中使用','(,这将有问题。

因此,我建议三点:

第一:

打印出调试输出的确切值(System.Diagnostics.Debug.WriteLine(dataGridView1.Rows[0].Cells[1].Value)(,以查看您获得的确切值以及原因。这只是一个学习目的,看看你的代码失败的原因以及可能发生的其他不当行为。

第二:

使用Decimal.TryParse代替支票'.'

decimal cellValue;
// Check if conversion possible
if (Decimal.TryParse(dataGridView1.Rows[0].Cells[1].Value, out cellValue)) 
{
    MyCommand.Parameters["@value1"].Value = cellValue;
} 
else
{
    /*Whatever you want to do in a fail case*/
}

这更安全,因为您总是会发现转换问题。

第三:

更改DataGridView的列类型:https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcolumn.valuetype%28v=vs.110%29.aspx这应该为您避免很多问题。