2009-09-28 2 views
0

Subsonic3에서 linq 템플릿을 사용하여 MySQL 저장 프로 시저를 실행하려고했습니다. 저장 프로 시저 참조 클래스를 생성 한 것으로 보이는 MySQL.ttinclude 파일에 몇 가지 함수를 추가했습니다. Subsonic3 작업Subsonic3, linq, MySQL 및 저장 프로 시저로 성공한 사람이 있습니까?

public DataSet SPTotalCallsByHour(int period) 
    { 
     rt.rtDB ee = new rt.rtDB(); 
     StoredProcedure sp = ee.Totals_By_Hour(period.ToString()); 
     sp.Execute(); 

     return (DataSet)sp.Output; 
    } 

사람이 MySQL은 저장 가지고 절차 : 내가 코드를 실행하고 나는 것 같다 저장 프로 시저를 호출 할 때 항상 NULL 결과를 얻을? 그렇다면 어떻게 일하게했는지 설명해주십시오.

ttinclude 파일을 subsonic 3 릴리스에서 곧바로 사용 했습니까?

List<SPParam> GetSPParams(string spName){ 
var result=new List<SPParam>(); 
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<SP> GetSPs(){ 
var result=new List<SP>(); 
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과 아음속 작동하는 저장 프로 시저를 가지고 적이없는

+0

왜 비어있는 catch 블록이 있습니까? 그것은 거의 결코 좋지 않습니다. –

+0

나는 게으르다. 아직이 클래스를 완성하지 못했다. 나중에 일반적으로 예외 처리를 추가한다. –

답변

0

:

내가 MySQL.ttinclude 파일에 추가 된 두 가지 기능이 있습니다 ,하지만 나도 열심히 노력 havent. 당신이 인라인 SQL보다 더 나은 것을 가지고 있다는 나의 추론.

나는 스토어드 프로 시저가 데이터베이스 코드 (SQL로드)를 여기 저기에 흩어지게하는데 사용되었다고 생각한다. 그래서 프로그래머는 2 개의 관심사를 분리하고 그것을 만들기 위해 스토어드 프로 시저를 사용할 것이다. 업데이트/변경/수리가 더 쉽습니다.

지금 아음속이나 다른 종류의 DAL과 엔티티를 사용하는 경우 SQL 문을 쓸 필요가 없습니다. 코드를 작성하면됩니다. subsonic, linq 등 무엇을 해야할지 알고 번역하십시오. 너를 위해서.

데이터베이스에 문제가있는 경우 저장 프로 시저가 실제로 필요하지 않으므로 TT 파일을 다시 실행하면됩니다.

나머지는 프로그램의 코드입니다. 그래서 아마도 당신이 원하는 대답은 아니지만 저장 프로 시저를 자루에 넣고 아음속과 같은 것을 사용하는 것이 얼마나 재미 있는지를 살피고 데이터베이스에 대해 모두 잊어 버리고 코드에 대해서 생각해보십시오.

+0

좋은 지적. 나는 완전히 동의한다. 나는 누군가 elses db에 데이터 레이어를 만들고 있는데, 그는 객체 코드에서 재현 할 시간이 없다고 쓰여진 무거운 저장 프로 시저를 가지고 있었다. 따라서 기존 저장 프로 시저를 실행하는 것이 가장 빠른 옵션이었습니다. –

0

매개 변수없이 SP를 실행하고 출력을 다시 읽으려고 할 때 문제가있었습니다. 너는 this work around을해야만한다.

SubSonic.StoredProcedure sp = SPs.UspNoParamProc(); 
//Stored Procedure command Is Null... ensure command is created 
string dummy = sp.Command.CommandSql; 

rptList.DataSource = sp.GetReader(); 
rptList.DataBind(); 

이 문제가 3.0에 계속 존재하는지 확실하지 않습니다. 그것을 시도해보십시오.

관련 문제