问题描述
报错:已有打开的与此命令相关联的DataReader,必须首先将它关闭。在这个函数报错:UpdateTable(JewelleryDataSetchangedData,StringtableName,DateTimelastAccessed)代码如下:publicintUpdateTable(JewelleryDataSetchangedData,stringtableName,DateTimelastAccessed){intret=0;stringSqlInfo="";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(SqlExceptionsqlEx){log.Debug(string.Format("AproblemwasencountedupdatingTable:n{0}",sqlEx.ToString()));thrownewSoapException("写入数据库出错",SoapException.ServerFaultCode,"Database");}catch(Exceptionex){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());}returnret;}
解决方案
解决方案二:
本帖最后由 net_lover 于 2011-12-01 11:15:11 编辑
解决方案三:
可我的代码里没有用到DataReader啊,我怎么去关闭DataReader呢,我的代码都是用Adaper来把数据装填到DataTable里面啊完整的异常信息如下:Exception:System.InvalidOperationException:已有打开的与此命令相关联的DataReader,必须首先将它关闭。在System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgsrowUpdatedEvent,BatchCommandInfo[]batchCommands,Int32commandCount)在System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgsrowUpdatedEvent,BatchCommandInfo[]batchCommands,Int32commandCount)在System.Data.Common.DbDataAdapter.Update(DataRow[]dataRows,DataTableMappingtableMapping)在System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTabledataTable,DataTableMappingtableMapping)在System.Data.Common.DbDataAdapter.Update(DataSetdataSet,StringsrcTable)在JewelleryDataSetTableAdapters.CheckResultTableAdapter.Update(JewelleryDataSetdataSet)在Jewellery.Web.JewelleryData.UpdateTable(JewelleryDataSetchangedData,StringtableName,DateTimelastAccessed)
解决方案四:
你单步调试看下确定你错误的语句,
解决方案五:
这段代码是是websevice上的,所以只能在log里看到,异常信息很明显了,UpdateTable()函数开始产生异常的,大家帮我看看,我的代码里没有DataReader啊,怎么会报这个错呢
解决方案六:
acceptRegisterTableAdapter哪里来的,前面还调用过什么?
解决方案七:
前面调用过,装填数据的函数里用acceptRegisterTableAdapter把数据装填到表里acceptRegisterTableAdapter是类里声明的。
解决方案八:
大家帮忙看看
解决方案九:
楼主的问题还没看完,但是看到那么多case语句,不禁想让楼主重构下代码,反射也许可以使代码更清晰一点...
解决方案十:
高手大哥们帮忙看看啊!
解决方案十一:
没有close()是一定的
解决方案十二:
每次用完关掉就行了
解决方案十三:
该回复于2011-12-02 07:20:58被版主删除
解决方案十四:
报错:已有打开的与此命令相关联的DataReader,必须首先将它关闭。表示其他地方用到datareader了,记着把它关闭
解决方案十五:
可我代码里没有用到DataReader啊,为马上还会说它打开没有关闭呢,没有用到datareader又如何关闭呢?
解决方案:
ret=pictrueArgsTableAdapter.Update(changedData);跟踪这个方法进去看看...
解决方案:
是update方法如果你的DBHelper方法封装的不好的话,修改数据的方法执行错误后,会出现未关闭DataReader错误
解决方案:
引用15楼zgf_along的回复:
ret=pictrueArgsTableAdapter.Update(changedData);跟踪这个方法进去看看...
这代码是webseveic端的代码没法跟踪啊,只能把需要看的内容写入log里
解决方案:
引用16楼zgf_along的回复:
是update方法如果你的DBHelper方法封装的不好的话,修改数据的方法执行错误后,会出现未关闭DataReader错误
能说的更详细点吗?DBHeplper封装的不好是是吗意思呢,比较菜请多指教!
解决方案:
各位大侠帮帮忙啊