【问题标题】:How to prevent a decimal dot from being stored in Database from DataGridView c#?如何防止小数点从 DataGridView c# 存储在数据库中?
【发布时间】:2016-02-12 00:39:09
【问题描述】:

我是 C# 新手,并且使用 Windows 窗体。我将Datagridview 设置为只接受数字和一个小数点。

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

所以我写了这段代码来防止小数点自己存储到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 条件不起作用?我怎样才能让它工作。谢谢

【问题讨论】:

  • 抛出了什么样的异常?
  • @Nicholas Schuster。 “输入字符串的格式不正确”。有什么想法吗?
  • 我怀疑 Convert.ToDecimal 在您向其传递一个无法转换为数字的字符串时抛出该异常。我怀疑 dataGridView1.Rows[0].Cells[1].Value 不包含您认为在单元格中输入一个单独的点时的值。
  • 停止“if”行,调试到那里并将以下内容粘贴到 VS 的即时窗口中; ? Convert.ToChar(dataGridView1.Rows[0].Cells[1].Value)
  • 如果上面的结果实际上是'.'那么我不知道,你的 if 应该抓住它。如果没有,只需调整您的 if 以查找正确的值。

标签: c# sql


【解决方案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 这应该可以为您避免很多问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2016-06-09
    • 2011-02-13
    相关资源
    最近更新 更多