4

J'ai un SqlDataSource qui appelle un proc stocké. Lorsque la page charge un chargement Gridview qui utilise cette SqlDataSource.debug sql stocké proc dans VS 2008 à partir du code asp.net

À ce stade, je veux être en mesure de déboguer le proc stocké.

Je ne veux pas déboguer le proc stocké par lui-même.

Je veux voir quelles valeurs sont réellement transmises à la proc stockée et ce qu'elle est en train de faire.

+0

avez-vous le droit de recompiler la procédure stockée? – garik

+0

si vous avez, vous pouvez créer une table pour consigner toutes les valeurs de paramètres d'entrée à cette table. – garik

+0

Existe-t-il un autre moyen de savoir quels paramètres sont transmis à SqlDataSource? – kralco626

Répondre

4

Utilisez Sql Server Profiler. Vous pouvez écouter toutes les demandes sur votre serveur sql si vous avez des droits.

AJOUTÉE:

"SQL Profiler without sysadmin rights" ou "this one" peut vous aider.

Testez votre code sur votre propre serveur SQL (avec droits sa), pas de production. Si cela fonctionne chez vous, cela fonctionnera sur la production. Sinon, exigez des droits de traçage à faire pour votre travail! Par conséquent, utilisez un serveur local (édition express par exemple, ou édition développeur) avec ALTER TRACE ou les droits sysadmin pour utiliser SQL Server Profiler. N'utilisez pas de table et ne modifiez pas votre procédure stockée. Le profileur trace tous les appels au serveur SQL avec des valeurs param. Juste attraper ces appels!

AJOUTÉE:

J'ai trouvé ADO.NET Trace Logging. Je pense, c'est ce que vous cherchez. À mon avis, ce traceur n'est pas très bon à utiliser, mais dans votre cas, je pense que cela peut aider.

+0

De l'apparence de cela, je dois avoir waaaayyyy plus de privliges sur la base de données que moi. Je n'ai pas d'accès administrateur à la base de données. Je n'ai même pas le droit de répondre à mes procs en tant que dbo. – kralco626

+0

vous ne devriez pas recompiler la procédure stockée, mais vous devez avoir des droits sysadmin pour écouter. – garik

+0

Je ne suggérais pas que je répète le proc, je donnais juste un exemple du peu de droits que j'ai. Désolé, cela ne marchera pas. – kralco626

0

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("'", "''"); 
    } 


} 
Questions connexes