public override void Resolve(bool preparing)
{
// check to see if we are already resolved
if (resolvedCommandText != null) return;
// first retrieve the procedure definition from our
// procedure cache
string spName = commandText;
if (spName.IndexOf(".") == -1 && !String.IsNullOrEmpty(Connection.Database))
spName = Connection.Database + "." + spName;
spName = FixProcedureName(spName);
DataTable procTable;
GetParameters(spName,out procTable, out parametersTable);
if (procTable.Rows.Count == 0)
throw new InvalidOperationException(String.Format(Resources.RoutineNotFound, spName));
bool realAsFloat = procTable.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1;
StringBuilder sqlStr = new StringBuilder();
StringBuilder outSql = new StringBuilder();
string sqlDelimiter = "";
string outDelimiter = "";
string retParm = GetReturnParameter();
foreach (DataRow param in parametersTable.Rows)
{
MySqlParameter p = GetAndFixParameter(param, realAsFloat, retParm);
if (p == null) continue;
if (param["ORDINAL_POSITION"].Equals(0))
continue;
string baseName = p.ParameterName;
string pName = baseName;
if (baseName.StartsWith("@") || baseName.StartsWith("?"))
baseName = baseName.Substring(1);
else
pName = "@" + pName;
string inputVar = pName;
if (p.Direction != ParameterDirection.Input &&
!(Connection.driver.SupportsOutputParameters || preparing))
{
// set a user variable to our current value
string sql = String.Format("SET @{0}{1}={2}", ParameterPrefix, baseName, pName);
MySqlCommand cmd = new MySqlCommand(sql, Connection);
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
inputVar = String.Format("@{0}{1}", ParameterPrefix, baseName);
outSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", outDelimiter, inputVar);
outDelimiter = ", ";
}
sqlStr.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", sqlDelimiter, inputVar);
sqlDelimiter = ", ";
}
string sqlCmd = sqlStr.ToString().TrimEnd(' ', ',');
outSelect = outSql.ToString().TrimEnd(' ', ',');
if (procTable.Rows[0]["ROUTINE_TYPE"].Equals("PROCEDURE"))
sqlCmd = String.Format("call {0} ({1})", spName, sqlCmd);
else
{
if (retParm == null)
retParm = ParameterPrefix + "dummy";
else
outSelect = String.Format("@{0}{1}", ParameterPrefix, retParm);
sqlCmd = String.Format("SET @{0}{1}={2}({3})", ParameterPrefix, retParm, spName, sqlCmd);
}
resolvedCommandText = sqlCmd;
}