Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

C#からMDBを扱う


MDBの扱いまとめ。

まず別プログラムで空のMDBを作成しておく。

次に、プロジェクトを作成し、

1. ADOのCOMへの参照を追加。"Microsoft ADO Ext. 2.8 for DDL and Security"

2. メニューの「データ」->「新しいデータソース」で、データソース構成ウィザードを起動する。
データソースの種類を選択する。「データベース」を選択する。
データベースモデルを選択する。「データセット」を選択する。
データ接続を選択する。「新しい接続」ボタンを押す。
「接続の追加」ウィンドウが表示されるので、データソースの「変更」ボタンを押して、
Microsoft Access データベース ファイル」を選択する。
使用するMDBファイルを選択する。
OKを押して、構成ウィザードで「次へ」で進めるが、その画面の接続文字列をコピーしておくと便利。
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MajCalc.MDB"
接続文字列をアプリケーション構成ファイルに保存しますか?のオプションはYesのままで「次へ」。
"MajCalcConnectionString"
データベースオブジェクトを選択する。必要なテーブルを選択する。
データセット名は、
"MajCalcDataSet"などとなる。

3. データセットを編集。
AutoIncrementしたいId等があれば、AutoIncrementSeed, AutoIncrementStepをそれぞれ"-1"から"1"に変更しておいたほうがいいかもしれない。

4. モデルを作成。
必要であればLINQ to SQLクラスをソリューションに追加する。
"MajCalcDataClasses1.dbml"など。
MDBはORデザイナでサポートされていないので、自分でツールボックスからクラスを追加してテーブルとプロパティを再現する。プロパティは追加するとデフォルトでstringになるのでintに変更などする。
ソースも自分で設定する?->する必要なかった。

5. データソースからテーブルをフォームに追加する。
BindingNavigaterを付けたいテーブルから先に追加したほうがラクかもしれない。

ってことで説明がいい加減ですし必要ないことまでしてるかもしれませんがとりあえずこれで動きましたってことで;;
以下にソースを添付しときます。以上です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

// devSakujyo
using System.Data.OleDb;
// devSakujyo

namespace MajCalcKakuduke
{
    public partial class Form1 : Form
    {
        OleDbConnection conn;
        MajCalcDataClasses1DataContext db;

        public Form1()
        {
            InitializeComponent();
        }

        private void playersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.playersBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.majCalcDataSet);

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: このコード行はデータを 'majCalcDataSet.Taisens' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            this.taisensTableAdapter.Fill(this.majCalcDataSet.Taisens);
            // TODO: このコード行はデータを 'majCalcDataSet.Players' テーブルに読み込みます。必要に応じて移動、または削除をしてください。
            this.playersTableAdapter.Fill(this.majCalcDataSet.Players);

            this.Left = 64;
            this.Top = 64;

