【问题标题】:debug sql stored proc in VS 2008 from within asp.net code从 asp.net 代码中调试 VS 2008 中存储的 sql 过程
【发布时间】:2010-08-30 14:36:42
【问题描述】:

我有一个调用存储过程的 SqlDataSource。当页面加载使用该 SqlDataSource 的 Gridview 时。

此时我希望能够调试存储过程。

我不想自己调试存储的过程。

我想看看实际传递给存储过程的值是什么以及它实际在做什么。

【问题讨论】:

  • 你有权重新编译存储过程吗?
  • 如果你有,你可以创建一些表来记录所有输入参数值到这个表中。
  • 是否有其他方法可以找出传递给 SqlDataSource 的参数?
  • 我无权重新编译存储过程。我几乎没有做任何事情的权利。我也无法创建表格。
  • 使用具有 ALTER TRACE 或系统管理员权限的本地服务器(例如快速版或开发版)来使用 SQL Server Profiler。不要使用表,也不要更改您的存储过程。 Profiler 使用参数值跟踪对 sql server 的所有调用

标签: asp.net sql visual-studio-2008 sql-server-2005 stored-procedures


【解决方案1】:

使用 Sql Server Profiler。如果您有权限,您可以侦听对您的 sql 服务器的所有请求。

添加:

"SQL Profiler without sysadmin rights""this one" 可以帮助您。

在您自己的 sql 服务器(具有 sa 权限)上测试您的代码,而不是生产。如果它适用于您的产品,它将适用于生产。否则要求 Trace 权限来完成您的工作!

因此,请使用具有 ALTER TRACE 或系统管理员权限的本地服务器(例如 express 版或开发者版)来使用 SQL Server Profiler。不要使用表,也不要更改您的存储过程。 Profiler 使用参数值跟踪对 sql 服务器的所有调用。抓住这个电话!

添加:

我找到了ADO.NET Trace Logging。我想,这就是你要找的。在我看来,这个追踪器不太好用,但在你的情况下,我认为它可以提供帮助。

【讨论】:

  • 从外观上看,我必须在数据库上拥有比我更多的权限。我没有对数据库的管理员访问权限。甚至没有权利将我的 proc 重新编译为 dbo。
  • 你不应该重新编译存储过程,但你必须有系统管理员权限才能收听。
  • 我并不是建议我重新编译 proc,我只是举例说明我拥有的权利是多么少。抱歉,这行不通。
  • 对不起,我也无法获得这些权限。有什么方法可以从.net 端判断哪些参数正在传递给存储过程?
  • 我想答案是创建一个本地版本的数据库,获得必要的权利,或者做我想做的事。创建一个临时表并修改您的存储过程以将参数与时间戳一起插入到临时表中。
【解决方案2】:

好的 - 这不是完全调试,但你可以做的是在 ASP.NET 中设置一个断点,你将要调用数据库(命令参数已准备好)

然后转到即时窗口并调用此方法

?DebugUtils.DebugStoredProc("你的存储过程",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("'", "''");
    }


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多