可以获取用于调试的存储过程调用

本文关键字:存储过程 调用 调试 用于 获取 | 更新日期: 2023-09-27 18:01:20

在使用Visual Studio 2010为我的ASP。. NET网站,我们有一个存储过程调用的代码:

SqlDataAccess sqlDataAccess = new SqlDataAccess();
SqlParameter[] parameters =
{
    new SqlParameter("@R", rptType.Replace("'", "''")),
    new SqlParameter("@M", hybrDct["mod"].ToString().Replace("'", "''")),
    new SqlParameter("@C", hybrDct["CG"].ToString().Replace("'", "''")),
    new SqlParameter("@Ts$", hybrDct["TFields"].ToString().Replace("'", "''")),
};
sqlDataAccess.ProcName = "MyStoredProc";
sqlDataAccess.Parameters = parameters;

是否有可能将执行打印出来用于调试目的,而不是找出每个单独的SqlParameter并单独键入它?

谢谢。

可以获取用于调试的存储过程调用

我使用了下面的代码——所有的东西都经过这个并被记录下来——你懂的。

/// <summary>
/// Executes a stored procedure with no return.
/// </summary>
/// <returns>The number of records affected by stored proc.</returns>
public static int ExecuteStoredProc(string storedProcName, params SqlParameter[] parameters)
{        
    StringBuilder callDefinition = new StringBuilder();
    callDefinition.Append(string.Format("ExecuteStoredProc: {0} (", storedProcName));
    for (int i = 0; i < parameters.Count(); i++)
    {
        callDefinition.Append(string.Format("{0}={1}", parameters[i].ParameterName, parameters[i].Value));
        if (i < parameters.Count - 1)
        {
            callDefinition.Append(",");
        }
    }
    callDefinition.Append(")";
    log.Debug(callDefinition.ToString());
    using (var ctx = ConnectionManager<SqlConnection>.GetManager(ConnectionProfile.ConnectionName))
    {
        using (SqlCommand command = new SqlCommand(storedProcName, ctx.Connection))
        {
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandTimeout = 1000;
            foreach (SqlParameter parameter in parameters)
            {
                command.Parameters.Add(parameter);
                //log your param here
            }
            return command.ExecuteNonQuery();
        }
    }
}
/// <summary>
/// Executes a query and returns a dataset
/// </summary>
public static DataSet ExecuteQueryReturnDataSet(string query, params SqlParameter[] parameters)
{
    try
    {
        //implement the parameter logging here as in the above code sample as well
        log.Debug("Executing ExecuteQueryReturnDataSet() calling query " + query);
        using (var ctx = ConnectionManager<SqlConnection>.GetManager(ConnectionProfile.ConnectionName))
        {
            using (SqlCommand command = new SqlCommand(query, ctx.Connection))
            {
                command.CommandType = System.Data.CommandType.Text;
                command.CommandTimeout = 1000;
                foreach (SqlParameter parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }
                using (SqlDataAdapter adapter = new SqlDataAdapter(command))
                {
                    DataSet dataSet = new DataSet();
                    adapter.Fill(dataSet);
                    return dataSet;
                }
            }
        }
    }
    catch (Exception ex)
    {
        log.Error(ex);
        throw;
    }
}

我通常运行SQL Server Profiler(假设这是您的数据库),并可以从日志中复制完整的查询。

不幸的是,SqlClient(我假设您正在使用它来实现SqlDataAccess,我也假设它是您自己的数据访问层)不直接暴露发送给SQL Server的命令。我通常在数据访问层中做的是将所有命令以一种可以在查询窗口中执行的格式记录下来。