【问题标题】:Subsonic 3 and Activerecord isn't generating MySQL Stored ProceduresSubsonic 3 和 Activerecord 不生成 MySQL 存储过程
【发布时间】:2009-07-24 13:18:32
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我对版本 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;
    }
    

    【讨论】:

    • 如果你能在 Github 上 fork/push 给我们,我会很高兴的!
    【解决方案2】:

    我通过将它添加到我的 MySQL.ttinclude 来运行此代码,但是我必须将通用列表更改为类型列表。例如:List<SPParam>List<SP>。代码在那之后仍然有效;-)

    【讨论】:

      【解决方案3】:

      根据 craig 的回答,我将列表更改为类型化列表,并且我还需要从 GetSPList() 代码块中删除 var result=new List();。干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多