Bug #34359 When altering an stored procedure in visual studio parameters dissapear
| Submitted: | 6 Feb 2008 18:57 | Modified: | 1 Mar 2008 11:00 |
|---|---|---|---|
| Reporter: | Mike Hat | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / NET | Severity: | S2 (Serious) |
| Version: | 5.1.4 | OS: | Windows (XP) |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | stored procedures parameters visual studio 2005 net c# | ||
[6 Feb 2008 18:57]
Mike Hat
[7 Feb 2008 19:54]
Mike Hat
I've been working on this a little more, i tracked the problem to a dataset
StoredProcDescriptor.cs
Line 206
Protected override DataTable ReadTable(DataConnectionWrapper connection, object[] restrictions, string sort)
{
if (connection == null)
throw new ArgumentNullException("connection");
...................
DataTable dt = conn.GetSchema("Procedures", rest);
connection.Connection.UnlockProviderObject();
return dt;
}
The dataset returns 20 columns when they should be 21!
The query (line 41 same file)
protected new const string EnumerateSqlTemplate =
"SELECT " +
"r.ROUTINE_CATALOG, " +
"r.ROUTINE_SCHEMA, " +
"r.ROUTINE_TYPE, " +
"r.ROUTINE_NAME, " +
"r.SPECIFIC_NAME, " +
"r.DTD_IDENTIFIER, " +
"r.ROUTINE_BODY, " +
"r.ROUTINE_DEFINITION, " +
"r.EXTERNAL_NAME, " +
"r.EXTERNAL_LANGUAGE, " +
"r.PARAMETER_STYLE, " +
"r.IS_DETERMINISTIC, " +
"r.SQL_DATA_ACCESS, " +
"r.SQL_PATH, " +
"r.SECURITY_TYPE, " +
"r.CREATED, " +
"r.LAST_ALTERED, " +
"r.SQL_MODE, " +
"r.ROUTINE_COMMENT, " +
"r.`DEFINER`, " +
"CONVERT (p.PARAM_LIST, CHAR) AS PARAM_LIST " +
"FROM information_schema.ROUTINES r " +
"JOIN mysql.PROC p ON r.SPECIFIC_NAME = p.SPECIFIC_NAME " +
"AND r.ROUTINE_SCHEMA = p.DB " +
"AND r.ROUTINE_TYPE = p.`TYPE` " +
"WHERE r.ROUTINE_SCHEMA = {1} AND r.ROUTINE_TYPE = {2} AND r.ROUTINE_NAME = {3}";
* Parameter 21 "CONVERT (p.PARAM_LIST, CHAR) AS PARAM_LIST " is missing, I have some trouble with subqueries in the sql editor, so this could be related
"Select a.column,(SELECT 'a') as sarasa from a" only returns column.
I'll post updates as soon as i got some news
[11 Feb 2008 15:35]
Mike Hat
It seems that I needed a weekend to figure it out.
LINE #206 - File: StoredProcDescriptor.cs
-------------------------------------------------------------------
Protected override DataTable ReadTable(DataConnectionWrapper connection, object[]
restrictions, string sort)
...
...
...
DataTable dt = conn.GetSchema("Procedures", rest);
-------------------------------------------------------------------
GetSchema("Procedures", rest) returns 20 fields instead of 21, I thought that it was using the SQL defined in the line 41 of the same file, but it wasnt. When you call it the function returns all columns but PARAM_LIST, It must be a GetSchema error, I've seen a few open issues related with GetSchema.
I used the sql defined in line 41 and worked fine, this is what i did:
SUGESTED FIX ( UGLY )
-------------------------
LINE #217 - File: StoredProcDescriptor.cs
-------------------------------------------------------------------
string[] rest = restrictions == null ? null : new string[restrictions.Length];
if (rest != null)
for (int x = 0; x < rest.Length; x++)
if (restrictions[x] != null)
rest[x] = restrictions[x].ToString();
//DataTable dt = conn.GetSchema("Procedures", rest);
DbCommand _command = conn.CreateCommand();
_command.CommandText = string.Format(EnumerateSqlTemplate, "", "'" + rest[1].ToString() + "'", "'PROCEDURE'", "'" + rest[2].ToString() + "'");
DbDataReader _dr = _command.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(_dr);
connection.Connection.UnlockProviderObject();
return dt;
}
-------------------------------------------------------------------
I know its ugly code, sorry, I'm sure it can be improved, I just wanted to post this fix fast to help out :P
I'll check out GetSchema to see if i can fix it from there later on.
Best Regards
Mike Hat
[11 Feb 2008 17:56]
Tonci Grgin
Hi Mike and thanks for your efforts. I'm drowning in all possible connectors reports right now and don't have time for proper analysis right away so I asked c/NET team leader to take a peek into this problem.
[11 Feb 2008 19:46]
Mike Hat
Tonci Grgin:
No problem, just trying to help :P
I took a look at the .Net connector (mysql.data.dll) and found out that when you call GetSchema after a few turns you get to the "Query" function, that actually does the query.
The query only affects the "INFORMATION_SCHEMA.ROUTINES" table and never joins with the "mysql.PROC" table. So there is no way you can get the procedure param_list.
One way could it to use the code I put in my previous message, or a better one :P. The other way could it be to modify the Query function, but i see it a little complicated since its used for many things. Perhaps a subselect there?
---> StringBuilder query = new StringBuilder("SELECT *, (SELECT param_list from mysql.PROC where bla bla bla) from FROM INFORMATION_SCHEMA.");
Here's the code of the query function that returns de dataset without the param_list
Hope this helps
LINE #250 - ISSchemaProvider.cs (mysql.data proyect)
------------------------------------------------------------------------------
private DataTable Query(string table_name, string initial_where,
string[] keys, string[] values)
{
StringBuilder where = new StringBuilder(initial_where);
StringBuilder query = new StringBuilder("SELECT * FROM INFORMATION_SCHEMA.");
query.Append(table_name);
if (values != null)
for (int i = 0; i < keys.Length; i++)
{
if (i >= values.Length) break;
if (values[i] == null || values[i] == String.Empty) continue;
if (where.Length > 0)
where.Append(" AND ");
where.AppendFormat(CultureInfo.InvariantCulture, "{0}='{1}'", keys[i], values[i]);
}
if (where.Length > 0)
query.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where);
return GetTable(query.ToString());
}
[12 Feb 2008 21:12]
Mike Hat
Nicer fix :P
LINE #215 - File: StoredProcDescriptor.cs
-------------------------------------------------------------------
//DbConnection conn = //DbConnection)connection.Connection.GetLockedProviderObject();
string[] rest = restrictions == null ? null : new string[restrictions.Length];
if (rest != null)
for (int x = 0; x < rest.Length; x++)
if (restrictions[x] != null)
rest[x] = restrictions[x].ToString();
//DataTable dt = conn.GetSchema("Procedures", rest);
DataTable dt = connection.ExecuteSelectTable(string.Format(EnumerateSqlTemplate, "", "'" + rest[1].ToString() + "'", "'PROCEDURE'", "'" + rest[2].ToString() + "'"));
//connection.Connection.UnlockProviderObject();
return dt;
}
[14 Feb 2008 16:55]
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/42294
[14 Feb 2008 17:10]
Reggie Burnett
Fixed in 5.1.6 and 5.2.1
[1 Mar 2008 11:00]
MC Brown
A note has been added to the 5.1.6, and 5.2.1 changelog: When altering a stored procedure within Visual Studio, the parameters to the procedure could be lost.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.042 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.