Subsonic 3 и Activerecord не генерируют хранимые процедуры MySQL - PullRequest
2 голосов
/ 24 июля 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 24 июля 2009

Я немного повозился с кодом из версии 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;
}
1 голос
/ 24 сентября 2009

Я получил этот код для запуска, добавив его в свой MySQL.ttinclude, однако мне пришлось изменить общий список на типизированные списки. например: List<SPParam> и List<SP>. Код работал после этого, хотя; -)

0 голосов
/ 21 февраля 2011

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

...