首页 > 解决方案 > C#将double插入MySQL数据库,小数产生错误

问题描述

如果这是一个之前已经提出过的问题,我深表歉意,但我似乎找不到任何适合我情况的东西。

我在下面有这个方法,它将数据插入到我的数据库中,但是由于某种原因,当我插入price带小数的值时,它会引发异常,但是如果我在没有小数的情况下插入它,它会被接受并将所有内容添加到数据库中。换句话说price = 13.55,会引发错误并且price = 13不会。MySQL 数据库中的Price列被声明为符合 GAAP 标准,Double(13,4)并且是 DataType。

功能:

public int InsertPart(string partNumber, string name, string description, string price)
    {
        try
        {
            if (Instance != null)
            {
                _SqlQuery = $"INSERT INTO {_SchemaName}.part SET PartNumber = @PartNumber, Name = @Name, Description = @Description, Price = @Price";
                _MySqlCommand = new MySqlCommand(_SqlQuery, _MySqlConnection);
                _MySqlCommand.CommandTimeout = 100;

                _MySqlCommand.Parameters.Add(new MySqlParameter("@PartNumber", MySqlDbType.VarChar, 15));
                _MySqlCommand.Parameters.Add(new MySqlParameter("@Name", MySqlDbType.VarChar, 30));
                _MySqlCommand.Parameters.Add(new MySqlParameter("@Description", MySqlDbType.VarChar, 40));
                _MySqlCommand.Parameters.Add(new MySqlParameter("@Price", MySqlDbType.Double, 13));

                _MySqlCommand.Parameters["@PartNumber"].Value = partNumber;
                _MySqlCommand.Parameters["@Name"].Value = name;
                _MySqlCommand.Parameters["@Description"].Value = description;
                _MySqlCommand.Parameters["@Price"].Value = MainProgramCode.ParseDouble(price);

                _MySqlCommand.Prepare();
                int AffectedRows = _MySqlCommand.ExecuteNonQuery();
                _MySqlCommand.Dispose();
                return AffectedRows;
            }
        }
        catch (Exception ex)
        {
            MainProgramCode.ShowError("An error occurred while attempting to add the new part to the database.\nNo changes can be done at this time!", "ERROR - Database Insertion");
        }
        return 0;
    }

MainProgramCode.ParseDouble(price)函数调用此代码:

public static Double ParseDouble(string t)
    {
        Double.TryParse(t, NumberStyles.Currency, CultureInfo.InvariantCulture, out Double temp);
        return temp;
    }

我试过声明这条线:MySqlCommand.Parameters.Add(new MySqlParameter("@Price", MySqlDbType.Double, 13));也是这样,但它也给了我同样的问题:

_MySqlCommand.Parameters.Add(new MySqlParameter("@Price", MySqlDbType.Double));
_MySqlCommand.Parameters["@Price"].Precision = 13;
_MySqlCommand.Parameters["@Price"].Scale = 4;

我也尝试过这种方式,但我没有运气:

_MySqlCommand.Parameters.AddWithValue("@Price", MainProgramCode.ParseDouble(price));

任何建议或帮助将不胜感激。

编辑:

不断弹出的错误信息:

“输入字符串的格式不正确。”

ex.StackTrace = 在 System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) at system.String.System.IConvertible.ToDouble(IFormatProvider provider) at System.Convert.ToDouble(Object value) at MySql.Data.Types .MySqlDouble.MySql.Data.Types.IMySqlValue.WriteValue(MySqlPacket packet, Boolean binary, Object val, Int32 length) 在 MySql.Data.MySqlClient.MySqlParameter.Serialize(MySqlPacket packet, Boolean binary, MySqlConnectionStringBuilder settings) 在 MySql.Data。 MySqlClient.PreparableStatement.Execute() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为) 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() 在 MainProgramLibrary.Database.InsertPart(String partNumber, String name, String description, String价格)在 C 中:\Users\vanzy\OneDrive\Documents\Quote Swift Files\Visual Sudio Files\QuoteSwift\MainProgramLibrary\Database.cs:line 128 `

第 128 行是int AffectedRows = _MySqlCommand.ExecuteNonQuery();

标签: c#mysql

解决方案


看起来您在 MySql.Data 中遇到了我以前从未见过的错误报告。

我猜您使用的是非美国英语语言环境,并且doubles 未使用美国格式(即,.作为小数分隔符)进行格式化。

MySql.Data 中的此代码尝试执行文化敏感转换,如果字符串包含句点,则该转换将失败,但当前文化不使用它们:https ://github.com/mysql/mysql-connector-net /blob/a18f0417fc6864b378444d8936722bfbd126bb0d/MySQL.Data/src/Types/MySqlDouble.cs#L66

你可以:

  • 在 bugs.mysql.com 上报告错误并希望在即将发布的版本中修复
  • 强制当前线程CurrentCultureen-US以便文化敏感的转换正常工作
  • 切换到没有此错误的其他 MySQL ADO.NET 库,例如MySqlConnector(免责声明:主要作者)

推荐阅读