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

时间:2016-02-11 16:10:25

标签: c# sql

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

我将Datagridview单元格值存储/更新到sql表(money columns type)。 我不想将小数点单独存储到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条件不起作用?我怎样才能让它发挥作用。谢谢

1 个答案:

答案 0 :(得分:1)

这里的问题似乎不在于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 这应该可以避免很多问题。