3亜音速とActiveRecordのは、MySQLのストアドプロシージャを生成していません
-
19-09-2019 - |
質問
ちょうどMySQLののSPを生成するスキップ含まT4テンプレート(またはそのことについてはSVNのトランク内の1つの)ようです... 一緒にMySQL.ttincludeとStoredProcedures.ttincludeを実行しているとき、私は「変革のコンパイル:名 『GetSPsは、』現在のコンテキスト内に存在しない」エラーが発生します。
。GetSPsは、SQLServerのために定義されていると私は誰かがOracleのための彼自身を書いたことを見たが、誰がどのように適切なGetSPs(手掛かりを持っていない) - ?メソッドは、MySQL用のようになります。
私は自分のSPを実行することができない限り、個人的に私はそれが本当に機能的だとは思わない:/
解決
私は、バージョン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;
}
他のヒント
私は、しかし、私は、一般的なリストのリストを入力するように変更しなければならなかった私のMySQL.ttincludeに追加して実行するには、このコードを得ました。例えば:List<SPParam>
とList<SP>
。コードは、しかし後に働いた; - )
クレイグの答えを1として、私は、入力されたリストにリストを変更し、私はまた、var result=new List();
コードブロックからGetSPList()
を除去するために必要。乾杯
所属していません StackOverflow