我用C#编一个程序,调用oracle10g里边的数据:开始建立一个连接,然后通过循环读取其中数据。可是老提示“ORA-01000:超出打开游标的最大数”错误,我看网上说了要改init.ora中的poen_cursors,我就改了,步骤如下:
sqlplus sys/sys as sysdba
alter system set open_cursors=5000 scope=both
shutdown abort
startup
可是还是不行,仍报这个错误。高手指教!!!!!
我对数据库一知半解,请高手给出修改的语句吧。

解决方案 »

  1.   

    你的程序打开数据库时关闭了吗?
    游标超出的原因大都是打开数据库连接不关闭造成的。
    conn.open()
    statment.open()statment.close()
    conn.close()
      

  2.   

    nicolastsuei说的这些语句要加在什么地方啊,我就在程序的最前面有一个连接数据库的部分,然后下边就是通过循环查询所有导入的数据,不知道该怎么关闭连接啊??
      

  3.   

    zhangcunhua,我对数据库没概念,是借助一个中间软件来连接数据库的,我是先做了一个连接数据库功能,在下边的循环语句中就没有再连接数据库,但是我闹不清楚那个中间软件是不是每次循环都打开游标。中间软件用的是arcsde,是arcgis上的,不知道老兄用过吗
      

  4.   

    Select * from v$open_cursor Where user_name=''这个可以看你使用的游标数,你看看,user_name是你连接时使用的用户名
    中间软件用的是arcsde,是arcgis上的没用过
      

  5.   

    private void polylineIntersectPolygon(string polylineName,string fieldAltered)
            {
                IWorkspaceFactory2 pSdeFact = new SdeWorkspaceFactoryClass();
                IPropertySet pPropSet = new PropertySetClass();
                pSdeFact = new SdeWorkspaceFactoryClass();
                pPropSet.SetProperty("Server", "lenovo-pc");
                pPropSet.SetProperty("Instance", "esri_sde");//port:5151");
                pPropSet.SetProperty("USER", "sde");
                pPropSet.SetProperty("PASSWORD", "sys");
                pPropSet.SetProperty("VERSION", "sde.DEFAULT");
                pPropSet.SetProperty("AUTHENTICATION_MODE", "DBMS");
                
                IWorkspace pWorkspace = pSdeFact.Open(pPropSet, 0);
                IEnumDataset pEnumDataset = (IEnumDataset)pWorkspace.get_Datasets(esriDatasetType.esriDTFeatureDataset);
                pEnumDataset.Reset();
                IDataset pDatasetTopLayer = (IDataset)pEnumDataset.Next();
                //对数据库中的featuredataset循环
                while (pDatasetTopLayer != null)
                {
                    
                    //得到featuredataset中的featureclass的名字
                    IFeatureDataset pFeatureDatasetTopLayer = (IFeatureDataset)pDatasetTopLayer;
                    IEnumDataset pEnumDataset2 = pFeatureDatasetTopLayer.Subsets;
                    pEnumDataset2.Reset();
                    IDataset pDataset2 = (IDataset)pEnumDataset2.Next();
                    //对featuredataset中的featureclass循环
                    
                    IFeatureClass pFeatureClassPolylineEver = null;//永久保存将被循环的所有polyline的要素类
                    IFeatureClass pFeatureClassPolygon = null;
                    
                    IFeatureCursor pFeatureCursorPolyline = null;
                    
                    IFeature pFeaturePolyline = null;
                    IFeatureCursor featureCursorPolygon = null;
                    IFeature featurePolygon = null;
                                    while (pDataset2 != null)
                    {
                              
                        try
                        {                        IFeatureClass pFeatureClassTemp = (IFeatureClass)pDataset2;
                            
                            //得到所有的polyline及指向第一个polyline的指针
                            if (pFeatureClassTemp.AliasName==polylineName)//"SDE.river"
                            {
                                
                                pFeatureClassPolylineEver = pFeatureClassTemp;
                                //获取线要素类的所有要素                            pFeatureCursorPolyline = pFeatureClassPolylineEver.Search(new QueryFilterClass(), false);
                                
                                pFeaturePolyline = pFeatureCursorPolyline.NextFeature();
                              }
                                                                            //得到所有的方格子Polygon和指向第一个Polygon的指针
                            
                            if (pFeatureClassTemp.AliasName == "SDE.yidian1")
                            {
                                pFeatureClassPolygon = pFeatureClassTemp;
                                  //设置过滤器
                                  IQueryFilter queryFilter = new QueryFilterClass();
                                  queryFilter.WhereClause = "SDE.yidian1.AREA > 0";
                                  //设置要获得的字段
                                  //queryFilter.SubFields = "FID, Type";
                                  
                                  //在指定的要素类内进行搜索,把搜索的结果存在一个cursor中
                                  featureCursorPolygon = pFeatureClassPolygon.Update(queryFilter, false);
                                 //得到要素类中第一个要素
                                  featurePolygon = featureCursorPolygon.NextFeature();
                                  
                            }
                               
                                
                               //外层对Polygon进行循环,内层对polyline进行循环,让一个Polygon与所用的polyline求交                         
                                if(pFeaturePolyline !=null&&featurePolygon !=null)
                                {
                                      while (featurePolygon != null)
                                      {
                                          //int count = 0;
                                          double totalLength = 0.0;
                                          IPolygon pPolygon = featurePolygon.ShapeCopy as IPolygon ;
                                          pFeatureCursorPolyline = pFeatureClassPolylineEver.Search(new QueryFilterClass(), false);
                                          pFeaturePolyline = pFeatureCursorPolyline.NextFeature();
                                          //进行包含判断的基础设置
                                          IGeometry basicPolygon = featurePolygon.ShapeCopy;
                                          IRelationalOperator relationOper = basicPolygon as IRelationalOperator;
                                          //判断是否有包含或者相交的关系,如果有就求交
                                          while (pFeaturePolyline != null)
                                          {
                                                  //count ++;
                                              IGeometry compareGeometryPolygon = pFeaturePolyline.ShapeCopy;
                                              if (relationOper.Contains(compareGeometryPolygon)||relationOper.Overlaps(compareGeometryPolygon))
                                              { 
                                                    //求交
                                                  //求该线与某个面要素相交的几何线段
                                                  IPolyline pPolyline = pFeaturePolyline.ShapeCopy as IPolyline;
                                                  ITopologicalOperator pTopologicalOperator = pPolyline as ITopologicalOperator;
                                                  IGeometry pGeometryResult = pTopologicalOperator.Intersect(pPolygon, esriGeometryDimension.esriGeometry1Dimension);
                                                  IPolyline pPolylineResult = new PolylineClass();
                                                  pPolylineResult = pGeometryResult as IPolyline;
                                                  //累加面内线要素几何线段的长度
                                                 totalLength += pPolylineResult.Length;
                                              }
                                                                              
                                                 pFeaturePolyline = pFeatureCursorPolyline.NextFeature();
                                          }
                                                                                //设置传入的字段的属性值
                                          IFields fields = featureCursorPolygon.Fields;
                                          int fieldIndex = fields.FindField(fieldAltered);//"river"                                      featurePolygon.set_Value(fieldIndex, totalLength);
                                          featureCursorPolygon.UpdateFeature(featurePolygon);
                                          
                                          
                                          featurePolygon = featureCursorPolygon.NextFeature();
                                         
                                      }
                                    MessageBox.Show("叠加完成");
                                }
                            
                            
                            
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                        pDataset2 = (IDataset)pEnumDataset2.Next();
                    }                pDatasetTopLayer = (IDataset)pEnumDataset.Next();            }
            }
      

  6.   

    这是我的代码,gis开发里的,不知道你能不能看懂,就调用这个函数时出错了