2

Il semble que les templates T4 inclus (ou celui dans le tronc SVN d'ailleurs) saute juste les SPs de génération pour MySQL ... Lors de l'exécution de StoredProcedures.ttinclude avec MySQL.ttinclude, j'obtiens l'erreur "Compiler la transformation: Le nom 'GetSPs' n'existe pas dans le contexte actuel". GetSprs est défini pour SQLServer et j'ai vu que quelqu'un a écrit le sien pour Oracle, mais quelqu'un a-t-il une idée de la façon dont la méthode GetSPs() devrait ressembler à MySQL?Subsonic 3 et Activerecord ne génèrent pas de procédures stockées MySQL

Personnellement, je ne pense pas qu'il soit vraiment fonctionnel à moins que je peux courir mes SPs:/

Répondre

2

Je bricolé un peu avec le code de la version 2 et je suis venu avec un peu de code (probablement pas 100% en toutes les situations) qui a fait l'affaire pour moi. Mettez ceci dans MySQL.ttinclude pour que les procédures stockées soient générées. Prendre plaisir!


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

Aimerait si vous pouviez fourche/pousser cela à nous à Github! –

1

Je suis arrivé ce code à exécuter en l'ajoutant à mon MySQL.ttinclude mais je devais changer dactylographié les listes de la liste générique. par exemple: List<SPParam> et List<SP>. Le code a fonctionné après cela cependant ;-)

0

Selon la réponse de craig, j'ai changé les listes aux listes tapées et j'ai dû également enlever var result=new List(); du bloc de code GetSPList(). Cheers

Questions connexes