Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用存储过程?_C#_Sql Server_Stored Procedures - Fatal编程技术网

C# 如何使用存储过程?

C# 如何使用存储过程?,c#,sql-server,stored-procedures,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

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

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;
    }
    .
    .
    .
    .
}
正如我写的,我有很多存储过程,重复这段代码很烦人。
有没有更好的方法调用存储过程?

您可以使用命令行实用程序自动生成数据上下文代码,用于简单的LINQ查询。

查看各种DAL。我们有一个自主开发的解决方案,可以帮助我们总结连接、命令和读卡器对象的IDisposable需求。还简化了参数传递和转换。但这不是火箭手术——我相信有很多选择。

我喜欢这样的事情:

    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;
                    }
        )
) {
}
因此,您没有重复所有相同的代码,只是重复参数部分。在您的例子中,如果您总是返回数据表,而不需要在DataReader循环中获取大量代码,那么代码可能会变得更简单