将数据类型varchar转换为float

时间:2014-03-09 13:17:54

标签: c# sql wpf

我只需要通过计算一些数字来更新数据库中的一些单元格。但我不知道为什么还有一个异常仍然存在:将数据类型varchar转换为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);
        }
     }

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我怀疑连接到查询字符串的值之一应该是一个浮点数,因此不应该用单引号括起来(例如:'"+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);
}