Modified:
branches/5.0/CHANGES
branches/5.0/Driver/Source/ISSchemaProvider.cs
branches/5.0/Driver/Source/parameter_collection.cs
branches/5.0/TestSuite/StoredProcedure.cs
Log:
Return parameters created with DeriveParameters now have the name RETURN_VALUE. We also changed how parameters are handled inside the parameter collection so that a return value parameter can have the same name as a non-return parameter.
Modified: branches/5.0/CHANGES
===================================================================
--- branches/5.0/CHANGES 2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/CHANGES 2007-01-08 18:01:21 UTC (rev 542)
@@ -3,6 +3,10 @@
Bugs fixed
----------
Bug #25443 ExecuteScalar() hangs when more than one bad result
+
+ Other changes
+ -------------
+ Return parameters created with DeriveParameters now have the name RETURN_VALUE
Version 5.0.3 12-31-2006
Modified: branches/5.0/Driver/Source/ISSchemaProvider.cs
===================================================================
--- branches/5.0/Driver/Source/ISSchemaProvider.cs 2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/Driver/Source/ISSchemaProvider.cs 2007-01-08 18:01:21 UTC (rev 542)
@@ -488,10 +488,13 @@
string[] split = cs.Split(parmDef, " \t\r\n");
if (parmRow["IS_RESULT"].Equals("NO"))
{
- parmRow["PARAMETER_NAME"] = String.Format("{0}{1}",
- connection.ParameterMarker, CleanParameterName(split[0]));
+ parmRow["PARAMETER_NAME"] = String.Format("{0}{1}",
+ connection.ParameterMarker, CleanParameterName(split[0]));
parmDef = parmDef.Substring(split[0].Length);
}
+ else
+ parmRow["PARAMETER_NAME"] = String.Format("{0}RETURN_VALUE",
+ connection.ParameterMarker);
ParseType(parmDef, sqlMode, parmRow);
}
Modified: branches/5.0/Driver/Source/parameter_collection.cs
===================================================================
--- branches/5.0/Driver/Source/parameter_collection.cs 2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/Driver/Source/parameter_collection.cs 2007-01-08 18:01:21 UTC (rev 542)
@@ -40,6 +40,7 @@
private char paramMarker = '?';
private Hashtable ciHash;
private Hashtable hash;
+ private int returnParameterIndex;
internal MySqlParameterCollection()
{
@@ -50,6 +51,7 @@
ciHash = new Hashtable(new CaseInsensitiveHashCodeProvider(),
new CaseInsensitiveComparer());
#endif
+ Clear();
}
internal char ParameterMarker
@@ -119,16 +121,13 @@
private MySqlParameter AddReturnParameter(MySqlParameter value)
{
- for (int i = 0; i < items.Count; i++)
+ if (returnParameterIndex != -1)
{
- MySqlParameter p = (MySqlParameter)items[i];
- if (p.Direction != ParameterDirection.ReturnValue) continue;
- items[i] = value;
+ items[returnParameterIndex] = value;
return value;
}
+
int index = items.Add(value);
- hash.Add(value.ParameterName, index);
- ciHash.Add(value.ParameterName, index);
return value;
}
@@ -236,16 +235,31 @@
int index = this.IndexOf(parameterName);
if (index < 0)
throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection.");
- //changed = true;
- items[index] = (MySqlParameter)value;
+ SetParameter(index, value);
}
protected override void SetParameter(int index, DbParameter value)
{
CheckIndex(index);
- //changed = true;
+ MySqlParameter p = (MySqlParameter)items[index];
+ if (p.Direction == ParameterDirection.ReturnValue)
+ returnParameterIndex = -1;
+ else
+ {
+ hash.Remove(p.ParameterName);
+ ciHash.Remove(p.ParameterName);
+ }
+
items[index] = (MySqlParameter)value;
- }
+ p = (MySqlParameter)value;
+ if (p.Direction == ParameterDirection.ReturnValue)
+ returnParameterIndex = index;
+ else
+ {
+ hash.Add(p.ParameterName, index);
+ ciHash.Add(p.ParameterName, index);
+ }
+ }
/// <summary>
/// Adds the specified <see cref="MySqlParameter"/> object to the <see cref="MySqlParameterCollection"/>.
@@ -274,6 +288,7 @@
items.Clear();
hash.Clear();
ciHash.Clear();
+ returnParameterIndex = -1;
}
/// <summary>
@@ -332,11 +347,20 @@
public override int IndexOf(string parameterName)
{
object o = hash[parameterName];
- if (o == null)
- o = ciHash[parameterName];
- if (o == null)
- return -1;
- return (int)o;
+ if (o != null)
+ return (int)o;
+
+ o = ciHash[parameterName];
+ if (o != null)
+ return (int)o;
+
+ if (returnParameterIndex != -1)
+ {
+ MySqlParameter p = (MySqlParameter)items[returnParameterIndex];
+ if (String.Compare(parameterName, p.ParameterName, true) == 0)
+ return returnParameterIndex;
+ }
+ return -1;
}
/// <summary>
@@ -394,6 +418,12 @@
public override void Remove(object value)
{
items.Remove(value);
+
+ MySqlParameter p = (value as MySqlParameter);
+ hash.Remove(p.ParameterName);
+ ciHash.Remove(p.ParameterName);
+ if (p.Direction == ParameterDirection.ReturnValue)
+ returnParameterIndex = -1;
}
/// <summary>
@@ -403,7 +433,7 @@
public override void RemoveAt(string name)
{
DbParameter p = GetParameter(name);
- items.Remove(p);
+ Remove(p);
}
/// <summary>
@@ -413,7 +443,8 @@
/// <overloads>Removes the specified <see cref="MySqlParameter"/> from the collection.</overloads>
public override void RemoveAt(int index)
{
- items.RemoveAt(index);
+ object o = items[index];
+ Remove(o);
}
/// <summary>
Modified: branches/5.0/TestSuite/StoredProcedure.cs
===================================================================
--- branches/5.0/TestSuite/StoredProcedure.cs 2007-01-08 18:00:45 UTC (rev 541)
+++ branches/5.0/TestSuite/StoredProcedure.cs 2007-01-08 18:01:21 UTC (rev 542)
@@ -988,5 +988,17 @@
}
}
+ [Test]
+ public void CheckNameOfReturnParameter()
+ {
+ execSQL("CREATE FUNCTION fnTest() RETURNS CHAR(50)" +
+ " LANGUAGE SQL DETERMINISTIC BEGIN RETURN \"Test\"; END");
+
+ MySqlCommand cmd = new MySqlCommand("fnTest", conn);
+ cmd.CommandType = CommandType.StoredProcedure;
+ MySqlCommandBuilder.DeriveParameters(cmd);
+ Assert.AreEqual(1, cmd.Parameters.Count);
+ Assert.AreEqual("?RETURN_VALUE", cmd.Parameters[0].ParameterName);
+ }
}
}
| Thread |
|---|
| • Connector/NET commit: r542 - in branches/5.0: . Driver/Source TestSuite | rburnett | 8 Jan |