リード開発メモ

大阪のソフトウェア会社です。 技術的な事柄についてのメモとしてブログを始めます。

.NET

C# ファイルのバージョンを比較する

ファイルのバージョンを比較するサンプル。

新規でソリューションも作成し、C# のコンソールアプリケーションのプロジェクトを3つ追加する。
・ConsoleApplication1
・ConsoleApplication2
・VersionCompare

ConsoleApplication1 と ConsoleApplication2 はバージョンの比較される側で、VersionCompare が比較する側という構成である。

今回はファイルバージョンで比較するので、ConsoleApplication1 プロジェクトの Properties フォルダにある AssemblyInfo.cs を開き、一番下にある AssemblyFileVersion を書き換える。

同じように ConsoleApplication2 のプロジェクトの AssemblyFileVersion も書き換える。

次にバージョンを比較する処理を VersionCompare プロジェクトの Program.cs に記述する。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace VersionCompare
{
    class Program
    {
        static void Main(string[] args)
        {
            var vi1 = System.Diagnostics.FileVersionInfo.GetVersionInfo(@"..\..\..\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe");
            var vi2 = System.Diagnostics.FileVersionInfo.GetVersionInfo(@"..\..\..\ConsoleApplication2\bin\Debug\ConsoleApplication2.exe");
 
            var version1 = new Version(vi1.FileVersion);
            var version2 = new Version(vi2.FileVersion);
 
            if (version1 > version2)
                Console.WriteLine("version1 is greater");
            else if (version1 < version2)
                Console.WriteLine("version2 is greater");
            else
                Console.WriteLine("versions are equal");
            return;
        }
    }
}

以上。

PetaPoco を使ってみる(その5)

前回、PetaPoco の Insert/Update/Delete メソッドを使ってみたが、いちいちテーブル名とプライマリーキーを指定していた。

PetaPoco の Insert/Update/Delete メソッドではこれらを省略することができる。そのためには POCO のクラス定義に、テーブル名の属性 TableName とプライマリーキー PrimaryKey を属性として指定しておく。なお、今回の例のようにテーブル名がクラス名と一致している場合は、TableName 属性を指定する必要はなさそうだ。

Product テーブルのキーである ProductId は自動インクリメントID なので、PrimaryKey 属性に「autoincrement = true」を指定している。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using PetaPoco;
 
namespace PetaPocoTest1
{
    public partial class Form1 : Form
    {
        private string connectionString = "Data Source=(local);Database=ORMTest;User ID=ORMTest_user;Password=ORMTest_password";
 
        public Form1()
        {
            InitializeComponent();
 
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Columns.AddRange(
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "ProductId",
                    Name = "ProductId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Name",
                    Name = "Name",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Price",
                    Name = "Price",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryId",
                    Name = "SubCategoryId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryName",
                    Name = "SubCategoryName",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "CategoryName",
                    Name = "CategoryName",
                }
            );
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product, SubCategory, Category, Product>(
                    (p, s, c) => { p.SubCategory = s; s.Category = c; return p; },
                    @"SELECT p.*, s.*, c.* FROM Product p 
                    INNER JOIN SubCategory s ON s.SubCategoryId = p.SubCategoryId
                    INNER JOIN Category c ON c.CategoryId = s.CategoryId"
                );
            dataGridView1.DataSource = resultList.ToList();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var newProduct = new Product() { Name = "弱虫ペダル(30)", Price = 450, SubCategoryId = 100, };
            var newProductId = db.Insert(newProduct);
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product>(
                    @"SELECT p.* FROM Product p WHERE ProductId >= @ProductId",
                    new { ProductId = 6 }
                );
            resultList.ToList().ForEach(product => {
                product.Name = "ポケットモンスター X";
                product.Price = 3918;
                product.SubCategoryId = 200;
                var newProductId = db.Update(product);
            });
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product>(
                    @"SELECT p.* FROM Product p WHERE ProductId >= @ProductId",
                    new { ProductId = 6 }
                );
            resultList.ToList().ForEach(product =>
            {
                var newProductId = db.Delete(product);
            });
        }
    }
 
    [TableName("Product")]
    [PrimaryKey("ProductId", autoIncrement = true)]
    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
        public int SubCategoryId { get; set; }
 
        [ResultColumn]
        public SubCategory SubCategory { get; set; }
        [ResultColumn]
        public string SubCategoryName { get { return SubCategory.Name; } }
        [ResultColumn]
        public string CategoryName { get { return SubCategory.Category.Name; } }
    }
 
    [TableName("SubCategory")]
    [PrimaryKey("SubCategoryId", autoIncrement = false)]
    public class SubCategory
    {
        public int SubCategoryId { get; set; }
        public string Name { get; set; }
        public int CategoryId { get; set; }
 
        [ResultColumn]
        public Category Category { get; set; }
    }
 
    [TableName("Category")]
    [PrimaryKey("CategoryId", autoIncrement = false)]
    public class Category
    {
        public int CategoryId { get; set; }
        public string Name { get; set; }
    }
}

