有没有人在Subsonic3,linq,MySQL和存储过程方面取得任何成功

时间:2009-09-28 12:45:13

标签: mysql linq stored-procedures subsonic3

我一直在尝试使用Subsonic3中的linq模板运行MySQL存储过程。我在MySQL.ttinclude文件中添加了一些函数,这些函数似乎生成了存储过程引用类。但是当我运行代码并调用存储过程时,我似乎总是得到NULL结果:

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

有没有人使用Subsonic3的MySQL存储过程?如果是这样,请解释一下你是如何让他们工作的?

您是否直接使用亚音速3版本中的ttinclude文件?

这是我添加到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;

}

2 个答案:

答案 0 :(得分:0)

我从未有过为mysql和亚音速工作的存储过程,但我也没有尝试过这么努力。我的理由是你有比内联sql更好的东西。

我认为我代表大众说存储过程用于绕过应用程序内部的数据库代码(sql加载),点缀在这里 所以程序员会使用存储过程来分离这两个问题,并使其更容易更新/更改/修复。

现在如果您使用亚音速或任何其他类型的DAL和实体,那么您不需要编写sql语句,您只需编写代码.... subsonic,linq等知道如何处理它并将其转换为你。

所以你真的不需要存储过程,如果你的数据库有问题,你只需再次运行你的TT文件。

其余的是代码,你的程序。所以也许这不是你想要的答案,但是要解决存储过程,并利用像亚音速这样的东西是多么有趣,并且完全忘记你的数据库,只考虑代码。

答案 1 :(得分: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中。可以尝试一下。