| Bug #48100 | Impossible to retrieve decimal value if it doesn't fit into .Net System.Decimal | ||
|---|---|---|---|
| Submitted: | 15 Oct 2009 20:18 | Modified: | 5 Nov 2009 15:49 |
| Reporter: | Andrey Belykh | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / NET | Severity: | S2 (Serious) |
| Version: | 6.1.2.0 | OS: | Windows |
| Assigned to: | Reggie Burnett | CPU Architecture: | Any |
[15 Oct 2009 20:18]
Andrey Belykh
[16 Oct 2009 6:26]
Tonci Grgin
Hi Andrey and thanks for your report.
True, mscorlib throws "Value was either too large or too small for a Decimal."
Verified as described. Please lower the severity as this is actually a feature request (S4).
Test case:
using (MySqlConnection cn = new MySqlConnection("DataSource=**;Database=**;UserID=**;Password=**;PORT=**;logging=True;charset=utf8"))
{
cn.Open();
try
{
MySqlCommand cmdCreateTable = new MySqlCommand("DROP TABLE IF EXISTS bug48100", cn);
cmdCreateTable.ExecuteNonQuery();
cmdCreateTable.CommandText = "CREATE TABLE bug48100 (a decimal(36,2));";
cmdCreateTable.ExecuteNonQuery();
cmdCreateTable.CommandText = "INSERT INTO bug48100 VALUES (9999999999999999999999999999999999.99);";
cmdCreateTable.ExecuteNonQuery();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = cn;
cmd.CommandText = "SELECT * FROM bug48100";
MySqlDataReader rd = cmd.ExecuteReader();
rd.Read();
Console.Out.WriteLine("Result is: " + rd[0]);
}
catch (Exception ex)
{
Console.Out.WriteLine(DateTime.UtcNow.ToLongTimeString() + " " + "Exception: " + ex.Message);
throw;
}
}
[16 Oct 2009 14:04]
Andrey Belykh
I do agree that the proposed solution sounds like a feature request. However, what I am only interested in is getting the value. Making MySqlReader.GetDouble() to not throw would work for my purpose. I would like to leave the severity at S2 unless you have a workaround.
[16 Oct 2009 18:38]
Vladislav Vaintroub
Will using a CAST AS CHAR(N) like below work for you as workaround?
MySqlCommand cmd = new MySqlCommand("select a from long_number", conn);
try
{
decimal dec = (decimal)cmd.ExecuteScalar();
}
catch (OverflowException)
{
cmd.CommandText = "select cast(a as char(38)) from long_number";
string val = (string)cmd.ExecuteScalar();
double dbl = Convert.ToDouble(val);
}
[19 Oct 2009 16:30]
Andrey Belykh
Thanks for your response. In short, no, it's not a good workaround. We will mention this in the documentation and refer customers to this bug report.
[29 Oct 2009 21:31]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/88647 772 Reggie Burnett 2009-10-29 - now exposing the MySqlDecimal type along with GetMySqlDecimal methods on data reader (bug #48100)
[29 Oct 2009 21:33]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/88649 784 Reggie Burnett 2009-10-29 [merge] - now exposing the MySqlDecimal type along with GetMySqlDecimal methods on data reader (bug #48100)
[29 Oct 2009 21:34]
Reggie Burnett
Fixed in 6.0.5, 6.1.3, and 6.2.1+
[29 Oct 2009 21:38]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/88653 793 Reggie Burnett 2009-10-29 [merge] - now exposing the MySqlDecimal type along with GetMySqlDecimal methods on data reader (bug #48100)
[29 Oct 2009 21:39]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/88654 792 Reggie Burnett 2009-10-29 [merge] - now exposing the MySqlDecimal type along with GetMySqlDecimal methods on data reader (bug #48100)
[5 Nov 2009 15:49]
Tony Bedford
An entry has been added to the 6.0.5, 6.1.3 and 6.2.1 changelogs: It was not possible to retrieve a value from a MySQL server table, if the value was larger than that supported by the .NET type System.Decimal. MySQL Connector/NET was changed to expose the MySqlDecimal type, along with the supporting method GetMySqlDecimal.
