我是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条件不起作用?我怎样才能让它发挥作用。谢谢
答案 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
这应该可以避免很多问题。