必须先关闭与此命令关联的Datareader

时间:2017-02-07 10:19:20

标签: c# angularjs exception asp.net-mvc-5 sqldatareader

我正在使用带有angularjs的mvc-5我有一个类DBFunction.cs,我有一个像

这样的方法
public SqlDataReader ExecuteSP_Reader(string ProcedureName, SqlCommand MyCommand)
        {
            if (con.State == ConnectionState.Closed)
                con.Open();
            MyCommand.CommandType = CommandType.StoredProcedure;
            MyCommand.CommandText = ProcedureName;
            //MyCommand.Connection = (SqlConnection)HttpContext.Current.Application["con"];
            MyCommand.Connection = con;

            SqlDataReader _Reader = MyCommand.ExecuteReader();

            //con.Close();
            return _Reader;
        }

和另一个叫做任务的类

我从类

的方法中获取数据库中的数据
public List<object>getdatabyuser(string UserAutoId=null)
        {
            cmd = new SqlCommand();
            List<object> getdatauser = new List<object>();
            if(!string.IsNullOrEmpty(UserAutoId))
                cmd.Parameters.AddWithValue("@userautoid", UserAutoId);
            SqlDataReader dr;
            dr = dbf.ExecuteSP_Reader("TMS_GETTASKBYUSERNAME", cmd);
            while(dr.Read())
            {
                getdatauser.Add(new
                {
                    TaskName=dr["TaskName"].ToString(),
                    ParentAutoID=dr["ParentAutoID"].ToString(),
                    UserAutoId = dr["UserAutoId"].ToString(),
                    AssignBy=dr["AssignBy"].ToString(),
                    AssignTo=dr["AssignTo"].ToString()
                });
            }
            dr.Close();
            return getdatauser;
        }

并且还有另一层,我使用了一个名为dashboard.asmx的web服务

[WebMethod]
        [ScriptMethod(UseHttpGet = true)]
        public void gettaskbyuser(string UserAutoId)
        {
            var json = "";
            json = js.Serialize(objtask.getdatabyuser(UserAutoId));
            Context.Response.Write(json);
        }

这里我将数据转换为json格式,将数据发送到angularjs的控制器

这是我的控制器

$http.get('/WebServices/dashboard.asmx/gettaskbyuser', {
                params: {
                    UserAutoId: $scope.showparam.UserAutoId
                }
            }).then(function (response) {
                $scope.getdatainmodal = response.data;
            })

数据将在按钮点击时显示,

我有一张桌子

Azhar   4
Das 1
Minesh  1

<td><a href="#" ng-click="showmodal(x)" data-toggle="modal" data-target="#myModal">{{ x.TaskCount }}</a></td>

我的表格中有一个标签,当用户点击该标签时,模式会弹出数据

<table class="table table-bordered table-responsive">
                            <tr class="bg-primary">
                                <td><center><span class="glyphicon glyphicon-edit"></span></center></td>
                                <td>TaskName</td>
                                <td>User Name</td>
                                <td>AssignBy</td>
                                <td>AssignTo</td>
                                <td ng-hide="true">Parent Id</td>
                            </tr>
                            <tr ng-repeat="x in getdatainmodal">
                                <td><center><a href="#" class="btn btn-success">Edit</a></center></td>
                                <td>{{x.TaskName}}</td>
                                <td>{{x.UserAutoId}}</td>
                                <td>{{x.AssignBy}}</td>
                                <td>{{x.AssignTo}}</td>
                                <td ng-hide="true">{{x.ParentAutoID}}</td>
                            </tr>
                        </table>

第一次运行正常,但是当用户第二次再次点击它时,对于其他用户的记录,它显示异常

  

可能未经处理的拒绝:   {“data”:“System.InvalidOperationException:已经打开了   与此命令关联的DataReader必须先关闭。

这段代码有什么问题?

1 个答案:

答案 0 :(得分:0)

  1. 请始终创建新连接。 .NET正在进行连接池化。
  2. 关闭数据读取后连接,读取和处理命令。
  3. 为什么不使用Entity Framework来处理sql注入和东西等安全问题?