You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
10 KiB
C#

/* aputze */
using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
namespace DynaDis {
public delegate void ProgressHandler(int progress);
public class DynaDis {
public string dataSource="localhost";
public string initialCatalog="DynaDis";
public TimeSpan minWaiting=new TimeSpan(0,5,0);
public TimeSpan maxWaiting=new TimeSpan(0,15,0);
public TimeSpan maxTouring=new TimeSpan(8,0,0);
public int day=1;
public DataSet dataSet;
protected DataTable trainTable;
protected DataTable deviceTable;
protected DataTable employeeTable;
protected SqlConnection connection;
protected SqlDataAdapter dataAdapter1; //TrainTable
protected SqlDataAdapter dataAdapter2; //DeviceTable
protected SqlDataAdapter dataAdapter3; //EmployeeTable
protected Hashtable A;
protected ArrayList T;
protected ArrayList t;
public DynaDis() {
dataSet=new DataSet("DynaDis");
trainTable=dataSet.Tables.Add("TrainTable");
deviceTable=dataSet.Tables.Add("DeviceTable");
employeeTable=dataSet.Tables.Add("EmployeeTable");
}
public void Connect() {
connection=new SqlConnection("Data Source="+dataSource+";"+
"Initial Catalog="+initialCatalog+";"+
"Integrated Security=true;");
connection.Open();
}
public void Disconnect() {
connection.Close();
}
public void Prepare() {
dataAdapter1=new SqlDataAdapter("SELECT * FROM TrainTable WHERE (Available & "+day+")=1", connection);
dataAdapter1.UpdateCommand=new SqlCommand("UPDATE TrainTable SET "+
"Departure=@1,DepartureStation=@2,"+
"Arrival=@3,ArrivalStation=@4,"+
"Available=@5,"+
"ToDo=@6,Done=@7"+
" WHERE TrainId=@0", connection);
dataAdapter1.UpdateCommand.Parameters.Add("@0",SqlDbType.Int,4,"TrainId");
dataAdapter1.UpdateCommand.Parameters.Add("@1",SqlDbType.DateTime,8,"Departure");
dataAdapter1.UpdateCommand.Parameters.Add("@2",SqlDbType.VarChar,50,"DepartureStation");
dataAdapter1.UpdateCommand.Parameters.Add("@3",SqlDbType.DateTime,8,"Arrival");
dataAdapter1.UpdateCommand.Parameters.Add("@4",SqlDbType.VarChar,50,"ArrivalStation");
dataAdapter1.UpdateCommand.Parameters.Add("@5",SqlDbType.Int,4,"Available");
dataAdapter1.UpdateCommand.Parameters.Add("@6",SqlDbType.Int,4,"ToDo");
dataAdapter1.UpdateCommand.Parameters.Add("@7",SqlDbType.Int,4,"Done");
dataAdapter1.InsertCommand=new SqlCommand("INSERT INTO TrainTable "+
"(Departure,DepartureStation,"+
"Arrival,ArrivalStation,"+
"Available,"+
"ToDo,Done)"+
" VALUES "+
"(@0,@1,@2,@3,@4,@5,@6)", connection);
dataAdapter1.InsertCommand.Parameters.Add("@0",SqlDbType.DateTime,8,"Departure");
dataAdapter1.InsertCommand.Parameters.Add("@1",SqlDbType.VarChar,50,"DepartureStation");
dataAdapter1.InsertCommand.Parameters.Add("@2",SqlDbType.DateTime,8,"Arrival");
dataAdapter1.InsertCommand.Parameters.Add("@3",SqlDbType.VarChar,50,"ArrivalStation");
dataAdapter1.InsertCommand.Parameters.Add("@4",SqlDbType.Int,4,"Available");
dataAdapter1.InsertCommand.Parameters.Add("@5",SqlDbType.Int,4,"ToDo");
dataAdapter1.InsertCommand.Parameters.Add("@6",SqlDbType.Int,4,"Done");
dataAdapter1.DeleteCommand=new SqlCommand("DELETE FROM TrainTable WHERE TrainId=@0", connection);
dataAdapter1.DeleteCommand.Parameters.Add("@0",SqlDbType.Int,4,"TrainId");
dataAdapter2=new SqlDataAdapter("SELECT * FROM DeviceTable WHERE (Available & "+day+")=1", connection);
dataAdapter2.UpdateCommand=new SqlCommand("UPDATE DeviceTable SET "+
"Vendor=@1,Model=@2,"+
"Available=@3"+
" WHERE DeviceId=@0", connection);
dataAdapter2.UpdateCommand.Parameters.Add("@0",SqlDbType.Int,4,"DeviceId");
dataAdapter2.UpdateCommand.Parameters.Add("@1",SqlDbType.VarChar,50,"Vendor");
dataAdapter2.UpdateCommand.Parameters.Add("@2",SqlDbType.VarChar,50,"Model");
dataAdapter2.UpdateCommand.Parameters.Add("@3",SqlDbType.Int,4,"Available");
dataAdapter2.InsertCommand=new SqlCommand("INSERT INTO DeviceTable "+
"(Vendor,Model,Available)"+
" VALUES "+
"(@0,@1,@2)", connection);
dataAdapter2.InsertCommand.Parameters.Add("@0",SqlDbType.VarChar,50,"Vendor");
dataAdapter2.InsertCommand.Parameters.Add("@1",SqlDbType.VarChar,50,"Model");
dataAdapter2.InsertCommand.Parameters.Add("@2",SqlDbType.Int,4,"Available");
dataAdapter2.DeleteCommand=new SqlCommand("DELETE FROM DeviceTable WHERE DeviceId=@0", connection);
dataAdapter2.DeleteCommand.Parameters.Add("@0",SqlDbType.Int,4,"DeviceId");
dataAdapter3=new SqlDataAdapter("SELECT * FROM EmployeeTable WHERE (Available & "+day+")=1", connection);
dataAdapter3.UpdateCommand=new SqlCommand("UPDATE EmployeeTable SET "+
"DeviceId=@1,"+
"Name=@2,Address=@3,"+
"Station=@4,Available=@5"+
" WHERE EmployeeId=@0", connection);
dataAdapter3.UpdateCommand.Parameters.Add("@0",SqlDbType.Int,4,"EmployeeId");
dataAdapter3.UpdateCommand.Parameters.Add("@1",SqlDbType.Int,4,"DeviceId");
dataAdapter3.UpdateCommand.Parameters.Add("@2",SqlDbType.VarChar,50,"Name");
dataAdapter3.UpdateCommand.Parameters.Add("@3",SqlDbType.VarChar,50,"Address");
dataAdapter3.UpdateCommand.Parameters.Add("@4",SqlDbType.VarChar,50,"Station");
dataAdapter3.UpdateCommand.Parameters.Add("@5",SqlDbType.Int,4,"Available");
dataAdapter3.InsertCommand=new SqlCommand("INSERT INTO EmployeeTable "+
"(DeviceId,"+
"Name,Address,"+
"Station,Available)"+
" VALUES "+
"(@0,@1,@2,@3,@4)", connection);
dataAdapter3.InsertCommand.Parameters.Add("@0",SqlDbType.Int,4,"DeviceId");
dataAdapter3.InsertCommand.Parameters.Add("@1",SqlDbType.VarChar,50,"Name");
dataAdapter3.InsertCommand.Parameters.Add("@2",SqlDbType.VarChar,50,"Address");
dataAdapter3.InsertCommand.Parameters.Add("@3",SqlDbType.VarChar,50,"Station");
dataAdapter3.InsertCommand.Parameters.Add("@4",SqlDbType.Int,4,"Available");
dataAdapter3.DeleteCommand=new SqlCommand("DELETE FROM EmployeeTable WHERE EmployeeId=@0", connection);
dataAdapter3.DeleteCommand.Parameters.Add("@0",SqlDbType.Int,4,"EmployeeId");
}
public void Fill() {
dataSet.Clear();
dataAdapter1.FillSchema(dataSet,SchemaType.Source,"TrainTable");
dataAdapter1.Fill(dataSet,"TrainTable");
dataAdapter2.FillSchema(dataSet,SchemaType.Source,"DeviceTable");
dataAdapter2.Fill(dataSet,"DeviceTable");
dataAdapter3.FillSchema(dataSet,SchemaType.Source,"EmployeeTable");
dataAdapter3.Fill(dataSet,"EmployeeTable");
}
public void Update() {
dataAdapter1.Update(dataSet,"TrainTable");
dataAdapter2.Update(dataSet,"DeviceTable");
dataAdapter3.Update(dataSet,"EmployeeTable");
}
public event ProgressHandler selectProgress;
public void Select() {
if(selectProgress!=null) { selectProgress(0); }
DateTime dateTime1=DateTime.Now;
Create_A();
DateTime dateTime2=DateTime.Now;
Create_T();
DateTime dateTime3=DateTime.Now;
Create_t();
DateTime dateTime4=DateTime.Now;
Console.WriteLine("Create_A() {0}",dateTime2-dateTime1);
Console.WriteLine("Create_T() {0}",dateTime3-dateTime2);
Console.WriteLine("Create_t() {0}",dateTime4-dateTime3);
Console.WriteLine("|T|={0}",T.Count);
Console.WriteLine("|t|={0}",t.Count);
if(selectProgress!=null) { selectProgress(100); }
}
protected void Create_A() {
A=new Hashtable();
foreach(DataRow trainRow1 in trainTable.Rows) {
foreach(DataRow trainRow2 in trainTable.Rows) {
if((string)trainRow2["DepartureStation"]==(string)trainRow1["ArrivalStation"] &&
((DateTime)trainRow2["Departure"]-(DateTime)trainRow1["Arrival"])>=minWaiting &&
((DateTime)trainRow2["Departure"]-(DateTime)trainRow1["Arrival"])<=maxWaiting) {
if(!A.Contains(trainRow1["TrainId"])) {
A.Add(trainRow1["TrainId"],new ArrayList());
}
((ArrayList)A[trainRow1["TrainId"]]).Add(trainRow2);
}
}
}
}
protected void Create_T() {
T=new ArrayList();
foreach(DataRow employeeRow in employeeTable.Rows) {
ArrayList T1=new ArrayList();
ArrayList T2=new ArrayList();
foreach(DataRow trainRow1 in trainTable.Rows) {
if((string)trainRow1["DepartureStation"]==(string)employeeRow["Station"]) {
ArrayList tour1=new ArrayList();
tour1.Add(trainRow1); T1.Add(tour1);
}
}
while(T1.Count>0) {
foreach(ArrayList tour1 in T1) {
DataRow trainRow0=(DataRow)tour1[0];
DataRow trainRow1=(DataRow)tour1[tour1.Count-1];
try {
foreach(DataRow trainRow2 in (ArrayList)A[trainRow1["TrainId"]]) {
if(((DateTime)trainRow2["Arrival"]-(DateTime)trainRow0["Departure"])<=maxTouring) {
ArrayList tour2=(ArrayList)tour1.Clone();
tour2.Add(trainRow2); T2.Add(tour2);
if((string)trainRow2["ArrivalStation"]==(string)employeeRow["Station"]) {
T.Add(tour2);
}
}
}
} catch { continue; }
}
T1=T2;
T2=new ArrayList();
}
}
}
protected void Create_t() {
t=new ArrayList();
}
}
}