我有很多存储过程。 为了使用它们,我使用静态方法创建一个静态类,如下所示:
public class DBHandler
{
private static Database db = DatabaseFactory.CreateDatabase("db");
public static DataTable GetItems(long filterId)
{
DbCommand command = db.GetStoredProcCommand("dbo.P_GetItems");
db.AddInParameter(command, "@filter_id", DbType.Int64, filterId);
IDataReader reader = db.ExecuteReader(command);
DataTable dt= new DataTable();
dt.Load(reader, LoadOption.OverwriteChanges);
reader.Close();
return dt;
}
.
.
.
.
}
正如我写的,我有很多存储过程,重复这段代码很烦人。 有没有更好的方法来调用存储过程?
答案 0 :(得分:1)
您可以使用命令行实用程序sqlmetal.exe
自动生成可在简单LINQ查询中使用的数据上下文代码。
答案 1 :(得分:1)
查看各种DAL。我们有一个自行开发的解决方案,可以帮助我们为连接,命令和读取器对象包装IDisposable请求。还简化了参数传递和转换。但这不是火箭手术 - 我确信那里有很多选择。
答案 2 :(得分:0)
我喜欢这样的事情:
public static IEnumerable<IDataRecord> SqlRetrieve(string ConnectionString, string StoredProcName, Action<SqlCommand> addParameters)
{
using (SqlConnection cn = new SqlConnection(ConnectionString))
using (SqlCommand cmd = new SqlCommand(StoredProcName, cn))
{
cn.Open();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
if (addParameters != null)
{
addParameters(cmd);
}
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
yield return rdr;
}
}
}
你在这里得到的是一个可重复使用的枚举器(你可以改变它来返回一个表),它需要一个委托来提供参数。
在实际使用中,它看起来像这样:
foreach (var dr in
SqlRetrieve(cn, sp,
delegate (SqlCommand cmd) {
cmd.Parameters.Add("@paramname", System.Data.SqlDbType.Int).Value = someint;
}
)
) {
}
所以你不是重复所有相同的代码,只是参数部分。在您的情况下,如果您总是返回DataTables而不需要在DataReader循环中获取大量代码,那么代码可能会更简单。