超时通过SqlConnection调用存储过程

时间:2015-08-18 14:34:44

标签: c# sql-server-2012 ado.net sqlconnection

我有两个独立的数据库,我使用linq和EF6连接。我还运行了一些存储过程。出于速度原因,我使用旧学校的方式运行这些方法:

    public static DataSet ExecuteStoredProcedure(object db, string storedProcedureName, IEnumerable<SqlParameter> parameters)
    {
        string connectionString="";

        if (db is AriaEntities)
        {
            connectionString = ((AriaEntities)db).Database.Connection.ConnectionString;
        }
        else if (db is AMSEntities)
        {
            connectionString = ((AMSEntities)db).Database.Connection.ConnectionString;
        }

        var ds = new DataSet();

        using (var conn = new SqlConnection(connectionString))
        {
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = storedProcedureName;
                cmd.CommandType = CommandType.StoredProcedure;
                foreach (var parameter in parameters)
                {
                    cmd.Parameters.Add(parameter);
                }

                using (var adapter = new SqlDataAdapter(cmd))
                {
                    adapter.Fill(ds);
                }
            }

            conn.Close();
        }

        return ds;
    }

我正在传递我正在使用的数据库连接。

我遇到的问题是,当我尝试在AMSEntities数据库上下文中运行存储过程时,我得到一个超时,即使在SQL Server中手动运行该过程本身只需要一秒钟就可以运行。我对存储过程有执行权限,我可以使用linq访问datacontext中的表。

为什么会发生超时消息?

罗布

2 个答案:

答案 0 :(得分:1)

尝试添加conn.Open(); DbContext仅在SubmitChanges或枚举查询时打开连接。

答案 1 :(得分:0)

如上面的注释所示,结果是存储过程中导致查询执行缓慢的链接服务器的隐藏引用。幸运的是,我可以删除它,因为它原来是不再需要的遗留代码。