2012-03-01 3 views

ответ

1

Я никогда не найти действительно отличный способ сделать это, но я нашел то, что работал. Я не мог подклассифицировать класс 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; 
     } 

Поскольку соединения больше не SqlConnection так это вызвало ошибку произнесения в некоторых из существующего кода. Чтобы исправить это, я изменил метод «ExecuteDataSet», чтобы использовать соединение из области действия вместо фабрики.

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», чтобы использовать область подключения.

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.

Надеюсь, что это поможет кому-то еще.

Смежные вопросы