OK - ce n'est pas débogage exactement, mais ce que vous pouvez faire est de mettre un point de rupture dans le ASP.NET où vous êtes exactement sur le point d'appeler la base de données (paramètres de commande est prêt)
puis passez à immédiatement fenêtre et appelez cette méthode
? DebugUtils.DebugStoredProc ("Votre procédure stockée", CommandObj); cela vous renverra une chaîne que vous pouvez directement copier et exécuter dans l'Analyseur de requêtes.
public class DebugUtils
{
public DebugUtils()
{
//
// TODO: Add constructor logic here
//
}
public static string DebugStoredProc(string spName, SqlCommand cmd)
{
//string szSPComand = string.Empty;
string szSPComandFirstPart = "EXEC "+spName + " ";
string szSPComandSecondPart = string.Empty;
string szDEBug = string.Empty;
foreach (SqlParameter sqlparam in cmd.Parameters)
{
if (szSPComandSecondPart.Length > 0) { szSPComandSecondPart += " , "; szDEBug += " , "; }
szSPComandSecondPart += string.Format("{0}={1}",sqlparam.ParameterName, ReturnParamToken(sqlparam));
szDEBug += String.Format(" {0} ", sqlparam.ParameterName);
}
return szSPComandFirstPart + " " + szSPComandSecondPart;
}
private static string ReturnParamToken(SqlParameter param)
{
string sToken = string.Empty;
SqlDbType dbtype = param.SqlDbType;
if ( dbtype == SqlDbType.Char
|| dbtype == SqlDbType.VarChar
|| dbtype == SqlDbType.Xml
|| dbtype == SqlDbType.UniqueIdentifier )
{
#region String - chars
if (param.Value == DBNull.Value)
{
sToken = " null ";
}
else
{
sToken = "'" + FixQuotes(Convert.ToString(param.Value)) + "'";
}
#endregion
}
else if (
dbtype == SqlDbType.BigInt
|| dbtype == SqlDbType.Decimal
|| dbtype == SqlDbType.Float
|| dbtype == SqlDbType.Int
|| dbtype == SqlDbType.Money
|| dbtype == SqlDbType.Real
|| dbtype == SqlDbType.SmallInt
|| dbtype == SqlDbType.SmallMoney
|| dbtype == SqlDbType.TinyInt
)
{
#region Numbers
if (param.Value == DBNull.Value)
{
sToken = " null ";
}
else
{
sToken = Convert.ToString(param.Value);
}
#endregion
}
else if (
dbtype == SqlDbType.DateTime
|| dbtype == SqlDbType.DateTime2
|| dbtype == SqlDbType.SmallDateTime
|| dbtype == SqlDbType.Time
|| dbtype == SqlDbType.Timestamp
)
{
#region Dates
if (param.Value == DBNull.Value)
{
sToken = " null ";
}
else
{
sToken = string.Format("'{0}'", Convert.ToString(param.Value));
}
#endregion
}
else if (
dbtype == SqlDbType.Bit
)
{
#region BIT or BOOL
if (param.Value == DBNull.Value)
{
sToken = " null ";
}
else
{
if (Convert.ToBoolean(param.Value) == true)
{
sToken = "1";
}
else
{
sToken = Convert.ToString(param.Value);
}
}
#endregion
}
else if (
dbtype == SqlDbType.Binary
|| dbtype == SqlDbType.Date
|| dbtype == SqlDbType.DateTimeOffset
|| dbtype == SqlDbType.Image
|| dbtype == SqlDbType.NChar
|| dbtype == SqlDbType.NText
|| dbtype == SqlDbType.NVarChar
|| dbtype == SqlDbType.Structured
|| dbtype == SqlDbType.Text
|| dbtype == SqlDbType.Udt
|| dbtype == SqlDbType.VarBinary
|| dbtype == SqlDbType.Variant
)
{
if (param.Value == DBNull.Value)
{
sToken = " null ";
}
else
{
sToken = string.Format("UNKNOWN DATATYPE - NO HANDLER FOUND for @param : {0} of datatype:{1} ", param.ParameterName, Convert.ToString(dbtype.ToString()));
}
}
return sToken;
}
private static string FixQuotes(string str)
{
return str.Replace("'", "''");
}
}
avez-vous le droit de recompiler la procédure stockée? – garik
si vous avez, vous pouvez créer une table pour consigner toutes les valeurs de paramètres d'entrée à cette table. – garik
Existe-t-il un autre moyen de savoir quels paramètres sont transmis à SqlDataSource? – kralco626