4

我有一個SqlDataSource調用存儲過程。當頁面加載使用該SqlDataSource的Gridview加載時。調試SQL存儲過程在VS 2008中從asp.net代碼

在這個時候我想能夠調試存儲的過程。

我不想自己調試存儲過程。

我想看看實際上傳遞給存儲過程的值以及它實際上在做什麼。

+0

您有權重新編譯存儲過程嗎? – garik 2010-08-30 14:47:14

+0

如果有,您可以創建一些表將所有輸入參數值記錄到此表中。 – garik 2010-08-30 14:48:13

+0

是否有另一種方法來找出傳遞給SqlDataSource的參數? – kralco626 2010-08-30 14:48:23

回答

4

使用Sql Server Profiler。如果你有權限,你可以監聽你的sql服務器的所有請求。

新增:

"SQL Profiler without sysadmin rights""this one"可以幫助你。

在你自己的SQL服務器上測試你的代碼(有sa權限),而不是生產。如果它適用於您的產品,它將用於生產。否則需要跟蹤權利做你的工作!

因此,使用ALTER TRACE或sysadmin權限的本地服務器(例如快速版或開發人員版本)使用SQL Server Profiler。不要使用表格,也不要更改存儲過程。 Profiler使用參數值跟蹤所有對sql server的調用。趕上這個電話!

新增:

我發現ADO.NET Trace Logging。我想,這是你正在尋找的。在我看來,這個追蹤器不太好用,但就你而言,我認爲它可以提供幫助。

+0

從外觀上看,我必須在數據庫上擁有比我更多的特權。我沒有管理員訪問數據庫的權限。甚至沒有權利重新編譯我的proc作爲dbo。 – kralco626 2010-08-30 14:41:41

+0

您不應該重新編譯存儲過程,但是您必須具有sysadmin權限才能進行監聽。 – garik 2010-08-30 14:45:40

+0

我並不是在暗示我重新編譯過程,我只是舉例說明我擁有的權利有多少。對不起,這不會工作。 – kralco626 2010-08-30 14:47:22

0

OK - 這是不準確的調試,但你可以做的就是把一個破發點中你要調用數據庫的確切位置ASP.NET(命令參數準備)

然後去直接窗口並調用此方法

?DebugUtils.DebugStoredProc(「Your stored procedure」,CommandObj); 這將返回一個字符串,您可以直接在查詢分析器中進行復制和執行。

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


}