我有一個SqlDataSource調用存儲過程。當頁面加載使用該SqlDataSource的Gridview加載時。調試SQL存儲過程在VS 2008中從asp.net代碼
在這個時候我想能夠調試存儲的過程。
我不想自己調試存儲過程。
我想看看實際上傳遞給存儲過程的值以及它實際上在做什麼。
我有一個SqlDataSource調用存儲過程。當頁面加載使用該SqlDataSource的Gridview加載時。調試SQL存儲過程在VS 2008中從asp.net代碼
在這個時候我想能夠調試存儲的過程。
我不想自己調試存儲過程。
我想看看實際上傳遞給存儲過程的值以及它實際上在做什麼。
使用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。我想,這是你正在尋找的。在我看來,這個追蹤器不太好用,但就你而言,我認爲它可以提供幫助。
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("'", "''");
}
}
您有權重新編譯存儲過程嗎? – garik 2010-08-30 14:47:14
如果有,您可以創建一些表將所有輸入參數值記錄到此表中。 – garik 2010-08-30 14:48:13
是否有另一種方法來找出傳遞給SqlDataSource的參數? – kralco626 2010-08-30 14:48:23