Subsonic 3 및 ActiveRecord는 MySQL 저장 프로 시저를 생성하지 않습니다
-
19-09-2019 - |
문제
포함 된 T4 템플릿 (또는 그 문제에 대한 SVN 트렁크의 템플릿)은 MySQL에 대한 SP를 생성하는 것만으로도 STREDERPOCEDURES를 실행할 때 MySQL.ttinclude와 함께 클릭 할 때 "컴파일 변환 : 이름"오류를 얻습니다. getsps는 현재 상황에 존재하지 않습니다. "
getsps는 SQLServer에 대해 정의되어 있으며 누군가가 Oracle에 대해 자신의 글을 썼다는 것을 알았지 만, 적절한 getsps ()-메소드가 MySQL에 대해 어떻게 보일지 전혀 알 수 있습니까?
개인적으로 나는 내 자신의 sps를 실행할 수 없다면 정말 기능적이라고 생각하지 않습니다 :/
해결책
나는 버전 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>
. 코드는 그 후에 작동했다 ;-)
Craig의 답변에 따라 목록을 입력 된 목록으로 변경했으며 또한 제거해야했습니다. var result=new List();
~로부터 GetSPList()
코드 블록. 건배
제휴하지 않습니다 StackOverflow