Subsonic 3和Activerecord不生成MySQL存储过程

时间:2009-07-24 13:18:33

标签: mysql activerecord subsonic subsonic3 subsonic-active-record

似乎包含的T4模板(或SVN中继中的模板)只是跳过为MySQL生成SP ... 当与MySQL.ttinclude一起运行StoredProcedures.ttinclude时,我收到错误“编译转换:当前上下文中不存在名称'GetSPs'。”

为SQLServer定义了GetSPs,我看到有人为Oracle编写了自己的,但有没有人知道正确的GetSPs()方法应该如何适用于MySQL?

我个人认为除非我可以运行自己的SP,否则它不会真正起作用:/

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

我通过将其添加到我的MySQL.ttinclude来运行此代码但是我必须将通用List更改为类型列表。例如:List<SPParam>List<SP>。之后代码工作了; - )

答案 2 :(得分:0)

根据克雷格的回答,我将列表更改为键入的列表,我还需要从var result=new List();代码块中删除GetSPList()。干杯