プログラムの概要
オブジェクト型の変数宣言を行い、コード上で、データベ ースに接続し、SQL を発行する。 今回は、オブジェクト型の変数宣言に依り、データベース と接続する為のオブジェクト、及び、検索文を発行した際 にデータを格納するオブジェクトを、コード上で生成して データベースに接続し、各レコードのフィールド情報を取 得して、其れをコンボボックスの項目に追加する。此れに 依り、選択項目を、手入力では無く、コンボボックスのリ ストより選択する事が出来る様に成り、操作性が格段に向 上する。 亦、データ入力に依り、自動的に更新される可きデータを 自動で更新する事が出来る様にする。即ち、此処では、カ テゴリ別のデータ数を、自動的に更新する機能を付加する。データベース操作プログラムⅡ
C# 2005 ⑨ □ 構造体の宣言(private、structure) □ プロパティの利用(CursorLocation、ConnectionString、RecordCount、Fields、EOF) □ プロパティの利用(DataSource、Tag、Width、Height、ItemData) □ メソッドの利用(Open、Execute、Close、MoveNext、Items.Add、SubString) □ オブジェクトの破棄(オブジェクト変数 = null) □ 組込関数の利用(Val、Space) □ 制御構造構文(ループ while ( ~ ) { … }、条件分岐 switch ( ~ ) { … }) □ サブルーチン(新規プロシージャ、メソッド) 今回の課題項目 □ 構造体の宣言(private、structure) □ ADODB.Connection(Open、Execute、Close) □ ADODB.Recordset(Open、Close、MoveNext、RecordCount、Fields、EOF) □ SQL 文(SELECT 文:レコードを検索する文、UPDATE 文:レコードを更新する文) 今回の重点項目 □ 様々な SQL 文を試してみる。 今回の応用項目■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 ラベル1 Name lblID Text ID ラベル2 Name lblTitle Text タイトル ラベル3 Name lblPrice Text 価格 ラベル4 Name lblCategory Text カテゴリ ラベル5 Name lblWriter Text 著者 テキストボックス1 Name txtID BackColor White ReadOnly True Text 空白 テキストボックス2 Name txtTitle Text 空白 テキストボックス3 Name txtPrice Text 空白 コンボボックス1 Name cboCategory Text 空白 テキストボックス1 テキストボックス2 テキストボックス3 コンボボックス1 コンボボックス2 ラベル1 ラベル2 ラベル3 ラベル4 ラベル5 ボタン1 ボタン3 ボタン2 前回作成したプログラムを基に追加する。
コントロールの種類 プロパティ プロパティの設定値 コンボボックス2 Name cboWriter Text 空白 ボタン1 Name btnInsert Text 追加 Tag 0 ボタン2 Name btnUpdate Text 変更 Tag 1 ボタン3 Name btnDelete Text 削除 Tag 2 ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したりす る事は出来ない。 テキストボックス テキストの入力や表示を行うコントロール。此のテキストは、ユーザーが直接入力したり変更 したりする事が出来る。 コンボボックス 選択肢の一覧を表示するコントロール。此の一覧より値を選択する事と、テキストボックスに 直接値を入力する事が出来る。 ボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OKボタンや実行ボタ ン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールです。 コントロールの Anchor プロパティを利用すると フォームのサイズ変更に合わせて、コントロール の大きさを変える事が出来る。 フォームとの距離を一定に保つ方向を、クリック して設定する。初期状態では、上方向と左方向が 設定されて居るが、此れに、下方向と右方向を加 えると、フォームのサイズ変更に合わせて、コン トロールも大きさを変える事に成る。 VB6 でのコンボボックスの ItemData プロパティは廃止された。
VB6 での cboCategory.ItemData(I) = Val(Rs1.Fields("ID") & "")と同等の事を C# で行うには Microsoft Visual Basic .NET Compatibility Runtime を参照設定した上で、下記の様に記述する。 Microsoft.VisualBasic.Compatibility.VB6.SetItemData(cboCategory, I, Val(Rs1.Fields("ID").Value & ""))
■ プログラムリスト(追加分) ■
namespace bookshelf {
public partial class bookshelf : Form {
// 構造体の宣言【追加】 private struct Category {
public int id; public int total; }
// 構造体型の動的配列の宣言【追加】 private Category[ ] cate;
ADODB.Connection cn; ADODB.Recordset rs; public bookshelf( ) { InitializeComponent( ); } // フォームが読み込まれた時の処理
private void bookshelf_Load( object sender, EventArgs e ) { // コネクションとレコードセットのインスタンス生成 cn = new ADODB.Connection( ); rs = new ADODB.Recordset( ); // コネクションの確立(データベースへの接続) cn.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
cn.Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data.mdb;", "", "", 0 );
// 選択クエリに依るレコードセットの取得
rs.Open( "SELECT 本.*,著者.著者名 FROM 本,著者 WHERE 本.著者 ID=著者.ID;", cn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1 ); // データグリッドへの連結 dgdBookshelf.DataSource = ( msdatasrc.DataSource ) rs; // サブルーチンコール【追加】 CboAddItem( ); CateUpdate( ); } Structure ステートメントは、1 個又は複数の要素を持つデータ型 を宣言する。通常、レコード内の フィールド定義に用いられる。 頻繁に行う処理は、名前を付け、 一纏めに仕て置き、其の処理を必 要とする箇所よりコール(呼出) する事で、対象のコードを実行す る事が出来る。 各要素のスコープはpublicでない と、構造体の外部からアクセスす る事は出来ない。 宣言した構造体は、通常のデータ 型と同じ様に使用出来る。 オブジェクト変数のインスタンス を生成するには、New キーワード を用いて行う事が出来る。 AxDataGrid の Datasource プロ パティにレコードセットをセット する事で、データをバインドする。 クラス名と同じ名前のメソッド は、コンストラクタと呼ばれ、ク ラスのインスタンスを生成し、初 期化するメソッドで有る。 此処でprivate 宣言した変数は同 じフォームモジュール内の総ての プロシージャで値の参照と設定を 行う事が出来る。
// コンボボックスにアイテムを追加するジェネラルプロシージャ【追加】 private void CboAddItem( )
{
ADODB.Recordset rs1 = new ADODB.Recordset( ); string sql = ""; string s = ""; // カテゴリ項目を取得しコンボボックスに設定 sql = "SELECT * FROM カテゴリ;"; rs1.Open( sql, cn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1 ); if ( rs1.RecordCount > 0 ) { while ( !rs1.EOF ) {
s = " " + rs1.Fields[ "ID" ].Value;
s = s.Substring( s.Length - 3 ) + ":" + rs1.Fields[ "カテゴリ名" ].Value; cboCategory.Items.Add( s ); rs1.MoveNext( ); } } rs1.Close( ); // 著者項目を取得しコンボボックスに設定 sql = "SELECT * FROM 著者;"; rs1.Open( sql, cn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1 ); if ( rs1.RecordCount > 0 ) { while ( !rs1.EOF ) {
s = " " + rs1.Fields[ "ID" ].Value;
s = s.Substring( s.Length - 3 ) + ":" + rs1.Fields[ "著者名" ].Value; cboWriter.Items.Add( s ); rs1.MoveNext( ); } } rs1.Close( ); // オブジェクトとの関連付けを解除 rs1 = null; } オブジェクト変数を宣言する時に New キーワードを指定して、宣言 時に、オブジェクトの新しいイン スタンスが作成する事も出来る。 データベースから Null を取得し た場合、文字列変数に代入する事 は出来ないが、文字列と結合する 事で文字列にキャストされ、文字 列変数に代入する事が出来る。 コンボボックスにリストを追加す るには、Items コレクションに対 してAdd メソッドを使用する。 従 来 の 様 に コ ン ボ ボ ッ ク ス に ItemData に数値を格納する事が 出来ない為、ID フィールドの値を リストに付加して居る。 取得したレコード数は、レコード セットの RecordCount プロパテ ィで取得する事が出来る。 使用済のレコードセットは、Close しないと、再度Open した時に例 外が発生する。 オブジェクト型変数は使用終了し た時点で Null を代入して関連付 けを解除しないと、使用して居る メモリが開放されない。 MoveNext は、レコードセット内 で次のレコードにカレントレコー ドを移動するメソッドで有る。 レコードセットの終端に達すると EOF は true に成る。 此れは、カテゴリテーブルから総 てのフィールドを抽出する SQL 文で有る。
// カテゴリ別データ数を更新するジェネラルプロシージャ【追加】 private void CateUpdate( )
{
ADODB.Recordset rs1 = new ADODB.Recordset( ); ADODB.Recordset rs2 = new ADODB.Recordset( ); string sql = ""; // カテゴリ別データ数の更新 sql = "SELECT ID FROM カテゴリ;"; rs1.Open( sql, cn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1 ); if ( rs1.RecordCount > 0 ) {
cate = new Category[ rs1.RecordCount + 1 ]; for ( int i = 1; i <= rs1.RecordCount; i++ ) {
cate[ i ].id = System.Convert.ToInt32( rs1.Fields[ "ID" ].Value + "" ); sql = "SELECT COUNT(ID) AS 合計 FROM 本" +
" WHERE カテゴリ ID=" + cate[ i ].id.ToString( ) + ";"; rs2.Open( sql, cn, ADODB.CursorTypeEnum.adOpenForwardOnly, ADODB.LockTypeEnum.adLockReadOnly, 1 );
if ( rs2.RecordCount > 0 ) {
cate[ i ].total = System.Convert.ToInt32( rs2.Fields[ "合計" ].Value + "" ); sql = "UPDATE カテゴリ SET トータル=" + cate[ i ].total.ToString( ) + " WHERE ID=" + cate[ i ].id.ToString( ) + ";";
object n = ( object ) 1; cn.Execute( sql, out n, 1 ); } rs2.Close( ); rs1.MoveNext( ); } } rs1.Close( ); // オブジェクトとの関連付けを解除 rs2 = null; rs1 = null; } 数値型のフィールドデータを取得 する際には、正しくデータ型を変 換する必要が有る。 オブジェクト変数を宣言する時に New キーワードを指定すると、実 行時に、オブジェクトへの参照を 代入する必要は無い。 オブジェクト型変数は使用終了し た時点で Null を代入して関連付 けを解除しないと、使用して居る メモリが開放されない。 1行分のレコードを処理しても自 動的に次のレコードに移動する訳 では無い。MoveNext メソッドで 次のレコードに移動する。 データベースのレコードを取得し格納する変数の様に配列の要素数を事前に決定出来ない場合は、 動的配列を使用し、要素数が判明した時点で要素数を指定してインスタンスを生成する。
private Category[ ] cate;
…
cate = new Category[ rs1.RecordCount + 1 ];
此れは、カテゴリテーブルからID
フィールド而巳を抽出する SQL
Structure ステートメントに依る独自のデータ型の作成 (再掲・部分) 構造体(ユーザー定義型)を作成するステートメント Structure 構造体名 { Public|Private データ型 要素名1; Public|Private データ型 要素名2; … } C#がサポートする複数のデータ型を組み合わせて、独自のデータ型を作成する。 構造体は、ランダムファイルアクセスやAPI 関数呼出用構造体定義等、データ型の異なる多数の関連す る要素で構成されるデータレコードで良く使用される。亦、各要素には、配列を指定する事も出来、静 的配列と動的配列の孰れも使用する事が出来る。猶、データ型は、Option Strict が On に成って居る場 合、必ず指定し、省略する事は出来ない。 Structure ステートメントを記述する事が出来るのは、モジュール、名前空間、又は、ファイルレベル 丈で有る。詰まり、構造体は、ソースファイル内、又は、モジュール、インターフェイス、クラスの中 では宣言する事が出来るが、プロシージャの中では宣言する事は出来ない。亦、構造体の内部で別の構 造体を定義する事が出来るが、外側の構造体を通して内側の構造体のメンバにアクセスする事は出来な い。内側の構造体のメンバにアクセスするには、内側の構造体のデータ型の変数を宣言する必要が有る。 ※ 以前のバージョンの Visual Basic(VB6)でサポートされて居たユーザー定義型(User-Defined Type)は、Visual Basic.NET 以降や C#では構造体に統合された。 オブジェクト型変数の宣言 オブジェクトクラスに対して変数を宣言する オブジェクトクラス名 変数名 [ = new オブジェクトクラス名( ) ] ; オブジェクトをコードで使用する為に、対象のタイプライブラリに依り提供されるクラス名 を変数宣言の中で指定し、オブジェクトを変数に格納する 宣言ステートメントには、public、protected、friend、protected friend、private、shared、static 等 の有効範囲も使用する事が出来る。 データ型には、オブジェクトクラス(オブジェクトのインスタンスが生成されるクラス)を指定するが プロシージャが実行される迄、オブジェクトクラスが解らない場合等は、オブジェクト型(Object)を 使用してオブジェクト変数を宣言する事も出来る。 オブジェクト型(Object)の変数は、オブジェクトを参照する 32 ビット(4 バイト)のアドレスと仕て 格納される(即ち、オブジェクト変数に格納した値は、メモリ内の他の場所に保持され、変数自体はデ ータへのポインタを保持する)。オブジェクト型と仕て宣言した変数には、任意の参照型(文字列、配 列、クラス、インターフェイス)を割り当てる事が出来る。 new キーワードを使用してオブジェクト変数を宣言すると、クラスのインスタンスが宣言時に作成され るが、整数型や倍精度浮動小数点型等の値型とは異なり、オブジェクトは参照型で有り、使用する前に 明示的にインスタンスを作成して置く必要が有る。 機 能 書 式 解 説 機 能 書 式 解 説
ADODB.Connection オブジェクト データベースと接続する為のオブジェクト Connection オブジェクトは、データソースへの接続を表し、データソースとの固有のセッ ションを表す。クライアントサーバーデータベースシステムの場合、此のオブジェクトは サーバーへの実際のネットワークに対応する。 ADODB.Connection の Open メソッド データソースへの接続を開くメソッド Connection.Open( 引数1,引数2,引数3,引数4 ) データソースへの物理的な接続を設定する。此のメソッドが完了すると接続状態が確立し、 コマンドを発行して結果を処理する事が出来る。 引数1には、接続情報(ConnectionString)を指定し、省略する事が出来る。 引数2には、接続を確立する際に必要なユーザー名を指定し、省略する事が出来る。 引数3には、接続を確立する際に必要なパスワードを指定し、省略する事が出来る。 引数4には、同期接続、非同期接続の孰れかを示す定数を指定し、省略する事が出来る。 ※ C# から使用する場合は、総ての引数を指定する必要が有る。 ADODB.Connection の Execute メソッド 指定されたクエリ、SQL ステートメント、ストアドプロシージャ等を実行するメソッド Connection.Execute( 引数1,引数2,引数3 ) 指定した接続上で、引数1で指定されたメソッドに渡すクエリが実行される。 引数1には、実行するSQL ステートメント、テーブル名等を指定し、必ず指定する。 引数2には、プロバイダが返す操作の結果を反映するレコード数を指定し、省略する事が出来る。 引数3には、プロバイダが引数1を評価する方法を示す定数を指定し、省略する事が出来る。 ※ C# から使用する場合は、総ての引数を指定する必要が有る。 ADODB.Connection の Close メソッド 開いて居るオブジェクト、及び、依存する総てのオブジェクトを閉じるメソッド Connection.Close( ) Connection オブジェクト、又は、Recordset オブジェクトを閉じて、関連するシステムリソ ースを解放する。 オブジェクトを閉じてもメモリからは削除されず、プロパティ設定を変更してもう一度開く事が出来る。 メモリからオブジェクトを完全に削除するには、オブジェクト変数をnull に設定する。 機 能 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
ADODB.Recordset オブジェクト 検索文を発行した際にデータを格納する為のオブジェクト Recordset オブジェクトは、基に成るテーブルからのレコードセット全体、又は、コマンド の実行に依り返された結果のレコードを表し、常にレコードセット内の1つのレコード而巳 をカレントレコードと仕て参照する。亦、Recordset オブジェクトは、レコード(行)とフィールド(列) で構成される。Recordset オブジェクトは必要な丈、作成する事が出来る。 ADODB.Recordset の Open メソッド カーソルを開くメソッド Recordset.Open( 引数1,引数2,引数3,引数4,引数5 ) ベーステーブルからのレコード、クエリ結果、又は、以前に保存されたRecordset を表すカ ーソルを開く事が出来る。 引数1には、実行するSQL ステートメント、テーブル名等を指定し、省略する事が出来る。 引数2には、有効なConnection オブジェクト変数名を指定し、省略する事が出来る。 引数3には、Recordset を開く際にプロバイダが使うカーソルタイプを指定し、省略する事が出来る。 引数4には、Recordset を開く際にプロバイダが使うロックの種類を指定し、省略する事が出来る。 引数5には、プロバイダが引数1を評価する方法を示す定数を指定し、省略する事が出来る。 ※ C# から使用する場合は、総ての引数を指定する必要が有る。 ADODB.Recordset の MoveNext メソッド 指定のRecordset オブジェクトの次のレコードに移動して、其のレコードをカレントレコー ドにするメソッド Recordset.MoveNext( ) カレントレコードの位置をRecordset の末尾に向かい1レコード進める。 カレントレコードが最後のレコードの場合に MoveNext メソッドを呼び出すと、カレントレコードが Recordset の最後のレコードの後に設定され、EOF が True に成る。EOF プロパティが既に True の場 合、前方へ移動しようとするとエラーが発生する。 カレントレコードの位置を変更するには、他に下記のメソッドが有る。 MoveFirst Recordset の最初のレコードに移動する。 MoveLast Recordset の最後のレコードに移動する。 MovePrevious Recordset の先頭に向かい1レコード戻る。 前方スクロール而巳可能なレコードセットで両方向スクロールのサポートが必要な場合、CacheSize プ ロパティを使用してカーソルの後方スクロールをサポートするレコードキャッシュを作成し、Move メ ソッドを使用して移動する事が出来る。キャッシュされたレコードはメモリにロードされる為、必要以 上のレコードのキャッシュは避ける可きで有る。前方スクロール而巳可能なレコードセットで MoveFirst メソッドを呼び出す事は出来るが、其の結果、Recordset オブジェクトを生成するコマンド をプロバイダが再度実行する可能性が有る。 機 能 解 説 機 能 書 式 解 説 機 能 書 式 解 説
ADODB.Recordset の Close メソッド 開いて居るオブジェクト、及び、依存する総てのオブジェクトを閉じるメソッド Recordset.Close( ) Connection オブジェクト、又は、Recordset オブジェクトを閉じて、関連するシステムリソ ースを解放する。 オブジェクトを閉じてもメモリからは削除されず、プロパティ設定を変更してもう一度開く事が出来る。 メモリからオブジェクトを完全に削除するには、オブジェクト変数をNothing に設定する。 ADODB.Recordset の RecordCount プロパティ Recordset オブジェクトに存在する現在のレコード数を示すプロパティ Recordset.RecordCount Recordset オブジェクトに有るレコード数を調べる為に使用する。レコード数が解ら無い場 合、又は、プロバイダやカーソルの種類がRecordCount をサポートして居ない場合は、プ ロパティは-1を返す。閉じて居るRecordset 上で RecordCount プロパティを読み込むと、エラーが 発生する。 ADODB.Recordset の Fields プロパティ フィールドデータを示すプロパティ(コレクション) Recordset.Fields( 引数 ) 引数で指定したフィールドを示す。当該フィールドデータの値は、Value プロパティで参照 する事が出来る。 引数には、フィールド名を示す文字列、又は、序数を指定し、必ず指定する。 ADODB.Recordset の EOF プロパティ カレントレコードの位置が最後のレコードより後に有る事を示すプロパティ Recordset.EOF カレントレコードの位置が最後のレコードより後に有る場合は True を返し、カレントレコ ードの位置が最後のレコード上、又は、其れ以前に有る場合はFalse を返す。 猶、BOF プロパティは、カレントレコードの位置が最初のレコードより前に有る場合は True を返し、 カレントレコードの位置が最初のレコード上、又は、其れ以降にある場合はFalse を返す。
BOF 及び EOF プロパティは、Recordset オブジェクトがレコードを含むか何うか、又は、他のレコー ドに移動した時にRecordset オブジェクトの限界を超えて居ないか何うかを調べる為に使用する。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
ADO では次の4種類のカーソルが定義されて居る。 1.動的カーソル:他のユーザーに依る追加、変更、及び、削除を見る事が出来、ブックマークに依存しない、 Recordset での所有る種類の移動を行う事が出来る。プロバイダがブックマークをサポートする場合は、ブッ クマークを使用する事が出来る。 2.キーセットカーソル:動的カーソルと同じ様な属性を持つが、他のユーザーが追加したレコードを表示せず、 他のユーザーが削除したレコードへのアクセスを許可し無い。他のユーザーが変更したデータは表示する事が 出来る。常にブックマークが使用出来る為、Recordset での所有る種類の移動が可能で有る。 3.静的カーソル:データの検索、又は、レポートの作成に使用する為の、レコードセットの静的コピーを作成す る。常にブックマークが使用出来る為、Recordset での所有る種類の移動が可能で有る。他のユーザーに依る 追加、変更、又は、削除を見る事は出来ない。クライアント側(ADOR)の Recordset オブジェクトを開く場合 に許可される唯一のカーソルタイプで有る。 4.前方スクロールタイプカーソル:レコードの前方スクロールのみ可能で有る点を除き、静的カーソルと同じ属 性を持つ。レコードセットを一度だけスクロールする必要が有る場合は、此のカーソルに依り性能が向上する。 Recordset オブジェクトのカーソルタイプを選択するには
Recordset オブジェクトのカーソルタイプを選択するには、Recordset オブジェクトを開く前に CursorType プロ パティを設定する。亦、Open メソッドを使って CursorType 引数を引き渡す事も出来る。プロバイダの中には、 総てのカーソルタイプをサポートして居ない物も有る。プロバイダのドキュメントを参照して確認する必要が有 る。カーソルタイプを指定し無い場合、既定値に依り前方スクロールタイプカーソルが開く。
Recordset オブジェクトのカーソルロケーションに付いて
Recordset オブジェクトを開く為に CursorLocation プロパティを adUseClient に設定すると、Field オブジェクト 上のUnderlyingValue プロパティは、返された Recordset オブジェクトでは無効に成る。Microsoft SQL Server と連動するMicrosoft ODBC Provider for OLE DB 等のプロバイダを利用する場合、Open メソッドを使用して接 続文字列を引き渡す事に依り、定義済みのConnection オブジェクトから独立した Recordset オブジェクトを作成 する事が出来る。此の場合もConnection オブジェクトが作成されるが、オブジェクトの値は変数に代入され無い。 但し、同じ接続で複数のRecordset オブジェクトを開く場合は、Connection オブジェクトを作成して開く必要が 有る。此の操作に依り Connection オブジェクトの値がオブジェクト変数に代入される。Recordset オブジェクト を開く時に此のオブジェクト変数を使用しない場合は、ADO は、同じ接続文字列を引き渡しても、新規 Recordset オブジェクトの夫々れに対して新規Connection オブジェクトを作成する。
Recordset オブジェクトを開くと、カレントレコードが最初のレコードの位置に移動して、BOF と EOF プロパテ ィの設定値がFalse に成る。レコードが存在しない場合は、BOF と EOF プロパティの設定値が True に成る。
ConnectionString プロパティ(ADODC) 直訳すると『接続文字列』。ダイアログボックスにて視覚的に設定する事が多いが、1字1句間違わなければ、 直接入力しても設定する事が出来る。要は、何のデータベースと接続するのかを指定するプロパティで有る。若 し、フォルダの名称を変更したり、ファイル名を変更したり、保存場所を変更する等して、設定した時と異なる 場合は、再度設定し直す必要が有る。 RecordSource プロパティ(ADODC) 指定した検索文を元に、ADODC オブジェクトは検索結果データを取得する。 データグリッドはADODC オブジェクト内に取得したデータを表示する。 Refresh メソッド(ADODC) RecordSource プロパティの指定のみでは、検索結果データは ADODC に取得され無い。 Refresh メソッドを実行する事に依り、データベース側の最新データを取得する事が出来る。 C# での SQL 文の扱い C# にて SQL 文を記述する際には、文字列(ダブルクオーテーション区切り)と成る。 データベースソフトに送られた時点で、文字列はSQL 文で有ると看做され、実行される。
コード上でSQL 文を実行するには コード上でSQL 文を実行するには、コード上で、以下のオブジェクトを使用する。 ADODB.Connection オブジェクト(データベースと接続する為のオブジェクト) ADODB.Recordset オブジェクト (検索文を発行した際にデータを格納するオブジェクト) オブジェクトをコードで使用するには、変数に格納して使用する必要が有る。 此れをオブジェクト型の変数宣言と謂う。
ADODB.Connection 変数名 1 = new ADODB.Connection( );
ADODB.Recordset 変数名 2 = new ADODB.Recordset( ); (SELECT 文で無い場合は不要) INSERT・UPDATE・DELETE 文を実行する場合は、ADODB.Connection オブジェクトの Open(開く)→Execute(実行)→Close(閉じる)メソッドを使用する。 変数名 1.Open( “ データベースの種類・データベースの場所を示す接続文字列 “ ) 変数名 1.Execute( “ SQL 文 “ ) 変数名 1.Close( ) SELECT 文の場合は検索結果を取得するので、ADODB.Recordset オブジェクトに SQL 文を指定する。 変数名 2.Open( “SQL 文“,変数名 1 ) 「RecordCount」プロパティにて検索結果の件数を取得可。 「Fields」コレクションの Value プロパティにて指定したフィールドデータを取得可。 「MoveNext」メソッドにて検索結果のレコードカーソルを移動可。 変数名 2.Close( ) ADODB.Recordset の EOF プロパティ レコードデータを参照する際には、カレントレコードを移動する必要が有る。Open メソッド実 行直後は検索結果の 1 番目のレコードがカレントレコードと成る。MoveNext メソッドを実行す る事に依り、1 件ずつカーソルを移動する事が出来る。EOF プロパティは最終レコードの下の意 味で「此れ以上はデータが無い」状況を謂う。 イメージ(検索結果データ) ID タイトル 1 ACCESS テクニック集 3000 2 EXCEL テクニック集 2500 8 実用 WORD 1300 ・ ・ ・ ・ 実行直後は1 件目にカーソルが有る。 MoveNext メソッドを実行するとカーソルが 1 行宛下へ移動する。 カーソルが 1 番下のレコードより下に移動す ると、EOF=True と成る。