En enkel databaseløsning
Form
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace db1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// initiate combo box for countries
ArrayList countries = DBAccess.getAllCountries();
if (countries==null)
{
webBrowser1.DocumentText = "sorry";
return;
}
for (int ix = 0; ix < countries.Count; ix++)
comboLand.Items.Add(countries[ix]);
// combos for years and level are filled in design
// set initial selection
comboLand.SelectedItem=comboLand.Items[0];
comboLevel.SelectedItem = comboLevel.Items[0];
comboAr.SelectedItem = comboAr.Items[0];
}
private void buttonVis_Click(object sender, EventArgs e)
{
// Control selection, collect data from form,
// access database and show result
String country = comboLand.SelectedItem.ToString();
String level = comboLevel.SelectedItem.ToString();
String year = comboAr.SelectedItem.ToString();
// fix parameters to match database
year = year.Substring(0, 4);
country = DBAccess.GetCountryID(country);
if (country == null)
{
webBrowser1.DocumentText = "sorry";
return;
}
// do it
if (sender.Equals(VisLag))
webBrowser1.DocumentText =
DBAccess.getTeamList(country, level, year);
else if(sender.Equals(VisTabell))
webBrowser1.DocumentText =
DBAccess.getTable(country, level, year);
else // vis kamper
webBrowser1.DocumentText =
DBAccess.getMatcList(country, level, year);
}
}
}DBAccess
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Odbc;
using System.Collections;
namespace db1
{
class DBAccess
{
// using mysql:
// http://dev.mysql.com/tech-resources/articles/dotnet/
// make this accessible to student:
// grant select on fotball.* to student identified by 'student';
// localhost,root,oliver
static String connectString =
@"DRIVER={MySQL ODBC 3.51 Driver};
SERVER=frigg.hiof.no;
DATABASE=fotball;
UID=student;
PASSWORD=student;
OPTION=3";
static Liga theLiga = null;
static String theCountry = "";
static String theLevel = "";
static String theYear = "";
static String ErrorMessage = "";
static String Page = @"
<html>
<head>
</head>
<body>
{0}
</body>
</html>";
static public ArrayList getAllCountries()
{
// set up a query based on the parameters
String myQuery = String.Format(
@"SELECT navn From land;");
OdbcConnection con = null;
OdbcDataReader myReader = null;
try
{
con = new OdbcConnection(connectString);
con.Open();
// execute the query
OdbcCommand myCommand = new OdbcCommand(myQuery, con);
myReader = myCommand.ExecuteReader();
// and process the results
ArrayList list=new ArrayList(100);
while(myReader.Read()){
list.Add(myReader.GetString(0));
};
return list;
}
catch (Exception ex)
{
return null;
}
finally
{
if (con != null)
con.Close();
if (myReader != null)
myReader.Close();
}
}
static public String GetCountryID(String countryName)
{
// set up a query based on the parameters
String myQuery = String.Format(
@"SELECT land_id From land where navn='{0}';",countryName);
OdbcConnection con = null;
OdbcDataReader myReader = null;
try
{
con = new OdbcConnection(connectString);
con.Open();
// execute a query
OdbcCommand myCommand = new OdbcCommand(myQuery, con);
myReader = myCommand.ExecuteReader();
// and process the results
myReader.Read();
return myReader.GetString(0);
}
catch (Exception ex)
{
return "en";
}
finally
{
if (con != null)
con.Close();
if (myReader != null)
myReader.Close();
}
}
static public bool EstablishLiga(String country,
String level,
String year)
{
// no need to access it again if it is already there
if ((theLiga != null) &&
(theCountry.CompareTo(country) == 0) &&
(theLevel.CompareTo(level) == 0) &&
(theYear.CompareTo(year) == 0))
return true;
// set up a query based on the parameters
String myQuery = String.Format(
@"SELECT hlag.navn,blag.navn,h_maal,b_maal,kamp_dato
FROM kamp,lag hlag, lag blag
WHERE kamp.h_lag_id = hlag.lag_id AND
kamp.b_lag_id = blag.lag_id AND
liga_id in
(SELECT liga_id FROM liga
WHERE sesong_id='{0}'AND
land_id='{1}' AND
nivaa='{2}'
)
;", year, country, level);
OdbcConnection con = null;
OdbcDataReader myReader = null;
theLiga = new Liga();
try
{
con = new OdbcConnection(connectString);
con.Open();
// execute a query
OdbcCommand myCommand = new OdbcCommand(myQuery, con);
myReader = myCommand.ExecuteReader();
// and process the results
int count = 0;
while (myReader.Read())
{
theLiga.AddMatch(
myReader.GetString(0),
myReader.GetString(1),
myReader.GetInt32(2),
myReader.GetInt32(3),
myReader.GetString(4)
);
count++;
}
if (count < 2)
{
ErrorMessage =
"<p>Ligaen eksisterer ikke i databasen</p>";
return false;
}
return true;
}
catch (Exception ex)
{
ErrorMessage =
"<p>Fikk ikke kontakt med databasen:" +
ex.Message +
"</p>";
theLiga = null;
return false;
}
finally
{
if (con != null)
con.Close();
if (myReader != null)
myReader.Close();
}
}
static public String getTable(String country,
String level,
String year)
{
if (!EstablishLiga(country, level, year))
return String.Format(Page, ErrorMessage);
return String.Format(Page, theLiga.GetNormalTable());
}
static public String getTeamList(String country,
String level,
String year)
{
if (!EstablishLiga(country, level, year))
return String.Format(Page, ErrorMessage);
return String.Format(Page, theLiga.GetSimpleTeamList());
}
static public String getMatcList(String country,
String level,
String year)
{
if (!EstablishLiga(country, level, year))
return String.Format(Page, ErrorMessage);
return String.Format(Page, theLiga.GetMatchList());
}
}
}
Liga
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace db1
{
#region sorthelpers
// ICompare class for sorting teams on name
class TeamNameCompare : IComparer
{
public int Compare(Object a, Object b)
{
return String.Compare(((Team)a).TeamName,
((Team)b).TeamName);
}
}
// ICompare class for sorting teams on results
class TeamCompare : IComparer
{
public int Compare(Object a, Object b)
{
if (((Team)a).IsBetter((Team)b))
return -1;
if (((Team)b).IsBetter((Team)a))
return 1;
return 0;
}
}
// ICompare class for sorting matches on date
class MatchCompare : IComparer
{
public int Compare(Object a, Object b)
{
if (((Match)a).IsAfter((Match)b))
return -1;
if (((Match)b).IsAfter((Match)a))
return 1;
return 0;
}
}
#endregion sorthelpers
#region liga
class Liga
{
ArrayList Teams;
ArrayList Matches;
public Liga()
{
Teams = new ArrayList(25);
Matches = new ArrayList(400);
}
public void AddMatch(String h_team,
String a_team,
int h_gls,
int a_gls,
String date)
{
Matches.Add(new Match(h_team,a_team,h_gls,a_gls,date));
Team home = TeamWithName(h_team);
if (home == null)
{
home = new Team(h_team);
Teams.Add(home);
}
home.AddHomeResult(h_gls, a_gls);
Team away = TeamWithName(a_team);
if (away == null)
{
away = new Team(a_team);
Teams.Add(away);
}
away.AddAwayResult(a_gls, h_gls);
}
private Team TeamWithName(String name)
{
for (int ix = 0; ix < Teams.Count; ix++)
if (((Team)Teams[ix]).Name.CompareTo(name) == 0)
return (Team)Teams[ix];
return null;
}
public String GetNormalTable()
{
// sort Teams
Teams.Sort(new TeamCompare());
StringBuilder tbody = new StringBuilder(2000);
for (int tix = 0; tix < Teams.Count; tix++)
{
tbody.Append(((Team)Teams[tix]).PrepareNormalRow());
}
String Table =
String.Format(@"<table>{0}</table>", tbody.ToString());
return Table;
}
public String GetSimpleTeamList()
{
// sort Teams on name
Teams.Sort(new TeamNameCompare());
StringBuilder tlist = new StringBuilder(2000);
for (int tix = 0; tix < Teams.Count; tix++)
{
tlist.Append("<li>" + ((Team)Teams[tix]).Name + "</li>");
}
String Table =
String.Format(@"<ul>{0}</ul>", tlist.ToString());
return Table;
}
public String GetMatchList()
{
// sort matches on date
Matches.Sort(new MatchCompare());
StringBuilder tlist = new StringBuilder(4000);
for (int tix = 0; tix < Matches.Count; tix++)
{
tlist.Append(((Match)Matches[tix]).PrepareRow());
}
String Table =
String.Format(@"<table>{0}</table>", tlist.ToString());
return Table;
}
}
#endregion liga
}
Match
using System;
using System.Collections.Generic;
using System.Text;
namespace db1
{
class Match
{
String homeTeam;
String awayTeam;
int homeGoals;
int awayGoals;
String matchDate;
public Match(String hT, String aT, int hG, int aG,String date)
{
homeTeam=hT;
awayTeam=aT;
homeGoals=hG;
awayGoals=aG;
matchDate = date;
}
public String MatchDate{
get { return matchDate; }
}
public String PrepareRow()
{
return String.Format(
@"<tr {6}><td {6}>{0}</td>
<td>{1}</td><td>{2}</td>
<td {5}>{3}-{4}</td>
</tr>",
matchDate,
homeTeam,
awayTeam,
Convert.ToString(homeGoals),
Convert.ToString(awayGoals),
"style=\"color:red\"",
"style=\"font-size:11px\"");
}
public bool IsAfter(Match M)
{
return MatchDate.CompareTo(M.MatchDate) > 0;
}
}
}
Team
using System;
using System.Collections.Generic;
using System.Text;
namespace db1
{
class Team
{
int h_win, h_draw, h_loose,
a_win, a_draw, a_loose,
h_pnts, a_pnts,
g_h_pluss, g_h_minus, g_a_pluss, g_a_minus;
public String Name;
public Team(String name)
{
h_win = h_draw = h_loose =
a_win = a_draw = a_loose =
h_pnts = a_pnts =
g_h_pluss = g_h_minus = g_a_pluss = g_a_minus = 0;
Name = name;
}
public void AddHomeResult(int ownGoals, int oppGoals)
{
g_h_pluss += ownGoals;
g_h_minus += oppGoals;
if (ownGoals > oppGoals)
{
h_win += 1;
h_pnts += 3;
}
else if (ownGoals < oppGoals)
h_loose += 1;
else
{
h_draw += 1;
h_pnts += 1;
}
}
public void AddAwayResult(int ownGoals, int oppGoals)
{
g_a_pluss += ownGoals;
g_a_minus += oppGoals;
if (ownGoals > oppGoals)
{
a_win += 1;
a_pnts += 3;
}
else if (ownGoals < oppGoals)
a_loose += 1;
else
{
a_draw += 1;
a_pnts += 1;
}
}
public String PrepareNormalRow()
{
// name,matchcount,wins,draws,lost,owngoals-lostgoals,pnts
String S=String.Format(@"<tr>
<td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td>
<td>{4}</td><td>{5}</td><td>{6}</td>
</tr>
",
Name,
Convert.ToString(h_win +h_draw +h_loose +a_win +a_draw +a_loose),
Convert.ToString(h_win+a_win),
Convert.ToString(h_draw+a_draw),
Convert.ToString(h_loose+a_loose),
Convert.ToString(g_h_pluss + g_a_pluss) +
"-" + Convert.ToString(g_h_minus + g_a_minus),
Convert.ToString(h_win*3 +h_draw +a_win*3 +a_draw )
);
return S;
}
public bool IsBetter(Team T)
{
if(TotalPoints>T.TotalPoints)
return true;
if (TotalPoints == T.TotalPoints)
return GoalDiff > T.GoalDiff;
return false;
}
public String TeamName
{
get { return Name; }
}
public int TotalPoints
{
get { return h_win * 3 + h_draw + a_win * 3 + a_draw; }
}
public int GoalDiff
{
get{ return g_h_pluss+g_a_pluss-g_h_minus-g_a_minus;}
}
}
}
Databasen er bygget opp slik:
|
create database fotball; use fotball; create table sesong( sesong_id YEAR PRIMARY KEY NOT NULL, beskrivelse TEXT ); create table land( land_id CHAR(2) PRIMARY KEY, navn VARCHAR(30), beskrivelse TEXT ); create table lag( lag_id VARCHAR(35) PRIMARY KEY, navn VARCHAR(30), land_id CHAR(2), beskrivelse VARCHAR(100) ); create table kamp( kamp_id INT AUTO_INCREMENT, liga_id VARCHAR(35), h_lag_id VARCHAR(35), b_lag_id VARCHAR(35), h_maal INT, b_maal INT, kamp_dato DATE, PRIMARY KEY(kamp_id), UNIQUE(kamp_dato,h_lag_id,b_lag_id) ); create table liga( liga_id VARCHAR(35) PRIMARY KEY, sesong_id YEAR, land_id CHAR(2), nivaa INT, antall_aar INT, tittel VARCHAR(40), beskrivelse TEXT); create table lag_i_liga( lag_i_liga_id INT PRIMARY KEY AUTO_INCREMENT, liga_id VARCHAR(35), lag_id VARCHAR(35), UNIQUE(liga_id,lag_id) ); |


