Frage

Es scheint, dass die darin enthaltenen T4-Vorlagen (oder die man im SVN trunk was das betrifft) nur überspringt SPs für MySQL zu erzeugen ... Wenn StoredProcedures.ttinclude zusammen mit MySQL.ttinclude ausgeführt wird, erhalte ich die Fehlermeldung „Kompilieren Transformation: Der Name‚GetSPs‘nicht im aktuellen Kontext nicht vorhanden ist“

.

GetSPs für SQLServer definiert, und ich sah, dass jemand seine eigene für Oracle geschrieben, aber hat jemand eine Ahnung, wie die richtigen GetSPs () - Methode wie für MySQL aussehen sollte

Ich persönlich glaube nicht, dass es wirklich funktionell, wenn ich meine eigene SPs ausführen kann: /

War es hilfreich?

Lösung

ich gebastelt um ein bisschen mit dem Code von Version 2 und kam mit einem kleinen Code auf (wahrscheinlich nicht zu 100% in allen Situationen), die den Trick für mich getan hat. Setzen Sie dieses in MySQL.ttinclude zu Stored Procedures erzeugt zu erhalten. Genießen Sie!


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

Andere Tipps

habe ich diesen Code auszuführen, indem es meinen MySQL.ttinclude jedoch das Hinzufügen ich die generischen List ändern musste Listen eingegeben hat. zB: List<SPParam> und List<SP>. Der Code arbeitete danach obwohl; -)

Wie pro Craigs Antwort, änderte ich die Listen in getippten Listen und ich brauche auch var result=new List(); vom GetSPList() Codeblock zu entfernen. Prost

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top