我正在尝试使用(真棒)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探查器应该适用于这种情况
答案 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的答案那么好,因为我确定结果选项卡中会遗漏一些细节,但它对我来说很有效,现在只需很少的更改即可分析数据库调用数据访问代码结构。