【问题标题】:Datareader associated with this command must be closed first必须先关闭与此命令关联的 Datareader
【发布时间】:2017-02-07 18:27:29
【问题描述】:

我正在使用带有 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;
        }

还有一个叫task的类

我正在通过类的方法从数据库中获取数据

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的网络服务

[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: 已经有一个打开的 与此 Command 关联的 DataReader,必须先关闭。

这段代码有什么问题?

【问题讨论】:

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


【解决方案1】:
  1. 请始终创建一个新连接。 .NET 正在做连接池。
  2. 读取数据后关闭Connection、Reader和Dispose命令。
  3. 为什么不使用实体框架来处理诸如 sql 注入之类的安全问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2015-04-02
    • 2011-08-29
    • 1970-01-01
    相关资源
    最近更新 更多