2

Кажется, что включенные шаблоны T4 (или тот, что в SVN-магистрале, если на то пошло) просто пропускает создание SP для MySQL ... При запуске StoredProcedures.ttinclude вместе с MySQL.ttinclude, я получаю сообщение об ошибке «Компиляция преобразования: имя« GetSPs »не существует в текущем контексте».Subsonic 3 и Activerecord не генерируют хранимые процедуры MySQL

GetSPs определен для SQLServer, и я видел, что кто-то написал его для Oracle, но кто-нибудь знает, как должен выглядеть правильный метод GetSPs() для MySQL?

Лично я не думаю, что это на самом деле функционал, если я не могу запустить свой собственный ПЛов:/

ответ

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

В соответствии с ответом Craig я изменил список набранные списки, и мне также нужно было удалить var result=new List(); из блока кода GetSPList(). Cheers

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