Insert/Update/Delete メソッドが少しすっきり書けるだけであるが、POCO の定義は一度だけで、何度もInsert/Update/Delete メソッドの呼び出しを行うことを考えれば、ずいぶん助かると思う。

以上

PetaPoco を使ってみる(その4)

今回は PetaPoco を使って INSERT、UPDATE、DELETE をしてみる。

Dapper のときと同じように、フォームにボタンを3つ追加し、button2でINSERT、button3でUPDATE、button4でDELETE の処理を行う。簡単にするため、これらのボタン処理では DB を更新するだけなので、表示に反映させるためには button1 で SELECT しなおす必要がある。

なお、何度か button1 を押すことになるので、グリッドのカラムを設定する処理はコンストラクタに移動させる。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using PetaPoco;
 
namespace PetaPocoTest1
{
    public partial class Form1 : Form
    {
        private string connectionString = "Data Source=(local);Database=ORMTest;User ID=ORMTest_user;Password=ORMTest_password";
 
        public Form1()
        {
            InitializeComponent();
 
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Columns.AddRange(
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "ProductId",
                    Name = "ProductId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Name",
                    Name = "Name",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Price",
                    Name = "Price",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryId",
                    Name = "SubCategoryId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryName",
                    Name = "SubCategoryName",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "CategoryName",
                    Name = "CategoryName",
                }
            );
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product, SubCategory, Category, Product>(
                    (p, s, c) => { p.SubCategory = s; s.Category = c; return p; },
                    @"SELECT p.*, s.*, c.* FROM Product p 
                    INNER JOIN SubCategory s ON s.SubCategoryId = p.SubCategoryId
                    INNER JOIN Category c ON c.CategoryId = s.CategoryId"
                );
            dataGridView1.DataSource = resultList.ToList();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var newProduct = new Product() { Name = "弱虫ペダル(30)", Price = 450, SubCategoryId = 100, };
            var newProductId = db.Insert("Product", "ProductId", true, newProduct);
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product>(
                    @"SELECT p.* FROM Product p WHERE ProductId >= @ProductId",
                    new { ProductId = 6 }
                );
            resultList.ToList().ForEach(product => {
                product.Name = "ポケットモンスター X";
                product.Price = 3918;
                product.SubCategoryId = 200;
                var newProductId = db.Update("Product", "ProductId", product);
            });
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product>(
                    @"SELECT p.* FROM Product p WHERE ProductId >= @ProductId",
                    new { ProductId = 6 }
                );
            resultList.ToList().ForEach(product =>
            {
                var newProductId = db.Delete("Product", "ProductId", product);
            });
        }
    }
 
    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
        public int SubCategoryId { get; set; }
 
        [ResultColumn]
        public SubCategory SubCategory { get; set; }
        [ResultColumn]
        public string SubCategoryName { get { return SubCategory.Name; } }
        [ResultColumn]
        public string CategoryName { get { return SubCategory.Category.Name; } }
    }
 
    public class SubCategory
    {
        public int SubCategoryId { get; set; }
        public string Name { get; set; }
        public int CategoryId { get; set; }
 
        [ResultColumn]
        public Category Category { get; set; }
    }
 
    public class Category
    {
        public int CategoryId { get; set; }
        public string Name { get; set; }
    }
}

まず、POCO である Product クラスのプロパティのうち、データベースにないプロパティに ResultColumn 属性を付けておく。これをしないと Insert メソッドを呼んだとき、データベースに存在しないカラムということでエラーになってしまう。

INSERT では、 Insert メソッドが用意されているのでこれを使う。自動インクリメントID列もうまく処理してくれる。 Insert メソッドを呼びだした後、引数として渡した Product オブジェクトのProductId には新しく設定された ID が振られている。また、 Insert メソッドの戻り値として新しく設定された ID が取得できる。

UPDATE、DELETE に関しては、SELECT したデータを元に、Update メソッド、Delete メソッドを使うことができるので、生のSQLを書くしかなかった Dapper に比べて非常に使いやすく感じる。もちろん PetaPoco でも必要ならば Execute メソッドを使って生のSQLを実行することもできる。


