📄 mydataset.cs
字号:
}
}
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 + -