2

含まれているT4テンプレート(または、さらに言えばSVNトランク内のテンプレート)は、MySQLのSPの生成をスキップしているようです... StoredProcedures.ttincludeをMySQL.ttincludeと一緒に実行すると、「変換のコンパイル:名前」というエラーが発生します。 GetSPは現在のコンテキストに存在しません。」

GetSPsはSQLServer用に定義されており、誰かがOracle用に独自に作成したのを見ましたが、MySQL用の適切なGetSPs()メソッドがどのように見えるかについての手がかりはありますか?

個人的には、自分のSPを実行できない限り、実際には機能していないと思います:/

4

3 に答える 3

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;
}
于 2009-07-24T16:11:56.387 に答える
1

このコードを MySQL.ttinclude に追加して実行するようにしましたが、一般的なリストを型付きリストに変更する必要がありました。例:List<SPParam>List<SP>. その後、コードは機能しました;-)

于 2009-09-24T14:20:54.253 に答える
0

クレイグの答えに従って、リストを型付きリストに変更し、コードブロックvar result=new List(); からも削除する必要がありました。GetSPList()乾杯

于 2011-02-21T12:36:41.363 に答える