以上

PetaPoco を使ってみる(その3)

今回は PetaPoco を使って 3 テーブルを JOIN してデータ取得してみる。

やはりテーブル定義などは Dapper のときと同じなので、そちらの記事を参照してほしい。
Dapper を使ってみる(その1)
Dapper を使ってみる(その2)
Dapper を使ってみる(その3)

3 テーブルを JOIN した場合のコードは以下のようになる。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using PetaPoco;
 
namespace PetaPocoTest1
{
    public partial class Form1 : Form
    {
        private string connectionString = "Data Source=(local);Database=ORMTest;User ID=ORMTest_user;Password=ORMTest_password";
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product, SubCategory, Category, Product>(
                    (p, s, c) => { p.SubCategory = s; s.Category = c; return p; },
                    @"SELECT p.*, s.*, c.* FROM Product p 
                    INNER JOIN SubCategory s ON s.SubCategoryId = p.SubCategoryId
                    INNER JOIN Category c ON c.CategoryId = s.CategoryId"
                );
 
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Columns.AddRange(
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "ProductId",
                    Name = "ProductId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Name",
                    Name = "Name",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Price",
                    Name = "Price",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryId",
                    Name = "SubCategoryId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryName",
                    Name = "SubCategoryName",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "CategoryName",
                    Name = "CategoryName",
                }
            );
 
            dataGridView1.DataSource = resultList.ToList();
        }
    }
 
    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
        public int SubCategoryId { get; set; }
 
        public SubCategory SubCategory { get; set; }
        public string SubCategoryName { get { return SubCategory.Name; } }
        public string CategoryName { get { return SubCategory.Category.Name; } }
    }
 
    public class SubCategory
    {
        public int SubCategoryId { get; set; }
        public string Name { get; set; }
        public int CategoryId { get; set; }
 
        public Category Category { get; set; }
    }
 
    public class Category
    {
        public int CategoryId { get; set; }
        public string Name { get; set; }
    }
}

変更内容は Dapper のときとほぼ同じである。

PetaPoco.cs を見てみると、4つまでのテーブルの JOIN をサポートしているようだ。Dapper が6つまでをサポートしているのでこの点は Dapper に軍配が上がる。5つ以上の JOIN をする場面はあまりないとは思うが。。。

以上。

PetaPoco を使ってみる(その2)

前回は PetaPoco を使ってひとつのテーブルからデータを取得したが、今回は JOIN した場合をやってみる。

使うデータベースは Dapper と同じなので以下を参照のこと。
Dapper を使ってみる(その1)
Dapper を使ってみる(その2)

PetaPoco で JOIN したデータを取得するのは以下のようになる。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using PetaPoco;
 
namespace PetaPocoTest1
{
    public partial class Form1 : Form
    {
        private string connectionString = "Data Source=(local);Database=ORMTest;User ID=ORMTest_user;Password=ORMTest_password";
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            var db = new PetaPoco.Database(connectionString, "System.Data.SqlClient");
            var resultList = db.Query<Product, SubCategory, Product>(
                    (p, s) => { p.SubCategory = s; return p; },
                    @"SELECT p.*, s.* FROM Product p 
                    INNER JOIN SubCategory s ON s.SubCategoryId = p.SubCategoryId"
                );
 
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Columns.AddRange(
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "ProductId",
                    Name = "ProductId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Name",
                    Name = "Name",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "Price",
                    Name = "Price",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryId",
                    Name = "SubCategoryId",
                },
                new DataGridViewTextBoxColumn()
                {
                    DataPropertyName = "SubCategoryName",
                    Name = "SubCategoryName",
                }
            );
 
            dataGridView1.DataSource = resultList.ToList();
        }
    }
 
    public class Product
    {
        public int ProductId { get; set; }
        public string Name { get; set; }
        public int Price { get; set; }
        public int SubCategoryId { get; set; }
 
        public SubCategory SubCategory { get; set; }
        public string SubCategoryName { get { return SubCategory.Name; } }
    }
 
    public class SubCategory
    {
        public int SubCategoryId { get; set; }
        public string Name { get; set; }
        public int CategoryId { get; set; }
    }
}

すこし引数の順番が違ったりするが、考え方は Dapper と同じだ。Product クラスに SubCategory クラスへの参照が追加する点も Dapper と同じ。ただ、Dapper に比べて PetaPoco のほうが若干シンプルに書けるように思う。

以上。

アクセスカウンター
  • 今日:
  • 昨日:
  • 累計: