报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
在这个函数报错:UpdateTable(JewelleryDataSet changedData, String tableName, DateTime lastAccessed)代码如下:
public int UpdateTable(JewelleryDataSet changedData, string tableName, DateTime lastAccessed)
        {
            int ret = 0;            string SqlInfo = "" ;                        try
            {
                if (changedData != null)
                {
               
                    switch (tableName)
                    {
                        case "AcceptRegister":
                            ret = acceptRegisterTableAdapter.Update(changedData);
                            break;                        case "BaseInfo":
                            ret = baseInfoTableAdapter.Update(changedData);                            
                            break;                        case "Base":
                            ret = baseTableAdapter.Update(changedData);
                            break;                        case "Branch":
                            //Debugger.Break();
                            ret = branchTableAdapter.Update(changedData);
                            break;                        case "CheckResult":                           
                            ret = checkResultTableAdapter.Update(changedData);                           
                            break;                        case "Code":
                            ret = codeTableAdapter.Update(changedData);
                            break;                        case "CustomerInfo":
                            ret = customerInfoTableAdapter.Update(changedData);
                            break;                        case "DataMaintain":
                            ret = dataMaintainTableAdapter.Update(changedData);
                            break;                        case "DateInfo":
                            ret = dataInfoTableAdapter.Update(changedData);
                            break;                        case "GroupInfo":
                            ret = groupInfoTableAdapter.Update(changedData);                            
                            break;                        case "Print":
                            ret = printTableAdapter.Update(changedData);
                            break;                        case "Role":
                            ret = roleTableAdapter.Update(changedData);
                            break;                        case "User":
                            ret = userTableAdapter.Update(changedData);
                            break;                        case "UserRole":
                            ret = userRoleTableAdapter.Update(changedData);
                            break;                        case "Template":
                            ret = templateTableAdapter.Update(changedData);
                            break;                        case "StoneValue":
                            ret = StoneValueTableAdapter.Update(changedData);
                            break;                        case "StonePram":
                            ret = StonePramTableAdapter.Update(changedData);
                            break;                        case "PictrueArgs":
                            ret = pictrueArgsTableAdapter.Update(changedData);
                            break;                        case "DataUpdateInfo":
                            ret = dataUpdateInfoTableAdapter.Update(changedData);
                            break;
                    }
                    
                    
                }
            }
            catch (SqlException sqlEx)
            {                
                log.Debug(string.Format("A problem was encounted updating Table: \n{0}", sqlEx.ToString()));
                throw new SoapException("写入数据库出错", SoapException.ServerFaultCode, "Database");                
            }
            catch (Exception ex)
            {                
                log.Debug("行数量" + changedData.CheckResult.Rows.Count.ToString()
                                + "行状态:" + changedData.CheckResult.Rows[0].RowState.ToString()
                                + "重量:" + changedData.CheckResult.Rows[0]["Weight"].ToString()
                                + "图片编号:" + changedData.CheckResult.Rows[0]["PhotoGID"].ToString());
                log.Debug("Exception:" + ex.ToString());                
            }            return ret;
        }

解决方案 »

  1.   

    本帖最后由 net_lover 于 2011-12-01 11:15:11 编辑
      

  2.   

    可我的代码里没有用到DataReader啊,我怎么去关闭DataReader呢,我的代码都是用Adaper来把数据装填到DataTable里面啊完整的异常信息如下:
    Exception:System.InvalidOperationException: 已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
       在 System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       在 System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
       在 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
       在 System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
       在 System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
       在 JewelleryDataSetTableAdapters.CheckResultTableAdapter.Update(JewelleryDataSet dataSet)
       在 Jewellery.Web.JewelleryData.UpdateTable(JewelleryDataSet changedData, String tableName, DateTime lastAccessed)
      

  3.   

    这段代码是是websevice上的,所以只能在log里看到,异常信息很明显了,UpdateTable()函数开始产生异常的,大家帮我看看,我的代码里没有DataReader啊,怎么会报这个错呢
      

  4.   

    acceptRegisterTableAdapter哪里来的,前面还调用过什么?
      

  5.   

    前面调用过,装填数据的函数里用acceptRegisterTableAdapter把数据装填到表里acceptRegisterTableAdapter是类里声明的。
      

  6.   

    楼主的问题还没看完,但是看到那么多case语句,不禁想让楼主重构下代码,反射也许可以使代码更清晰一点...
      

  7.   

    报错:已有打开的与此命令相关联的 DataReader,必须首先将它关闭。
    表示其他地方用到datareader了,记着把它关闭
      

  8.   

    可我代码里没有用到DataReader啊,为马上还会说它打开没有关闭呢,没有用到datareader又如何关闭呢?
      

  9.   

    ret = pictrueArgsTableAdapter.Update(changedData);
    跟踪这个方法 进去看看...
      

  10.   

    是update方法
    如果你的DBHelper方法封装的不好的话,修改数据的方法执行错误后,会出现未关闭DataReader错误
      

  11.   

    这代码是webseveic端的代码没法跟踪啊,只能把需要看的内容写入log里
      

  12.   

    能说的更详细点吗?DBHeplper封装的不好是是吗意思呢,比较菜请多指教!