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.