gpt4 book ai didi

subsonic3 - 使用MvcMiniProfiler分析Subsonic SQL

转载 作者:行者123 更新时间:2023-12-03 07:56:05 25 4
gpt4 key购买 nike

有人用MvcMiniProfiler分析他们的Subsonic sql查询是否成功?我似乎找不到在Subsonic中确切挂接到SqlConnection创建过程的位置。


http://code.google.com/p/mvc-mini-profiler/#Database_profiling
http://subsonicproject.com/

最佳答案

我从来没有找到实现这一目标的好方法,但是我确实找到了可行的方法。我不能继承SubSonic.DataProviders.DbDataProvider类,因为构造函数是“内部”的(不好用)。因此,我只是将源代码复制到我的项目中,并进行了一些更改。

必须更改的主要代码行在“ CreateConnection”方法中,它需要返回一个ProfiledDbConnection。

public DbConnection CreateConnection(string connectionString)
{
DbConnection conn = Factory.CreateConnection();
conn.ConnectionString = connectionString;
if(conn.State == ConnectionState.Closed) conn.Open();
return conn;
}


由于Connection不再是SqlConnection,因此这在某些现有代码中引起了转换错误。为了解决这些问题,我更改了“ ExecuteDataSet”方法,以从范围而不是工厂使用Connection。

public DataSet ExecuteDataSet(QueryCommand qry)
{
if (Log != null)
Log.WriteLine(qry.CommandSql);
#if DEBUG
//Console.Error.WriteLine("ExecuteDataSet(QueryCommand): {0}.", qry.CommandSql);
#endif
using (AutomaticConnectionScope scope = new AutomaticConnectionScope(this))
{
DbCommand cmd = scope.Connection.CreateCommand();
cmd.CommandText = qry.CommandSql;
cmd.CommandType = qry.CommandType;
DataSet ds = new DataSet();
cmd.Connection = scope.Connection;
AddParams(cmd, qry);
DbDataAdapter da = Factory.CreateDataAdapter();
da.SelectCommand = cmd;
da.Fill(ds);

return ds;
}
}


我还更改了“ ExecuteScalar”方法以使用范围Connection。

public object ExecuteScalar(QueryCommand qry)
{
if (Log != null)
Log.WriteLine(qry.CommandSql);

#if DEBUG
//Console.Error.WriteLine("ExecuteScalar(QueryCommand): {0}.", qry.CommandSql);
//foreach (var param in qry.Parameters) {
// if(param.ParameterValue==null)
// Console.Error.WriteLine(param.ParameterName + " = NULL");
// else
// Console.Error.WriteLine(param.ParameterName + " = " + param.ParameterValue.ToString());
//}
#endif

object result;
using (AutomaticConnectionScope automaticConnectionScope = new AutomaticConnectionScope(this))
{
DbCommand cmd = automaticConnectionScope.Connection.CreateCommand();
cmd.Connection = automaticConnectionScope.Connection;
cmd.CommandType = qry.CommandType;
cmd.CommandText = qry.CommandSql;
AddParams(cmd, qry);
result = cmd.ExecuteScalar();
}

return result;
}


现在一切似乎都正常了。我当前正在使用IOC来确定数据库类本身是使用此ProfilingDbDataProvider还是现有的DbDataProvider。我在Context类的代码生成中对此进行了更改,以从IOC中提取而不是使用ProviderFactory。

希望对别人有帮助。

关于subsonic3 - 使用MvcMiniProfiler分析Subsonic SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9524453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com