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

5

我正在尝试将(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分析器似乎适用于这种情况。


基于下面 Sam 的反馈,我只是简单地实现了 Dapper,将 50 行代码缩减到了约 20 行,并显著降低了复杂度。我能够通过使用 DbDataReaderDbType.Guid 参数集合来为 SqlDataReaders 实现一个解决方案(用 System.Data.Common 等同物替换所有特定于 MS SQL 的内容)。正如 Sam 所提到的,它更加冗长,你最终会写很多样板代码,而且你可能会更好地使用 Dapper 来实现,而不是试图将其塞入现有的 SqlDataAdapter 中。 - TodK
2个回答

4
你需要做的是封装你的连接并使用 DbConnection 的 CreateCommand 工厂。同样地,要传递参数,你需要使用基本接口方法,避免使用未封装的 SqlParameter 等内容。因此:
var cnn = MvcMiniProfiler.Data.ProfiledDbConnection.Get(new SqlConnection(str));
var cmd = cnn.CreateCommand();
var param = cmd.CreateParameter(); 
...

我没有测试过DataSets和DataAdapters,老实说,这些天我使用Dapper来处理这类东西,因为它更加简洁。如果出现问题,请务必在Google code上报告。


说实话,Dapper更容易。谢谢! - TodK
还有一个ProfiledDbDataAdapter类,您可以使用它来包装带有分析功能的SqlDataAdapter。请参见https://dev59.com/tGTWa4cB1Zd3GeqPDG7R#13793409 - Rory

3
我有一个类似的情况,我们所有的SQL都在存储过程中,我们只需使用ADO.NET代码调用它们。我还有一个数据访问层,我对它感到满意,因此不想重写大块代码来适应MiniProfiler。
所以我采取了一个妥协方案,就是在过程调用周围使用标准的MiniProfiler.Step()调用。在我的情况下,这有所帮助,因为所有对ExecuteReader()等的调用都是作为基类的一部分的,所以我知道所有的SqlCommand都在几个基本方法内执行,所以很容易将现有代码更改为类似于这样的形式:
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的好,因为在结果选项卡中可能会缺少一些细节,但是对于我来说,它已经足够好了,可以用很少的更改来分析数据库调用,而不影响我的数据访问代码结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接