2009-09-28 5 views
0

J'ai essayé d'exécuter les procédures stockées MySQL avec les templates linq dans Subsonic3. J'ai ajouté quelques fonctions au fichier MySQL.ttinclude qui semble avoir généré les classes de référence de la procédure stockée. Cependant quand je lance le code et appelle les procédures stockées je semblons toujours obtenir des résultats NULL:Est-ce que quelqu'un a eu du succès avec Subsonic3, linq, MySQL et Stored Procedures

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; 
    } 

Quelqu'un at-il des procédures stockées MySQL travaillant avec Subsonic3? Si oui, pouvez-vous expliquer comment vous les avez fait fonctionner?

Avez-vous utilisé les fichiers ttinclude directement de la version subsonic 3?

Ce sont les deux fonctions que j'ai ajoutées au fichier MySQL.ttinclude:

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; 

}

+0

Pourquoi avez-vous un bloc de capture vide? Ce n'est presque jamais bon. –

+0

J'étais juste paresseux ... je n'aurais pas encore terminé cette classe .. J'ajoute généralement mon traitement d'exception plus tard. –

Répondre

0

je n'ai jamais eu des procédures stockées pour travailler pour mysql et subsonique , mais je n'ai pas essayé si dur non plus. mon raisonnement derrière que vous avez quelque chose de mieux que inline sql. Je pense que je parle pour les masses que les procédures stockées ont été utilisées pour contourner le code de la base de données (charges de sql) dans l'application, ici afin que les programmeurs utilisent des procédures stockées pour séparer les 2 préoccupations et le rendre plus facile à mettre à jour/changer/réparer. Maintenant, si vous utilisez subsonic ou tout autre type de DAL et d'entités alors vous n'avez pas besoin d'écrire des instructions sql en tant que telles, vous écrivez juste le code .... subsonic, linq etc sachez quoi faire avec et traduisez-le pour toi. Donc, vous n'avez pas vraiment besoin de procédures stockées, si votre base de données a un problème, vous exécutez simplement vos fichiers TT à nouveau.

le reste est le code, votre programme. alors peut-être que ce n'est pas la réponse que vous voudriez, mais limitez les procédures stockées et faites usage de combien il est amusant d'utiliser quelque chose comme subsonique et oubliez tout sur votre base de données et pensez simplement au code.

+0

Bon point. Je suis tout à fait d'accord .. je suis en train de construire une couche de données sur quelqu'un elses db et il a écrit de lourdes procédures stockées que je n'ai pas eu le temps de reproduire dans le code objet. L'exécution de ses procédures stockées existantes était donc l'option la plus rapide pour moi. –

0

J'ai rencontré un problème lors de l'exécution d'un SP sans paramètre et en essayant de relire la sortie. Il semble que vous deviez faire 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(); 

Vous ne savez pas si ce problème persiste ou non dans la version 3.0. Pourrait l'essayer.

Questions connexes