我一直在尝试使用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;
}
答案 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中。可以尝试一下。