はじめに
本連載では、
前回は、
単純にC#に移植したコード
なるべくVB6のコードに近い形で移植しました。
各メンバ名、
まずは、
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb; // 追加
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
//*************************************************************
/// <summary>電話帳サンプルソフトフォーム</summary>
//*************************************************************
public partial class Form1 : Form
{
private OleDbConnection dbConnection;
private const string FILENAME = @"c:\Database.mdb";
//*************************************************************
///<summary>コンストラクタ</summary>
//*************************************************************
public Form1()
{
InitializeComponent();
}
//*************************************************************
// イベント処理用メソッド
//*************************************************************
private void addButton_Click(object sender, EventArgs e)
{
if (!AddLogic()) return;
ClearData();
}
private void closeButton_Click(object sender, EventArgs e)
{
Close();
}
private void Form1_Load(object sender, EventArgs e)
{
ConnectDatabase();
codeTextBox.Text = "";
ClearData();
}
private void Form1_FormClosed(
object sender, FormClosedEventArgs e)
{
CloseDatabase();
}
private void readButton_Click(object sender, EventArgs e)
{
ReadLogic();
}
private void updateButton_Click(object sender, EventArgs e)
{
UpdateLogic();
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (!DeleteLogic()) return;
ClearData();
}
//*************************************************************
/// <summary>名前と電話番号の表示をクリアします</summary>
//*************************************************************
private void ClearData()
{
nameTextBox.Text = "";
telephoneNumberTextBox.Text = "";
}
//*************************************************************
/// <summary>Code プロパティ</summary>
/// <remarks>CodeTextBox.Text に入力されている値です</remarks>
//*************************************************************
private int Code
{
get
{
int r = 0;
if (int.TryParse(codeTextBox.Text, out r)) return r;
return 0;
}
set
{
codeTextBox.Text = value.ToString();
}
}
//*************************************************************
/// <summary>追加処理を実行します</summary>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool AddLogic()
{
if (InvalidCode(Code))
{
MessageBox.Show("追加できませんでした");
return false;
}
AddRecord(Code);
return true;
}
//*************************************************************
/// <summary>更新処理を実行します</summary>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool UpdateLogic()
{
if (InvalidCode(Code))
{
MessageBox.Show("更新に失敗しました");
return false;
}
UpdateRecord(
Code, nameTextBox.Text, telephoneNumberTextBox.Text);
return true;
}
//*************************************************************
/// <summary>削除処理を実行します</summary>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool DeleteLogic()
{
if (InvalidCode(Code))
{
MessageBox.Show("削除に失敗しました");
return false;
}
DeleteRecord(Code);
return true;
}
次ページへ続く
//*************************************************************
/// <summary>読込み処理を実行します</summary>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool ReadLogic()
{
object[] record = ReadRecord(Code);
if (record == null)
{
MessageBox.Show("登録されていませんでした");
return false;
}
else {
nameTextBox.Text = record[1].ToString();
telephoneNumberTextBox.Text = record[2].ToString();
return true;
}
}
//*************************************************************
/// <summary>番号値が有効かどうかを検証した結果を取得します
/// </summary>
/// <param name="Value">番号の値</param>
/// <returns>結果 [True:無効 / False:有効]</returns>
//*************************************************************
private bool InvalidCode(int Value)
{
if (Value <= 0 | Value >= 100000000)
{
MessageBox.Show("番号の値が不正です");
return true;
}
else
{
return false;
}
}
//*************************************************************
/// <summary>レコードを追加します</summary>
/// <param name="code">番号</param>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool AddRecord(int code)
{
string sqlText = GetAddSqlText(code);
return ExecuteQuery(sqlText);
}
//*************************************************************
/// <summary>レコードを更新します</summary>
/// <param name="code">番号</param>
/// <param name="nameValue">名前</param>
/// <param name="telephoneNumber">電話番号</param>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool UpdateRecord(
int code, string nameValue, string telephoneNumber)
{
string sqlText = GetUpdateSqlText(
code, nameValue, telephoneNumber);
return ExecuteQuery(sqlText);
}
//*************************************************************
/// <summary>レコードを削除します</summary>
/// <param name="code">番号</param>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool DeleteRecord(int code)
{
string sqlText = GetDeleteSqlText(code);
return ExecuteQuery(sqlText);
}
//*************************************************************
// レコードを読み込みます
// Code: 番号
// Returns: RecordSet オブジェクト
//*************************************************************
private object[] ReadRecord(int code)
{
OleDbCommand cd = new OleDbCommand();
OleDbDataReader dr = null;
try
{
cd.Connection = dbConnection;
cd.CommandType = CommandType.Text;
cd.CommandText = GetSelectSqlText(code);
dr = cd.ExecuteReader();
if (dr.Read()) {
object[] r = new object[dr.FieldCount];
for(int i = 0; i < r.Length; ++i)
{
r[i] = dr.GetValue(i);
}
return r;
}
return null;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return null;
}
finally
{
if (dr != null) {
dr.Close();
dr.Dispose();
}
cd.Dispose();
}
}
//*************************************************************
// 各 SQL 文字列を取得します
// Code: 番号
// Returns: SQL 文字列
//*************************************************************
private string GetSelectSqlText(int code)
{
string s = code.ToString();
return "SELECT * FROM MyTable WHERE 番号 = " + s;
}
private string GetAddSqlText(int code)
{
return
"INSERT INTO MyTable(番号, 名前, 電話番号) VALUES(" +
code.ToString() + ", '' , '')";
}
private string GetUpdateSqlText(
int code, string nameValue, string telephoneNumber)
{
return
"UPDATE MyTable " +
"Set " +
"名前 = '" + nameValue + "', " +
"電話番号 = '" + telephoneNumber + "' " +
"WHERE 番号 = " + code.ToString();
}
private string GetDeleteSqlText(int code)
{
string s = code.ToString();
return "DELETE * FROM MyTable WHERE 番号 = " + s;
}
//*************************************************************
/// <summary>クエリーを実行します</summary>
/// <param name="sqlText">実行したい SQL 文字列</param>
/// <returns>結果 [True:成功 / False:失敗]</returns>
//*************************************************************
private bool ExecuteQuery(string sqlText)
{
OleDbCommand cd = new OleDbCommand();
try {
cd.Connection = dbConnection;
cd.CommandType = CommandType.Text;
cd.CommandText = sqlText;
cd.ExecuteNonQuery();
return true;
}
catch(Exception ex) {
MessageBox.Show(ex.Message);
return false;
}
finally{
cd.Dispose();
}
}
//*************************************************************
/// <summary>データベースへの接続を開始します</summary>
//*************************************************************
private void ConnectDatabase()
{
dbConnection = new OleDbConnection();
dbConnection.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
FILENAME;
dbConnection.Open();
}
//*************************************************************
/// <summary>データベースの接続を終了します</summary>
//*************************************************************
private void CloseDatabase()
{
dbConnection.Close();
dbConnection.Dispose();
}
}
}
現時点では、
なお、
オブジェクト指向プログラミング言語
実際にC#のコードを解説する前に、
オブジェクト指向プログラミングとは、
オブジェクト指向プログラミングと聞くと新しいもののように感じるかもしれません。
しかし、
例えば、
これらのオブジェクトを生成するためには、
例えば、
一方で、
オブジェクト指向プログラミング言語であるかどうかは、
これらについては、
基本的な構造について
以下のコードは、
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1(){}
private void addButton_Click(object sender, EventArgs e){}
:
private bool DeleteRecord(int code){}
}
}
これを見ると、
- 文字列 {}
まずは、
namespace WindowsFormsApplication1 {}
名前空間が、
サンプルコードを見ると{}の中に記述されているForm1というクラスがWindowsFormsApplication1に属していることがわかります。
また、
つまり、
public partial class Form1 : Form {}
このソフトウェアのクラスであるForm1を定義しています。
「{}」
また、
現時点では、
public Form1(){}
クラス名と同じ名前を持ち、
C#では、
Method();
Method(1, 2, 3);
private void addButton_Click(object sender, EventArgs e){}
追加ボタンがクリックされた際に呼び出される自動生成されたメソッドです。
VB6では戻り値のないメソッドはSubと記述しますが、
引数にはobject型のsenderとEventArgs型のeがあります。
senderには、
VB6では、
private bool DeleteRecord(int code){}
int型の引数を与えることでbool型の値を返すメソッドです。
VBでは戻り値のあるメソッドの場合はFunctionキーワードを記述しなければなりませんがC#では戻り値の型を記述します。
また、
なお、
各部詳細について
ここではC#特有の記述に関してをご説明します。
VB6のコードと見比べた時、
using
先頭のusing句から始まる記述ですが、
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb; // 追加
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
usingの後に記述されているSystem.~ですが、
例えば、
public partial class Form1 : Form
このクラスは、
///<summary></summary>
「//」
「///」
例えば、
/// <summary>
///
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
ここに対して、
/// <summary>レコードを追加します</summary>
/// <param name="code">番号</param>
/// <returns>結果 [True:成功 / False:失敗]</returns>
こうすることで、
private const string FILENAME = @"c:\Database.mdb";
C#では、
サンプルコードでは、
if (!AddLogic()) return;
if文は、以下のように「{}」を用いて記述しますが、1命令で済んでしまう場合は、上記のように条件式の後ろに続けて記述することもできます。 また「!」は、VB6のNotと同じ意味になります。if ()
{
// ここに真の場合に実行される命令を記述する
}
else
{
// ここに偽の場合に実行される命令を記述する
}
メソッドから抜けたい場合はreturnを記述します。
上記は、
戻り値がある場合は、
以上によって、
private int Code { get {} set {} }
プロパティを記述するには、
また、
if (int.TryParse(codeTextBox.Text, out r)) return r;
この1行に、
まずはintという型にメソッドが付加されている点についてです。
乱暴な答え方をしてしまうと、
オブジェクト指向では、
int r = 0;
if (int.TryParse(codeTextBox.Text, out r)) return r;
return 0;
TryParse()メソッドは、
このようにC#で引数に記述した変数に値を出力する場合はoutキーワードを記述します。
これによって、
codeTextBox.Text = value.ToString();
プロパティの値がvalue変数に格納されることはすでに説明しました。
しかし、
これも、
object[] record = ReadRecord(Code);
型名の後ろに[]を記述することで、
if (record == null)
recordがnullなら、
nullは、
if (Value <= 0 | Value >= 100000000)
「|」
なお、
try {} catch {} finally {}
try {}に記述されたコードで例外エラーが発生した場合は、
dbConnection.Dispose();
Dispose()メソッドを持つオブジェクトは、
次回の予定
今回は、
次回は、