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 分析器似乎应该适用于这种情况

4

2 回答 2

4

您需要做的是结束您的连接并使用 DbConnectionCreateCommand工厂。

与传递参数类似,您将需要使用基本接口方法,并避免诸如SqlParameter未包装之类的东西。

所以:

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

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

于 2011-06-28T12:19:50.307 回答
3

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

所以我决定的妥协是MiniProfiler.Step()在过程调用周围使用标准调用。在我的情况下,对ExecuteReader()et al 的所有调用都是基类的一部分,因此我知道所有 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 的回答好,因为我确信结果选项卡中会丢失一些细节,但它现在足以让我分析数据库调用,只需对我的数据访问代码进行很少的更改结构体。

于 2012-04-25T10:57:06.670 回答