如何使用存储过程?

时间:2011-01-04 14:45:58

标签: c# sql-server stored-procedures

我有很多存储过程。 为了使用它们,我使用静态方法创建一个静态类,如下所示:

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

正如我写的,我有很多存储过程,重复这段代码很烦人。 有没有更好的方法来调用存储过程?

3 个答案:

答案 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循环中获取大量代码,那么代码可能会更简单。