⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydataset.cs

📁 用C#开发的录井油气识别专家系统
💻 CS
📖 第 1 页 / 共 3 页
字号:
			}


						

		}
	
		
		private void InitRelations()
		{
			 
			DataColumn parentCol;
			DataColumn childCol;
			
			IDictionaryEnumerator myEnumerator = adList.GetEnumerator();
			myEnumerator.MoveNext();
			parentCol = Tables[(string)(myEnumerator.Key)].Columns["ID"];
			
			myEnumerator.MoveNext();
			childCol = Tables[(string)(myEnumerator.Key)].Columns["ID"];
			DataRelation relation;
			relation = new DataRelation("CustomersOrders", parentCol, childCol);
			Relations.Add(relation);

		}
		
	


	}




	/// <summary>
	/// 
	/// </summary>
	public class myCriDataSet : myDataSet
	{

		public event  ProbControl.SetEXPSGMDelegate statisRowchange2plot;		 
		public static string NAME_SAMPLE_TABLENAME="sampledata";
		public static string NAME_PARAM_TABLENAME="参数统计";
		public myCriDataSet()
		{
			// 
			// TODO: 在此处添加构造函数逻辑
			//
		}

		public ArrayList GenerateResultList()
		{
			ArrayList list=new ArrayList();

			
			if(SampleTable==null)
			{

				return null;
			}

			OleDbCommand cmd=new OleDbCommand();
			cmd.Connection=cnnexpert;
			
			cmd.CommandText="select distinct [试油结果] FROM ["+NAME_SAMPLE_TABLENAME+"]";


			OleDbDataReader reader=cmd.ExecuteReader();
			while (reader.Read()) 
				list.Add(reader["试油结果"]);
			reader.Close();
			
			return list;
		}

		

		public void GenerateStatisTable()
		{

			if(SampleTable==null)
			{
				return ;
			}
			ParamTable=new DataTable(NAME_PARAM_TABLENAME);
			ParamTable.Columns.Add(new DataColumn("试油结果",typeof(string)));
			ParamTable.Columns.Add(new DataColumn("参数",typeof(string)));
			ParamTable.Columns.Add(new DataColumn("最大值",typeof(float)));
			ParamTable.Columns.Add(new DataColumn("最小值",typeof(float)));
			ParamTable.Columns.Add(new DataColumn("均值",typeof(float)));
			ParamTable.Columns.Add(new DataColumn("偏差",typeof(float)));
			ParamTable.Columns.Add(new DataColumn("样本数",typeof(int)));
			ParamTable.Columns.Add(new DataColumn("单调",typeof(int)));

			foreach(DataColumn col in SampleTable.Columns)
			{
				try
				{
					if(!myCriDataSet.IsCriField(col))//col.DataType.IsValueType)
						continue;

					OleDbCommand cmd=new OleDbCommand();
					cmd.Connection=cnnexpert;
					//cmd.CommandText+="select ";
					string s="select ";
					s+="[试油结果]";
					//s+=",STDEVP(["		+ col.ColumnName+	"]) AS [偏差]";
					s+=",STDEVP(["		+ col.ColumnName+	"]) AS [偏差]";//I am not sure ;
					s+=",AVG(["			+ col.ColumnName+	"]) AS [均值]";
					s+=",MIN(["			+ col.ColumnName+	"]) AS [最小值]";
					s+=",MAX(["			+ col.ColumnName+	"]) AS [最大值]";
					s+=",COUNT(["		+ col.ColumnName+	"]) AS [样本数]";
					s+="	FROM ";
					s+=NAME_SAMPLE_TABLENAME;
					s+="	GROUP BY [试油结果]";
					cmd.CommandText=s;


					OleDbDataReader reader=cmd.ExecuteReader();

					while (reader.Read()) 
					{
						DataRow newRow=ParamTable.NewRow();
						newRow["试油结果"]=reader["试油结果"];
						newRow["最大值"]	=reader["最大值"];
						newRow["最小值"]	=reader["最小值"];
						newRow["均值"]		=reader["均值"];
						newRow["偏差"]		=reader["偏差"];
						newRow["样本数"]	=reader["样本数"];
						newRow["参数"]		=col.ColumnName;
						newRow["单调"]=0;

						ParamTable.Rows.Add(newRow);
					}//end while
					reader.Close();
				}
				catch(OleDbException e)
				{
					MessageBox.Show(e.Message);

				}
			}//end foreach
			
		}

		/// <summary>
		/// 取数组形式的数据总表
		/// </summary>
		public unsafe bool SetYQGA(YQGA myc,ref TemplateMapping tm)
		{

			DataTable table=GetTableOfCriColumn();
			if(table==null)
				return false;
			
		
			
			foreach(DataColumn col in table.Columns)
			{
				DataRow[] dr=myDataSet.FieldSetting.Select("[NAME]= \'" + col.ColumnName+ "\'");
				if(dr.Length<=0)//never this case
					continue;
				DataRow fsr=dr[0];
				tm.AddRow(Convert.ToString(fsr["NAME"]),Convert.ToSingle(fsr["MIN"]),Convert.ToSingle(fsr["MAX"]),16);
				//tm.AddRow(col.ColumnName);
			}

		





			
			
		
			//以下代码将数据写成数组的形式
			int nc=table.Columns.Count-1;//排除结果类型字段
			int nr=table.Rows.Count;
			myc.nrInclusive=nr;
			myc.ncInclusive=nc;
			if(!myc.AllocateInEx())//分配空间
				return false;
			int* type=myc.types;
			float** b=myc.Inclusive;//
		//	float** b=myc.AllocateInEx();
			if(b==NULL)
				return false;
			
			int i=0;
			foreach(DataRow row in  table.Rows)
			{
				int j=0;
				foreach(DataColumn col in table.Columns)
				{
					object temp=row[col.ColumnName];
					if(col.ColumnName=="结果类型")
						type[i]=(int)temp;

					else	
						b[i][j++]=(temp==null || temp.GetType()!=typeof(float)) ? float.NaN :(float)temp;
										
				}//end inner foreach
				i++;
			}//end outer  foreach

			myc.EncodeCri();


				
			

					
			return true;
				
			
		}
		
		public delegate DataRow GetEXPSGMDelegate(int Rowindex);
		
		public DataRow GetExptSigma(int Rowindex)
		{
		
			return ParamTable.Rows[Rowindex];
					
		}


		public ArrayList GetResultTypes()
		{
			ArrayList resultypes=new ArrayList();

			
			OleDbCommand aCommand=new OleDbCommand();
						
			aCommand.Connection = cnnexpert;
			aCommand.CommandType=CommandType.Text;
			aCommand.CommandText ="Select DISTINCT [试油结果] from ["+NAME_SAMPLE_TABLENAME+"]";
			OleDbDataReader reader=aCommand.ExecuteReader();
			
			while (reader.Read()) 
			{
				resultypes.Add(reader["试油结果"]);
								
			}//end while
			reader.Close();

			return resultypes;
			
		}
		public static bool IsCriField(DataColumn col)
		{
			return myCriDataSet.IsCriField(col.ColumnName);



		

			
			
			
		}
		public static bool IsCriField(string field)
		{

			if(FieldSetting!=null)
			{
				DataRow[] rows=FieldSetting.Select("[NAME]="+ "\'"+field+"\'");
				if(rows.Length<=0)
                    return false;
				bool bUsed = Convert.ToBoolean(rows[0]["USEIT"]);
				return bUsed;
			}


			return true;
			
			
		}

		public static string GetAbrev(string field)
		{

			if(FieldSetting!=null)
			{
				DataRow[] rows=FieldSetting.Select("[NAME]="+ "\'"+field+"\'");
				if(rows.Length<=0)
					return null;
				if(rows[0]["abrev"]==null)
					return null;
				return Convert.ToString(rows[0]["abrev"]);
				
			}


			return null;
			
			
		}


		
		public	DataView GetCriRowsOfParam(string field)
		{
						

			
			if(ParamTable==null)
				return null;
			if(!IsCriField(field))
				return null;
					DataView dv=new DataView(ParamTable,"[参数]=\'" + field+"\'",null,DataViewRowState.CurrentRows
						);
		
			return dv;
			
		}
		private DataTable GetTableOfCriColumn()
		{
			
			if(SampleTable==null)
				return null;
			DataTable a=new DataTable();
			
			foreach(DataColumn col in SampleTable.Columns)
			{
				if(IsCriField(col.ColumnName))
				{
					a.Columns.Add(col.ColumnName,typeof(float));
				}
			
			}

			a.Columns.Add("结果类型",typeof(int));


			ArrayList result=GetResultTypes();


			foreach(DataRow row in SampleTable.Rows)
			{
				DataRow nr=a.NewRow();
				foreach (DataColumn col in a.Columns)
				{
					if(col.ColumnName=="结果类型")
						nr[col]=result.IndexOf(row["试油结果"]);


					else
                        nr[col]=row[col.ColumnName];
				}

				a.Rows.Add(nr);
			}
			return a;
		}//end GetTableOfCriColumn()



/*valueRec,待测纪录
 * results,当前待测纪录对应的几个结果纪录
 */
		
		public void BuildItemResultRecords(ArrayList results, DataRow valueRec)
		{
			//计算当前待测纪录对应的几个结果纪录中的每一个参数的概率
			
			foreach(DataColumn col in valueRec.Table.Columns)
			{
				DataView crirows=GetCriRowsOfParam(col.ColumnName);
				if(crirows==null)
					continue;

				object field=valueRec[col.ColumnName];
				foreach(DataRowView crirow in crirows)
				{
					if(crirow["均值"].GetType()==typeof(DBNull))
						continue;

					if(crirow["偏差"].GetType()==typeof(DBNull))
						continue;

					
					if(	statisRowchange2plot!=null)
						statisRowchange2plot(crirow);
					
					
					float expt=(float)crirow["均值"];
					float sigma=(float)crirow["偏差"];
					int vmonotype=(int)crirow["单调"];
					CMathFunc a=new CMathFunc();
					object ob=valueRec[col.ColumnName];
					if(ob!=null && ob.GetType()!=typeof(DBNull) )
					{
						
						double f=Convert.ToDouble(ob);
						double vvv=a.CNormal(expt,sigma,f,vmonotype);
						SetCell(crirow,results,vvv);
					}
				}
			
			}

			//统计当前待测纪录对应的几个结果纪录中的总计概率
			foreach(DataRow row in results)
			{
				float f=0;
				foreach(DataColumn col in row.Table.Columns)
				{
					if(col.ColumnName=="序号" || col.ColumnName=="结论" ||col.ColumnName=="总计")
						continue;
					object ob=row[col.ColumnName];
					if(ob.GetType()!=typeof(DBNull))
					{

						double weight=1.0f;
						DataRow[] dr=myDataSet.FieldSetting.Select("[NAME]= \'" + col.ColumnName+"\'");
						if(dr.Length>=1)
						{

							weight=Convert.ToDouble(dr[0]["WEIGHT"]);
						}
											
						f+=(float)ob*(float)weight;
					}
				}
				row["总计"]=f;

				row["序号"]=valueRec["序号"];

				row["井号"]=valueRec["井号"];
				row["井段"]=valueRec["井段"];

				//将当前待测纪录对应的油,水,气,干...判断结果纪录加入到结果表中
				row.Table.Rows.Add(row);


			}
			//根据 总计概率 排列 当前待测纪录对应的几个结果纪录 可信等级
			ArrayList finallist=new ArrayList();

			foreach(DataRow row in results)
				finallist.Add(row["总计"]);

			IComparer myComparer = new myReverserClass();
			finallist.Sort( myComparer );


			//finallist.Sort();

			foreach(DataRow row in results)
				row["可信等级"]=finallist.IndexOf(row["总计"]);

			return;
		}



		public class myReverserClass : IComparer  
		{

			// Calls CaseInsensitiveComparer.Compare with the parameters reversed.
			int IComparer.Compare( Object x, Object y )  
			{
				return( (new CaseInsensitiveComparer()).Compare( y, x ) );
			}

		}


		public void SetCell(DataRow crirow,ArrayList results,double vv)
		{
			foreach(DataRow row in results)
			{
				if(row["结论"].ToString()==crirow["试油结果"].ToString())
				{
					row[(string)crirow["参数"]]=vv;
					break;
				}

			}
		}
		public void SetCell(DataRowView crirow,ArrayList results,double vv)
		{
			foreach(DataRow row in results)
			{
				if(row["结论"].ToString()==crirow["试油结果"].ToString())
				{
					row[(string)crirow["参数"]]=vv;
					break;
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -