hakeの日記

Windows環境でプログラミングの勉強をしています。

SQLite - ビューとインデックス

sqlite> create table AAA(ii integer, tt text, rr real);
sqlite> insert into AAA values(1, 'aaa', 0.8),
   ...> (2, 'aaa', 0.7),
   ...> (3, 'bbb', 0.6),
   ...> (4, 'bbb', 0.5),
   ...> (5, 'ccc', 0.4),
   ...> (6, 'ccc', 0.3),
   ...> (7, 'ddd', 0.2),
   ...> (8, 'ddd', 0.1);

sqlite> select * from AAA;
ii          tt          rr
----------  ----------  ----------
1           aaa         0.8
2           aaa         0.7
3           bbb         0.6
4           bbb         0.5
5           ccc         0.4
6           ccc         0.3
7           ddd         0.2
8           ddd         0.1

VIEW

続きを読む

SQLite - ROWIDとカラム制約事項

ROWID

特に指定しなくても、レコードをユニークに決定するROWIDというinteger型のカラムが内部的に付加される。

sqlite> create table AAA(ii integer, tt text);
sqlite> insert into AAA values(10, 'aaa'),(20, 'bbb');
sqlite> select rowid,* from AAA;
rowid       ii          tt
----------  ----------  ----------
1           10          aaa
2           20          bbb

 

PRIMARY KEY

主キーを指定する。

create table テーブル名( カラム1名 カラム1型名 primary key, ……);
create table テーブル名( カラム1名 カラム1型名, ……,  primary key(カラム名, …… ));

ひとつのカラムを主キーにする場合はどちらの書き方でも良いが、二つ以上のカラムを主キーにする場合は後者の書き方とする。
主キーの値(複数カラムの場合は値の組み合わせ)が同じレコードを追加することはできない。
注意点として、主キーをNULLにしたレコードは複数追加することが可能。ただし後でNULLを変更した場合に、既に存在する主キーを一致する場合はエラーになる。

sqlite> create table AAA(ii integer, tt text, primary key(ii, tt) );
sqlite> insert into AAA values(10, 'aaa');
sqlite> insert into AAA values(null, 'aaa');
sqlite> insert into AAA values(null, 'aaa');
sqlite> insert into AAA values(40, 'bbb');
sqlite> select rowid,* from AAA;
rowid       ii          tt
----------  ----------  ----------
1           10          aaa
2                       aaa
3                       aaa
4           40          bbb
sqlite> update AAA set ii=10 where rowid=2;
Error: UNIQUE constraint failed: AAA.ii, AAA.tt

sqlite> insert into AAA values(20, 'aaa');

sqlite> insert into AAA values(10, 'aaa');
Error: UNIQUE constraint failed: AAA.ii, AAA.tt

 

続きを読む

SQLiteを使う

個人や小規模のデータベースで使用するSQLiteの勉強
作成されるデータベースファイルは一個なので手軽に管理できる。

入手先

以下のサイトのDownloadから入手する。現時点のバージョンは3.25.3。
Windows環境でプログラムからDLLを使用する場合は、sqlite-dll-win64-x64-3250300.zip または、sqlite-dll-win32-x86-3250300.zip
コマンドプロンプトPowerShellのコンソールから使用する場合は、sqlite-tools-win32-x86-3250300.zip内のsqlite3.exeを使用する。

あと以下のアプリでGUIを使ってデータベースファイルへアクセスできるのでインストールしておくと便利

 

続きを読む

EXCEL VBAメモ - ユーザーフォーム上のTextBoxにEnter押下で連続入力する

目的

ListBoxとTextBoxがあるユーザーフォームで、TextBoxに入力したデータをListBoxに追加していきたい。
その時Enter押下だけで連続に入力していく様にしたい。

試行錯誤

通常はTextBoxにデータを入力したあとにEnterを押すとフォーカスが別のコントロールに移動してしまう為、追加用のButtonコントロール等を用意しなければならない。
Enterのみで連続入力ができないか、TextBox_KeypressイベントやTextBox_Keydownイベント等試したけれども、やはりEnterでフォーカスが移動してしまい、上手くいかない。

結論

TextBox_BeforeUpdateというイベントを利用すると良い。このイベントはTextBoxの入力値に変更があった場合、フォーカスが移動する前に発生し、引数にCancelがありフォーカス移動を止めることができる。
従って、このイベント内でListBoxに追加する処理を記述してから、最後にCancel に True を代入することでTextBoxにフォーカスを残したままListBoxにデータを追加することが可能になる。
(フォーカス移動後に発生するTextBox_AfterUpdateイベントもある。こちらはCancelが無い)

問題点

無条件にCancel = Trueにすると、以下の問題が生じるので、TextBoxに値が存在する場合のみ行うなど条件分けが必要になる。

  • TABによるフォーカス移動が利かなくなる
  • 他のButton等が使用できなくなる

 

続きを読む

C# - LINQ

Enumerableなオブジェクトに対して様々な加工が可能である。面白いのは組み合わせて使用できること。
注意点としてはReserveメソッドのみ自身を書き換えること。試した範囲では他のメソッドは新規のEnumerableなオブジェクトを生成した。
 

続きを読む

C# - 引数 - 値渡しと参照渡し

メソッドの引数を参照渡しで行う場合は、仮引数だけでなく、実引数側にも ref をつける。これはメソッドの引数にしたことで、メソッド側から書き換えが発生する可能性のあることを明示する為である。
メソッドの結果を引数経由で呼び出し側に渡す用途の場合は、ref の代わりに out を使用する。このため呼び出し側で out を付けて渡す実引数は必ず変数でなければならない。またメソッド側から代入が行われるので値が未定の(代入していない)変数も使用できる。代わりにメソッド内では、outを付けた仮引数を読み出すことはできない。

参照型変数を参照渡しでメソッドに渡して、メソッド内において新規オブジェクトを代入(参照)した場合、呼び出し側の変数においても新規オブジェクトが参照され、元々参照していたオブジェクトを参照しなくなるので注意。
 

続きを読む

C# - 引数 - 規定値/名前付き引数/可変長引数

メソッド定義の仮引数に規定値を付けると、メソッド呼び出し時にその引数を省略することができる。ただし仮引数の並びで、規定値有りの引数の後ろに規定値無しの引数を置くことはできない。

また、メソッド呼び出し時に

        仮引数名 : 値

とすることで仮引数の順番に関係なく値を渡すことができる。

更に、仮引数にparamsし配列を置くことで可変長の値を受け取ることができる。可変長引数に渡す値がなくてもエラーにならない。ただし可変長引数は、仮引数リストの最後に置かなければならない。

        params  型[]  可変長仮引数名

 

続きを読む