Pregunta

Parece que las plantillas T4 incluidos (o el que está en el tronco SVN para el caso) sólo se salta los SP electrógenos para MySQL ... Cuando se ejecuta StoredProcedures.ttinclude junto con MySQL.ttinclude, me sale el error "Compilación de transformación: no existe el nombre de 'GetSPs' en el contexto actual"

.

GetSPs se define para SQL Server y vi que alguien escribió su propia para Oracle, pero ¿alguien tiene una idea de cómo los GetSPs apropiadas (?) - método debe parecerse para MySQL

En lo personal no creo que es realmente funcional a menos que pueda ejecutar mis propios SP: /

¿Fue útil?

Solución

Me tinkered un poco con el código de la versión 2 y se acercó con un poco de código (probablemente no es el 100% en todas las situaciones) que hizo el truco para mí. Poner esto en MySQL.ttinclude para obtener procedimientos almacenados generados. Disfrutar!


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;
}

Otros consejos

Tengo este código se ejecute mediante la adición a mi MySQL.ttinclude sin embargo tuve que cambiar a las listas escritas de la lista genérica. por ejemplo: List<SPParam> y List<SP>. El código trabajó después de eso sin embargo; -)

De acuerdo con la respuesta de Craig, he cambiado las listas de listas escritas y también que necesitaba para eliminar var result=new List(); desde el bloque de código GetSPList(). Saludos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top