VB.NETとSQLサーバを用いた開発
はじめに
この記事では、自分がVB.NETを利用したFormアプリの開発現場で実際に利用した技術について紹介いたします。
アプリというものが実際にどのような構造や考え方で作られているのか?というのが紹介できたらなと思います。
自分も未経験から入社したので、伝えられる技術は初歩的な部分がほとんどです。
しかしだからこそ、最初はこういうことをやるんだ…ってところを知ってもらえれば、後発の人も安心かなと。
アプリ開発と一口に言っても大半の場合は、ネット上でよく見かけるゲームアプリや企業が作成したサイトなど、独特なデザインや動作をするものではないです。(自分も未だにあそこまでできるとは思えない)
HTMLであればHTML、FormであればForm用の既存のフォーマットがあって、コードを書いていくことによってそれに当てはめていくような感じです。
実際の画面や構造としては、2000年代に自分用のホームページをHTMLで作るのが流行したんですが、アレをイメージするとわかりやすいです。
ボタンや文字のデザインは野暮ったいし、背景は無地だし、ほぼコードだけで動いてるみたいな状態のアレ。
そういうのが、社内アプリと呼ばれるものの大半だと思っていただければ。
「ホームページ 2000年代」「VB.NET フォーム」
こんな感じのワードで調べると、言いたいことが伝わるかなと。
次の項目で、具体的な画像とか出して説明します。
VB.NETの基礎的な構造
各コントロールの説明
まずは、一番良く使うコントロール(画面上にあるアイテム)を紹介。
逆に言えば、初心者が任される領域は基本的に以下の項目だけです。
なんか違うのが出てきても、基本的な構造はこれらの発展型なので、なんとかなるとは思います。
・Label(ラベル)
要するにただの文字。タイトルとか、テキストボックスなど別のコントロールに何を書き込んでほしいかの説明とか、利用状態などのステータスを表示するときに使う。
・TextBox(テキストボックス)
ここに文字の書き込みとか行う。ここに手打ちした情報が実際にデータとして扱われる。いろいろ経由するとSQLのテーブルにFormから書き込むこともできる。
・ComboBox(コンボボックス)
Excelとかでプルダウンと言われてるアレ。クリックすると、下に選択肢が表示されて、クリックするとそれがComboBoxの現在の値になる。想定される回答が決まってるときに使う。
・CheckBox(チェックボックス)
「~ですか?はい、いいえ」みたいなときや、選択肢のうち、複数回答ができるようにしたい時に使う。True、Falseの二値で表される。
・Button(ボタン)
ボタン。クリックすることで、その後の動作に進む事ができる。
・DataGridView(データグリッドビュー)
表みたいなやつ。ここに読み込んだテーブルを入れたり、逆にここに書き込んだ情報をテーブルに入れるなど、色々やる。正直説明や構造が難しいので、ここではこういうのがあるよというだけ。初心者のうちは、現場で読んだコードをパクりながら使うしかない。自分も構造を把握して1から作ったことはないので…。
よく使うプロパティ
プロパティとは、「Textbox.Text」みたいに、コントロールの後ろにつくやつです。
これをつけると「コントロールに対し、どのような操作をしたいのか」が実現できる。
プロパティのウィンドウで初期値を追加したり、コードとして書き込むことで、プロパティを実装できる。
基本的に、プロパティウィンドウのものより、コードのほうが優先される。
操作制限
・.Enabled
True→コントロールを操作可
False→コントロールを操作不可
TextBoxが文字含めて灰色になって、操作ができなくなった。
コントロールの操作可不可をこれで制御する。
以下の用途でよく使う
・使用を想定されないシーンでの誤クリック防止
(必須項目を埋めてない状態で「決定」ボタンをクリックさせない、など)
・ユーザが持っている権限の有無によって操作の制限を行う
(管理者ユーザ以外には「管理者として実行」させない、など)
・.ReadOnly
True→コントロールを操作不可
False→コントロールを操作可
TextBoxの枠が灰色になって、書き換えができなくなったが、ドラッグすると文字を選択できる。
基本的な使用シーンは.Enabledと似ているが、ReadOnlyはTextBoxにて「文字は書き換えさせたくないが、何が書いてあるかを読ませる意図がある」ときなどに使う。
・.Visible
True→コントロールを表示
False→コントロールを非表示
プレビューのLabel2を、プロパティでFalseにすると
そのLabel2が非表示になった
状況に応じて、コントロール自体を見せないようにしたいときに使う。
文字を操作する
・.Text
例えば、こういうコードを書くと
TextBoxがデフォ値から書き換わる。
・このボタンをクリックしたら、TextBoxの文字が書き換わるようにしたい。
・逆に、TextBoxを書いた状態でこのボタンをクリックしたら、その書いた文字をどこかしらに反映させたい。
こんなときに使う。
・vbCrLf→改行。
プロパティではないが、Text系のプロパティでは必ず使う
カウントを行う
・.Count
印をつけたLabelとComboBoxに注目。
ロード時に、ComboBoxに10個アイテムを追加してやると
11個のアイテムがあるので、Labelには11と表示された。
このような感じで、アイテムが何個あるかを判断できる。
これを利用して
・今の場合、ループを何回繰り返せばいいのか?
・何行目に必要な情報があるのか?
などといったことに使える。
・Length
さっきのLabelに、.Textの文字数を表示させるようにすると
comboboxの文字数が表示された。
文字数をカウントするときに使う。
・何文字目から操作を加えるか?
というときに使う。
文字列を加工する
・Remove
Remove(3)という感じでやると、
3文字目より後ろが消滅する。
また、「,」で区切って2項目めも記入可能であり、そうすると
3文字目の後ろからカウントして3文字、要するに456が消えた
・Replace
特定の文字列を置き換える(というか、主に""を置き換え先にして消す)ときに使う。
・Split
文字列を加工するとき、さらに複雑な工程を加えたいときに使う。
特定の文字で区切ったとき、そのうちの何個目を使いたいかってときに輝く。
このくらいわかれば、基礎的なところはなんとかなるか。
その他で重要なキーワード
・MessageBox
ボタンを押したときなどに「システムエラーが発生する前に、エラーが発生する値かを検知することでそれを防ぐ」「どこが記入漏れなのかを特定する」などの用途で使う。
SQLの基礎的な構造
テーブル
こんなかんじになってる表。
横方向の、データのまとまりになっているのが行
縦方向の、どのステータスの値かを示しているのが列
テーブル自体は、表そのものでしかない。
ストアドプロシージャ
こんな感じになっているプログラム。
VBから受け取った値を利用して、テーブルに対して、どのような操作を加えたいかを示す。
スクリプト
テーブルを直接書き換えたり、ストアドを書き換えたり、それらのバックアップを取ったりするためのプログラム。
開発環境でテーブルに操作を加える必要がある場合、それを本番環境にわたす役割がある。
開発環境で、テーブルにどのような変更点があったのかを明示することができる。
ストアドにおける操作
基本的な検索構造
SELECT [列],[列]
FROM [テーブル]
WHERE ID=@ID
年=@年
・SELECT [列],[列]…
[列]の部分を[*]にすると、全列を選択したことになる。
逆に、特定の列だけを選択することもでき、これを射影という。
・FROM [テーブル]
どのテーブルを指定しているのかを示す。
・WHERE [列]=@◯,[列]="0001"…
その中で、どの列に対してどんな条件を指定しているのかを示す。
結合
SELECT [テーブル1].[列],[テーブル2].[列],…
FROM [テーブル1],[テーブル2]
WHERE [テーブル1].[列],[テーブル2].[列],…
SELECTで指定した列を表示
FROMでどのテーブルかを表示
ここまではいいとして
WHERE [テーブル1].[列]=[テーブル2].[列],…
ここで、[テーブル1].[列]の値が[テーブル2].[列]と一致していた場合、テーブル1にテーブル2の列のデータを図のような形で結合させることができる。
データの並び替え
ORDER BY [列],[列],…
左に記述した順の優先度で、選択したデータが並び替えされる。
この際、データ全体が並び替えになる。
ORDER BY [ID]
↓
データの追加
INSERT [テーブル]
VALUES(データ1,データ2)
データを下の行に追加する。
データの更新
UPDATE [テーブル]
SET [列]=(値)
WHERE [列]=(値)
列が特定の値の行の列を、別の値に書き換える
SET [都道府県]= 'ぬ'
WHERE [都道府県]= 'う'
データの削除
DELETE FROM [テーブル]
WHERE [列]= 〇〇
列が特定の値の行を削除
DELETE FROM [テーブル]
WHERE [ID]= 1111133
実際に、VB.NETとSQLがどう連携しているのか
現場で見せて貰った模式図の模写
正直あまりピンと来ない
VB.NETはVisualStudio、SQLはSSMSで記述を行っている。
VisualStudioとしては、DBサーバにデータを参照しにいっている形。
それをするにあたり、SSMSで作ったストアドがテーブルのデータとの仲介を行い、テーブルが書き換わったり、データを貰ったりする。
最終的にストアドから貰ったデータをもとに、VisualStudio側でまた操作を行う。
開発を行ってる時の目線で構図を書き直すと、こう見える。
最後に、連携例だけ
VB.NETにて、SQLと連携したデータのCSV出力を行うプログラムの一部
Try
SCDGetdata.CommandText=Nothing
SCDGetdata.CommandText="dbo.ストアド"
SCDGetdata.Parameters.Clear()
SCDGetdata.Parameters.Add(@ID,sqlDbType.Nvarchar)
SCDGetdata.Parameters.Value=TextBox.Text
DataTable.Clear()
sqlconnection.open()
SDAGetdata.Fill(DataTable)
sqlconnection.Close()
For dtindex=0 To DataTable.Rows.Count -1
For dtcolindex = 0 to 5
If DataTable.Rows(dtindex).Item(dtcolindex).Equals(DBnull.Value) then
StreamWriter.Write("")
Else
StreamWriter.Write(DataTable.Rows(dtindex).Item(dtcolindex))
End If
StreamWriter.Write(",")
Next
StreamWriter.Writeline("")
Next
Catch
Finally
End Try
・SCDGetdata.CommandText="dbo.ストアド"
で、使うストアドプロシージャを指定
・SCDGetdata.Parameters.Add(@ID,sqlDbType.Nvarchar)
で、ストアドに渡す変数を指定(ここの指定がおかしいとエラー)
・SCDGetdata.Parameters.Value=TextBox.Text
で、変数になんの値を代入するかを決める(ここでは、テキストボックスに記入した値とする)
・ sqlconnection.open()
SDAGetdata.Fill(DataTable)
sqlconnection.Close()
SQLと接続し、ストアドで作られたテーブルを、VB.NET側に移送する。
Fillした時点でストアドの役割は終了しているので、すぐに接続を閉じること。
・For dtindex = 0 To DataTable.Rows.Count - 1
これで、送られたデータ(行)の数だけループを行う。
indexは0から始まるが、Countは1から始まるので、数調整として-1をつける。
・For dtcolindex = 0 To 5
これで、送られたデータ(列)の数だけループを行う。
送られてくるデータの列数が5個であることを前提にプログラムを組んでいる。
・If DataTable.Rows(dtindex).Item(dtcolindex).Equals(DBnull.Value) then
StreamWriter.Write("")
Else
StreamWriter.Write(DataTable.Rows(dtindex).Item(dtcolindex))
End IF
送られてきた表データの各行(Rows(dtindex))、各列(Item(dtcolindex))を見て、Null値だった場合は""を、
入力されていた場合は、その値をCSVデータに書き込む
・最後に、データが書き込まれるたびにStreamWriter.Write(",")を、行数が変わるたびにStreamWriter.Writeline()をつけることで、CSVデータをExcelで見たときに表として成立するようにする。
おわりに
本記事では、実際に何を使って作業していたのか、初歩的な部分は書けたと思います。
初心者にできること、やりたいことは、だいたいこの範囲ということで。
本当によく使うところはこの辺なので、あとは現場のコードをパクりながら書くのが大事だと思います。
あとは、他の人のチートシートとも見比べてみてください。そのほうが理解も深まるかと思います。
Discussion