            //conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MajCalc.MDB");
            conn = new OleDbConnection(Properties.Settings.Default.MajCalcConnectionString);
            db = new MajCalcDataClasses1DataContext(conn);
            tbPlayerName.Focus();
            tbPlayerName.Text = "";
        }

        private void taisensBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.taisensBindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.majCalcDataSet);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            majCalcDataSet.Players.AddPlayersRow(tbPlayerName.Text);
            tbPlayerName.Clear();
        }

        private void tbPlayerName_TextChanged(object sender, EventArgs e)
        {
            var players = db.Players;

            List<Player> candidates = new List<Player>();
            var query = from p in players
                        where p.Name.Contains(tbPlayerName.Text)
                        select new Player(p.Id, p.Name)
                        ;
            listBox1.Items.Clear();
            foreach (var item in query)
            {
                listBox1.Items.Add(item);
                candidates.Add(item);
            }

            if (listBox1.Items.Count > 0)
            {
                listBox1.SelectedIndex = 0;
            }
        }

        private void myClear()
        {
            tbPlayerName.Clear();
            tbPlayerName.Focus();
        }

        private void button7_Click(object sender, EventArgs e)
        {
            listBox2.Items.Clear();
            myClear();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (listBox1.SelectedIndex >= 0)
            {
                listBox2.Items.Add(listBox1.SelectedItem);
                myClear();
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            if (listBox2.Items.Count != 4)
            {
                // TODO: ダイアログを出すようにしたい
                return;
            }

            DateTime date = monthCalendar1.SelectionStart;

            System.Collections.IEnumerator candEnum = listBox2.Items.GetEnumerator();
            candEnum.MoveNext();
            int cand1 = ((Player)candEnum.Current).Id;
            candEnum.MoveNext();
            int cand2 = ((Player)candEnum.Current).Id;
            candEnum.MoveNext();
            int cand3 = ((Player)candEnum.Current).Id;
            candEnum.MoveNext();
            int cand4 = ((Player)candEnum.Current).Id;

            majCalcDataSet.Taisens.AddTaisensRow(cand1, cand2, cand3, cand4, monthCalendar1.SelectionStart);

            listBox2.Items.Clear();
            myClear();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            int year, month, day;
            DateTime next1stDay;

            Dictionary<int, Player> calcPlayers = new Dictionary<int,Player>();

            var players = db.Players;

            foreach (var item in players)
	        {
		        calcPlayers.Add(item.Id, new Player(item.Id, item.Name));
	        }
            year = monthCalendar1.SelectionStart.Year;
            month = monthCalendar1.SelectionStart.Month;
            day = 1;
            if (month < 12)
            {
                month = month + 1;
            }
            else
            {
                month = 1;
                year = year + 1;
            }
            next1stDay = new DateTime(year, month, day);
            year = monthCalendar1.SelectionStart.Year;
            month = monthCalendar1.SelectionStart.Month;

            var taisens = db.Taisens;

            var query2 = from t in taisens
                        where new DateTime(year, month, day) <= t.Taisenbi && t.Taisenbi < next1stDay
                        select new
                        {
                            t.Id,
                            t.Player1,
                            t.Player2,
                            t.Player3,
                            t.Player4
                        };
            foreach (var item in query2)
            {
                try
                {
                    Player p1, p2, p3, p4;
                    calcPlayers.TryGetValue(item.Player1, out p1);
                    p1.IncPrise1();
                    calcPlayers.TryGetValue(item.Player2, out p2);
                    p2.IncPrise2();
                    calcPlayers.TryGetValue(item.Player3, out p3);
                    p3.IncPrise3();
                    calcPlayers.TryGetValue(item.Player4, out p4);
                    p4.IncPrise4();
                }
                catch (Exception)
                {
                    
                    throw;
                }
            }

            //2種類の出力を出す。mixi貼り付け用は、ポイント順に並べ替えて出す。
            textBox1.Clear();
            textBox1.AppendText("名前\tID\t1位\t2位\t3位\t4位\t打数\tポイント\tトップ率\t連対率\t平均順位\t規定打数\n");

            var query3 = from p in calcPlayers
                         where p.Value.dasuu > 0
                         orderby p.Value.point descending
                         select p.Value;
            //IOrderedEnumerable<Player> eP = calcPlayers.OrderByDescending<Player, int>(x => x.Value.point);
            foreach (var p in query3)
            {
                textBox1.AppendText(string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8:F3}\t{9:F3}\t{10:F3}\t{11}\n",
                    p.Name, p.Id, p.prise1, p.prise2, p.prise3, p.prise4, p.dasuu, p.point, p.topRatio, p.rentaiRatio, p.avPrise, p.kiteidasuu));
            }
            textBox1.Focus();
            textBox1.SelectAll();

            var query4 = from p in calcPlayers
                         //where p.Value.dasuu > 0
                         orderby p.Value.Id ascending
                         select p.Value;

            textBox2.Clear();
            foreach (var p in query4)
            {
                textBox2.AppendText(string.Format("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7:F3}\t{8:F3}\t{9:F3}\t{10}\n",
                    p.Name, p.point, p.prise1, p.prise2, p.prise3, p.prise4, p.dasuu, p.topRatio, p.rentaiRatio, p.avPrise, p.kiteidasuu));
            }
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            textBox1.SelectAll();
            textBox1.Copy();
            textBox1.Clear();
            textBox1.AppendText("クリップボードにコピーしました");
        }

        private void textBox2_Enter(object sender, EventArgs e)
        {
            textBox2.SelectAll();
            textBox2.Copy();
            textBox2.Clear();
            textBox2.AppendText("クリップボードにコピーしました");
        }
    }

    public class Player : Players
    {
        public int point;
        public int prise1;
        public int prise2;
        public int prise3;
        public int prise4;
        public decimal dasuu;
        public decimal topRatio;
        public decimal rentaiRatio;
        public decimal avPrise;
        public string kiteidasuu;

        public Player(int id, string name)
        {
            this.Id = id;
            this.Name = name;
            prise1 = 0;
            prise2 = 0;
            prise3 = 0;
            prise4 = 0;
            recalc();
        }

        public void IncPrise1()
        {
            prise1++;
            recalc();
        }

        public void IncPrise2()
        {
            prise2++;
            recalc();
        }

        public void IncPrise3()
        {
            prise3++;
            recalc();
        }

        public void IncPrise4()
        {
            prise4++;
            recalc();
        }

        private void recalc()
        {
            dasuu = prise1 + prise2 + prise3 + prise4;
            point = 6 * prise1 + 1 * prise2 - 2 * prise3 - 5 * prise4;
            if (dasuu == 0)
            {
                topRatio = 0;
                rentaiRatio = 0;
                avPrise = 0;
            }
            else
            {
                topRatio = prise1 / dasuu;
                rentaiRatio = (prise1 + prise2) / dasuu;
                avPrise = (1 * prise1 + 2 * prise2 + 3 * prise3 + 4 * prise4) / dasuu;
            }
            kiteidasuu = dasuu >= 20 ? "1" : "-";
        }

        public override string ToString()
        {
            return this.Name;
        }
    }
}