c# - 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();
解决方案
看起来您在 MySql.Data 中遇到了我以前从未见过的错误报告。
我猜您使用的是非美国英语语言环境,并且double
s 未使用美国格式(即,.
作为小数分隔符)进行格式化。
MySql.Data 中的此代码尝试执行文化敏感转换,如果字符串包含句点,则该转换将失败,但当前文化不使用它们:https ://github.com/mysql/mysql-connector-net /blob/a18f0417fc6864b378444d8936722bfbd126bb0d/MySQL.Data/src/Types/MySqlDouble.cs#L66
你可以:
- 在 bugs.mysql.com 上报告错误并希望在即将发布的版本中修复
- 强制当前线程
CurrentCulture
,en-US
以便文化敏感的转换正常工作 - 切换到没有此错误的其他 MySQL ADO.NET 库,例如MySqlConnector(免责声明:主要作者)
推荐阅读
- php - 从数据库调用数据作为标题
- r - 在 R 中拆分文本字符串的正则表达式
- python - 计算 Jacobian 并传递给 Scipy 最小化
- python - 使用 Python OSMnx 保存路线并保持其曲率
- reactjs - redux 自定义 reducer 如何与 Thunk 配合使用
- xml - 使用 Xpath 搜索网站以查找文本部分
- php - 将 Ajax JQuery 选择器保存在数组中
- java - 如何避免java安全信息弹出?
- java - Java Websocket 客户端作为 Servlet (App Engine)
- java - 给定根节点和目标节点的二叉树的总和是多少?