从VB.NET在MySQL DB中存储负数

时间:2017-02-13 21:30:12

标签: vb.net

我已经能够成功地将数据保存到数据库中,但是当我尝试存储以下条目时:

1,1,"Description 1",-195.37
1,2,"Description 2",-175.90
1,3,"Description 3",108.00
1,4,"Description 4",-57.33
1,5,"Description 5",95.32

它吐了这个:

---------------------------
Application Name Here
---------------------------
System.FormatException: Input string was not in a correct format.
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
at System.Convert.ToInt32(Object value)
at MySql.Data.Types.MySqlInt32.MySql.Data.Types.IMySqlValue.WriteValue(MySqlPacket packet, Boolean binary, Object val, Int32 length)
at MySql.Data.MySqlClient.MySqlParameter.Serialize(MySqlPacket packet, Boolean binary, MySqlConnectionStringBuilder settings)
at MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName, Int32 parameterIndex)
at MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
at MySql.Data.MySqlClient.Statement.BindParameters()
at MySql.Data.MySqlClient.PreparableStatement.Execute()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at ApplicationNameHere.frmPaySlip.Button2_Click(Object sender, EventArgs e) in frmPaySlip.vb:line 210
---------------------------
OK    
---------------------------

数据库的布局如下:

psid    int(5)
rowid   int(5)
description varchar(255)
value   decimal(20,2)   

代码I使用的是:

Dim cmd_result As Integer = CInt(selectCommand.ExecuteScalar())
Dim rowID As Integer = 1
selectCommand2.Connection = connection
selectCommand2.CommandText = "INSERT INTO `ps_payslip_datrow` (`psid`, `rowid`, `description`, `value`) VALUES (@psid, @rowid, @description, @value)"
selectCommand2.Parameters.AddWithValue("@psid", cmd_result)
selectCommand2.Parameters.AddWithValue("@rowid", 0)
selectCommand2.Parameters.AddWithValue("@description", 0)
selectCommand2.Parameters.AddWithValue("@value", 0.00)
For Each item As ListViewItem In lbDedAddTot.Items
    selectCommand2.Parameters("@rowid").Value = rowID
    selectCommand2.Parameters("@description").Value = item.SubItems(0).Text
    selectCommand2.Parameters("@value").DbType = DbType.Decimal
    selectCommand2.Parameters("@value").Value = Convert.ToDecimal(item.SubItems(1).Text)
    selectCommand2.ExecuteNonQuery()
    rowID += 1
Next

注意: cmd_result工作得很好。只是这个循环失败了。 VB.NET将数字转换为Decimal。一直在做休息,并观察验证。 我过去两天一直试图查看我出错的地方。

2 个答案:

答案 0 :(得分:0)

在这一行上,      selectCommand2.Parameters.AddWithValue(" @ description",0) 你没有忘记0(零)的报价吗?

答案 1 :(得分:0)

看起来你无意中制作了"描述"带有AddWithValue语句的整数。改为使用Add方法。

    selectCommand2.CommandText = "INSERT INTO `ps_payslip_datrow` (`psid`, `rowid`, `description`, `value`) VALUES (@psid, @rowid, @description, @value)"
    selectCommand2.Parameters.Add("@psid", SqlDbType.Int).Value = cmd_result
    selectCommand2.Parameters.Add("@rowid", SqlDbType.Int)
    selectCommand2.Parameters.Add("@description", SqlDbType.VarChar)
    selectCommand2.Parameters.Add("@value", SqlDbType.Decimal)
    For Each item As ListViewItem In lbDedAddTot.Items
        selectCommand2.Parameters("@rowid").Value = rowID
        selectCommand2.Parameters("@description").Value = item.SubItems(0).Text
        selectCommand2.Parameters("@value").Value = Convert.ToDecimal(item.SubItems(1).Text)
        selectCommand2.ExecuteNonQuery()
        rowID += 1
    Next

您还应该测试Value源以确保它确实是小数。