2

付属のT4テンプレート(またはSVNトランクのもの)は、MySQL用のSPの生成をスキップしているようです... StoredProcedures.ttincludeをMySQL.ttinclude、私はエラー "コンパイル変換:名前 'GetSPs'は現在のコンテキストに存在しません"。Subsonic 3とActiverecordがMySQLストアドプロシージャを生成していない

GetSPsはSQLServer用に定義されており、誰かが独自にOracle用に書いたことを知っていましたが、誰かが正しいGetSPs()メソッドがMySQLのように見えるかどうかを知りましたか?

個人的に私は私は自分のSPを実行することができない限り、それは本当に機能的だとは思わない:/

答えて

2

私はバージョン2からのコードを少し周りティンカー製とではほとんどのコード(おそらく100%を思い付いすべての状況)私のためのトリックでした。これをMySQL.ttincludeに入れて、ストアドプロシージャを生成させます。楽しい!


string[] GetSPList() 
{ 
    var result=new List(); 
    const string sql = "SELECT routine_name FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = ?databaseName"; 
    StringBuilder sList = new StringBuilder(); 

    using(conn=new MySqlConnection(ConnectionString)) 
    { 
     MySqlCommand cmd = new MySqlCommand(sql, conn); 

     cmd.Parameters.AddWithValue("?databaseName", DatabaseName); 
     conn.Open(); 
     using(IDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
     { 
      bool isFirst = true; 
      while(rdr.Read()) 
      { 
       if(!isFirst) 
        sList.Append('|'); 
       isFirst = false; 
       sList.Append(rdr[0]); 
      } 
      rdr.Close(); 
     } 
    } 
    return sList.ToString().Split(new char[] {'|'}, StringSplitOptions.RemoveEmptyEntries); 
} 

List GetSPParams(string spName) 
{ 
    var result=new List(); 
    MySqlCommand cmd = new MySqlCommand(); 
    using(conn=new MySqlConnection(ConnectionString)) 
    { 
     conn.Open(); 
     cmd.Connection = conn; 
     cmd.CommandText = spName; 
     cmd.CommandType = CommandType.StoredProcedure; 

     try 
     { 
      MySqlCommandBuilder.DeriveParameters(cmd); 
     } 
     catch 
     { 
     } 

     if(cmd.Parameters.Count > 0) 
     { 
      foreach(MySqlParameter param in cmd.Parameters) 
      { 
       SPParam p = new SPParam(); 
       p.SysType = GetSysType(param.MySqlDbType.ToString()); 
       p.DbType = param.DbType.ToString(); 
       p.Name = param.ParameterName; 
       p.CleanName=CleanUp(p.Name); 
       result.Add(p); 
      } 
     } 
     conn.Close(); 
    } 

    return result; 
} 

List GetSPs(){ 
    var result=new List(); 
    string[] spNames = GetSPList(); 

    foreach(string spName in spNames){ 
     var sp=new SP(); 
     sp.Name=spName; 
     sp.CleanName=CleanUp(sp.Name); 
     sp.Parameters=GetSPParams(sp.Name); 
     result.Add(sp);   
    } 

    return result; 
} 
+0

Githubでお借りしてください –

1

私はこのコードをMySQL.ttincludeに追加して実行していますが、汎用リストを型付きリストに変更する必要がありました。例:List<SPParam>およびList<SP>。それ以降のコードは役に立ちました;-)

0

クレイグの答えによれば、リストを型付きリストに変更し、GetSPList()コードブロックからvar result=new List();も削除する必要がありました。乾杯の場合

関連する問題