【问题标题】:Converting data type varchar to float将数据类型 varchar 转换为 float
【发布时间】:2014-03-09 13:17:54
【问题描述】:

我只需要通过计算一些数字来更新我数据库中的一些单元格。但我不知道为什么仍然会弹出一个异常:Converting data type varchar to float。有什么想法可能是错的吗?我看了这个大概 2 小时...

        Item oldItem = new Item();
        Item newItem = new Item();

        oldItem = cmbItems.SelectedItem as Item;

        newItem.PredaneMnozstvo = oldItem.PredaneMnozstvo + 1;
        newItem.Mnozstvo = oldItem.Mnozstvo - 1;
        if(!String.IsNullOrEmpty(txtAkcia.Text))
            newItem.HrubyZisk = oldItem.PredajnaCena - oldItem.NakupnaCena - double.Parse(txtAkcia.Text);
        else
            newItem.HrubyZisk = oldItem.PredajnaCena - oldItem.NakupnaCena;
        newItem.CistyZisk = Math.Round(newItem.HrubyZisk * 0.81,2);

        broker.UpdatePredal(newItem, oldItem);

    public void UpdatePredal(Item newItem, Item oldItem)
    {
    try
        {
            string sql = "UPDATE Sklad SET Mnozstvo= '"+newItem.Mnozstvo+"', PredaneMnozstvo= '"+newItem.PredaneMnozstvo+"',HrubyZisk= '"+newItem.HrubyZisk.ToString()+"', CistyZisk='"+newItem.CistyZisk+"' WHERE ID=" + oldItem.Id;
            cmd = new SqlCommand(sql, connection);
            connection.Open();

            cmd.ExecuteNonQuery();
        }
        catch (Exception eX)
        {
            MessageBox.Show(eX.Message);
        }
     }

有什么建议吗?

【问题讨论】:

  • 哪一行抛出异常?此外,您不应连接 SQL 命令并改用parameters
  • 请出示完整的例外情况,我们不是通灵者。
  • 在 ExecutingnonQuery 之后,我不知道为什么因为我的类型都很好,不需要转换任何东西......

标签: c# sql wpf


【解决方案1】:

我怀疑连接到查询字符串的值之一应该是浮点数,因此不应该用单引号括起来(例如:'"+newItem.HrubyZisk.ToString()+"')。

无论如何,更好地解决您的问题是使用参数化查询,这将使您免于 sql 注入和将特定数据类型(例如 DateTime、Decimal 等)转换为根据数据库特定文化有效的字符串表示的复杂性.例如:

try
{
    string sql = "UPDATE Sklad SET Mnozstvo= @Mnozstvo, PredaneMnozstvo= @PredaneMnozstvo, HrubyZisk= @HrubyZisk, CistyZisk=@CistyZisk WHERE ID=@ID";
    cmd = new SqlCommand(sql, connection);
    cmd.Parameters.AddWithValue("@Mnozstvo", newItem.Mnozstvo);
    cmd.Parameters.AddWithValue("@PredaneMnozstvo", newItem.PredaneMnozstvo);
    cmd.Parameters.AddWithValue("@HrubyZisk", newItem.HrubyZisk);
    cmd.Parameters.AddWithValue("@CistyZisk", newItem.CistyZisk);
    cmd.Parameters.AddWithValue("@ID", oldItem.Id);

    connection.Open();
    cmd.ExecuteNonQuery();
}
catch (Exception eX)
{
    MessageBox.Show(eX.Message);
}

【讨论】:

  • 当我尝试这个异常时弹出“必须声明标量变量@Mnozstvo”
  • 您在哪一行遇到了异常?不应该在这一行:string sql = ...。这只是简单的字符串声明没有连接。
  • 在 cmd.ExecuteNonQuery() 之后
  • hmm... 据我所知,上面的代码应该可以正常工作。变量@Mnozstvo 已在此行声明:.AddWithValue("@Mnozstvo", newItem.Mnozstvo);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多