2012-03-01 12 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; 
     } 

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クラスのコード生成でこれを変更して、ProviderFactoryを使用する代わりにIOCから引き出しました。

他人を助ける希望。

関連する問題