使用mvc-mini-profiler和ADO.NET SqlConnection

时间:2011-06-27 19:10:57

标签: sql-server ado.net mvc-mini-profiler

我正在尝试使用(真棒)mvc-mini-profiler和一些预先存在的SqlConnection存储过程代码(我们不使用EF或L2S,只使用ADO.NET到SQL Server 2008)。我正在寻找有关如何将继承的ProfiledDb类型集成到此类代码中的一些指导。

var con = new SqlConnection("connectionstring");  
var cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.CommandText = "SP_STORED_PROCEDURE_NAME";
cmd.Paramters.Add("recordsetid",SqlDbType.UniqueIdentifier).Value = recordsetid;
var dSet = new DataSet();
var da = new SqlDataAdapter(cmd);
da.fill(dSet);
<parse DataSet>

对于我们遗留的ADO.NET用户来说,任何帮助都会很棒,因为从表面上看,SQL探查器应该适用于这种情况

2 个答案:

答案 0 :(得分:4)

您需要做的是完成连接并使用DbConnection CreateCommand工厂。

与pass params类似,您将需要使用基本接口方法,并避免使用SqlParameter之类的东西,因为它没有被包装。

所以:

var cnn = MvcMiniProfiler.Data.ProfiledDbConnection.Get(new SqlConnection(str));
var cmd = cnn.CreateCommand();
var param = cmd.CreateParameter(); 
...

我还没有测试DataSet和DataAdapter,老实说,我现在使用Dapper来处理这类东西,因为它不那么冗长。如果播放,请务必报告Google代码。

答案 1 :(得分:3)

我有类似的情况,我们所有的SQL都在存储过程中,我们只需要调用它们的ADO.NET代码。我也有一个我很满意的数据访问层,所以不喜欢只是为了容纳MiniProfiler而重写它的块。

所以我解决的妥协是使用围绕过程调用的标准MiniProfiler.Step()调用。在我的情况下,所有对ExecuteReader()等的调用都是基类的一部分是有帮助的,所以我知道所有的SqlCommands都是在几个基本方法中执行的,因此很容易将我现有的代码更改为类似于:

protected SqlDataReader ExecuteReader()
{
    SqlDataReader reader = null;

    // sqlComm is a member of a base class which this method is part of. I also 
    // happen to know that sqlComm.CommandText will always refer to a stored
    // procedure name so it makes it easy to view in the results.
    using (MiniProfiler.Current.Step(sqlComm.CommandText))
    {
        try
        {
            sqlConn.Open();
            reader = sqlComm.ExecuteReader();
        }
        catch (SqlException exception)
        {
            sqlConn.Close();
            // Error handling removed for brevity...
        } 
    }

    return reader;
}

我确信这不如Sam的答案那么好,因为我确定结果选项卡中会遗漏一些细节,但它对我来说很有效,现在只需很少的更改即可分析数据库调用数据访问代码结构。