2009年4月24日金曜日

【VB】条件式でどのボタンが押されたか

If sender Is ボタン名 Then ボタンを押したときの処理

2009年4月21日火曜日

【VB】テーブルの指定した列の名前を取得

DataReader.GetName(列番号)

SqlCmd = New SqlCommand(pSQL.ToString, oCon)
iRec = SqlCmd.ExecuteReader()

While iRec.Read()
If iRecCount = 0 Then
pRetMSG = "カラム名レコードの編集"
For iCol = 0 To iRec.FieldCount - 1
If iCol = 0 Then
'フィールド名を代入
oRec(0) = iRec.GetName(iCol)
Else
oRec(0) &= vbTab & iRec.GetName(iCol)
End If
Next
End If

2009年4月17日金曜日

【Windows】OS起動ドライブのドライブレターを変更する


C:\とD:\を入れ替える。
  1. レジストリエディタ(regedt)を起動
  2. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevicesへ移動
  3. \DosDevices\C: を選択し、名前を \DosDevices\Z: などに変更
  4. \DosDevices\D: を選択し、名前を \DosDevices\C: に変更
  5. Z:に変更した \DosDevices\Z: を選択し、名前を \DosDevices\D: に変更
  6. レジストリエディタを終了する
  7. Windowsを再起動する。

【SQLServer】既存のmdfファイルからデーターベースを取り込む(インポート)

次のSQLを実行する。

CREATE DATABASE データベース名
ON PRIMARY (FILENAME = 'mdfファイルパス')
FOR ATTACH
GO

2009年4月16日木曜日

【VB】データベースの接続に対してSQLを実行し、更新された(変更された)行数を取得する。


Rowsに更新された行数を取得する。
Dim Rows As Integer
Rows=Command.ExecuteNonQuery

【VB】DatReaderにレコードを1件(1行)だけ取得

DataReader = Command.ExecuteReader(CommandBehavior.SingleRow)

【VB】データベースへの接続を閉じる(エラー処理付)

If Not Connection Is Nothing Then
Connection.Close()
End If

2009年4月13日月曜日

【VB】DatGridViewの指定したセルの値を取得する

DataGridView(列番号,行番号).value

※行番号、列番号ともに0からカウント

【VB】DatGridViewのカレントセル(アクティブ)を取得する

DataGridView.CurrentCell.ColumnIndex
DataGridView.CurrentCell.RowIndex

※どちらもoからカウントする。

【VB】DatGridViewの列数(カラム数)と行数(ロウ数)を取得する(調べる)

列数(カラム数)
DataGridView.ColumnCount
※1からカウント(0からカウントではない)

行数(ロウ数)
DataGridView.RowCount
※1からカウント(0からカウントではない)
※ただしDataGridView上で新規追加を認めている場合は+1

2009年4月9日木曜日

【SQLServer】データベース所有者 (DBO) に EXTERNAL ACCESS ASSEMBLY 権限を与える

参考URL
SE奮闘記「【SQL CLR】DBから外部リソースにアクセスするための設定」
http://se-suganuma.blogspot.com/2008/04/sql-clrdb.html

【SQLServer】データ型一覧

SQL server 2005データ型
参考URL
http://kaya.techbank.jp/DataTypes.html

【VB】【SQR CLR】SQL CLR の呼び出し方法の登録の構文

CREATE FUNCTION HelloWorld() RETURNS nvarchar(256) AS EXTERNAL NAME
アセンブリ名.アセンブリ実ファイル名(拡張子なし).メソッド名
GO

SQL Server 2005 自習書シリーズ 開発編 No.3.pdf
p10-11

【VB】【SQL CLR】アセンブリアセンブリをSQLServerへ登録する構文

CREATE ASSEMNLY アセンブリ名

FROM '登録するアセンブリパス'

WITH PERMISSION_SET = SAFE または EXTERNAL_ACCESS または UNSAFE
↑アセンブリの権限セットを指定。

【VB】SQL CLRの基本的な使い方

①SQLサーバーへアセンブリ(DLL)を登録する
②呼び出し方法の登録(関数→スカラ値関数で確認)

【VB】DataTableに他のテーブルの内容を結合

VB2005実践DBP p.172

【VB】DataTableのコピーを作成する

VB2005による実践DBP p.172

【VB】DataSetにDataTableを追加する

'Viewを取得
dim dv as nwe DataView
dv.Table=OrderDataSet.Goods

'フィルタ設定
dv.RowFilter = "GoodsID LIKE 'F%'"

'フィルタ結果からデータテーブルを作成
dim tb as DataTable
tb = dv.ToTable

'テーブルの名前を変更
tb.tableNmae= "Foods"

'作成したテーブルをデータセットに追加
OrderDataSet.Tables.Add(tb)

'確認
dim t as DataTable
for Each t in OrderDataset.Tables
'テーブル名
Cnsole.WriteLine(T.tabliName)

'フィールド名
dim c as DataColumn
for Each c in t.columns
console.writeLine(controlChars.tab & c.ColumnName)
next
next

【VB】DataViewからDataTableを作成する

'Viewを取得
dim dv as nwe DataView
dv.Table=OrderDataSet.Goods

'フィルタ設定
dv.RowFilter = "GoodsID LIKE 'F%'"

'フィルタ結果からデータテーブルを作成
dim tb as DataTable
tb = dv.ToTable

'確認
dim dr as DataRow
For Each dr in tb.rows
console.WiteLine(dr("GooodsID") & ControlChars.Tab & dr("GoodsName") & ControlChars.Tab & dr("Price") )
next

【VB】DatView編集後、内容を破棄する


'Viewを取得
dim dv as new dataView
dv.table=OrderDataSet.Goods

'追加
dim drv as DataRowView
drv = dv.AddNew()
drv("GoodsID") = "Z001"
drv("GoodsName") = "湯たんぽ"
drv("Price") = "2000"

'値を破棄する
drv.EndEdit()

【VB】DatView編集後DataTableに内容を反映(更新)

'Viewを取得
dim dv as new dataView
dv.table=OrderDataSet.Goods

'追加
dim drv as DataRowView
drv = dv.AddNew()
drv("GoodsID") = "Z001"
drv("GoodsName") = "湯たんぽ"
drv("Price") = "2000"

'値を確定
drv.EndEdit()

【VB】DatView内のレコードを削除

dim dv as new DataView
dv.table=OrderDataSet.Goods

'先頭レコードを削除
dv.Lesete(0)

【VB】DataViewに新しいレコードを追加する


'Viewを取得
dim dv as new DataView
dv.table=orderDataSet.Goods

'追加
dim drv as DataRowView
drv=dv.AddNew()
drv("goodsID")="Z0001"
drv("GoodsNmae") ="湯たんぽ"
drv(Price") = 2000

参考VB2005実践 p159

【VB】DataViewでレコードをソート(並び替え)する


dim dv as new DataView
dv.Table = OrderDataSet.Goods

'Priceフィールドで昇順に並べる
dv.Sort="Price"

'dataGridViewに表示
DataGridView1.DataSource =dv

【VB】DataGridViewで指定した条件で抽出(検索)(フィルタ)

'viewを取得
dim dv as new DataView
dv.Table = OrderDataSet.Goods

'フィルタ
dv.RowFileter = "FoodsName LIKE 'つやつや%'"

'DataFridViewに表示
DataFridView1.DataSource = dv

【VB】DataTable内を確定する

AcceptChangesメソッドを使う
dataSet.dataTable.PcceptChanges()

【VB】更新したレコード数を調べる

dim n as integer'更新したレコード数
n= tableAdapter.Update(dataSet.dataTable)

【VB】変更の種類を変更してデータベースを更新する

「3行目の値を変更する」のみをUpdateする。
他の「1から2行目を削除」「新しくレコードを追加する」は反映されない例。

'削除
OrderDataSet.Goods(0).Delete()
OrderDataSet.Goods(1).Delete()

'値の変更(今回はこれが適用)
OrderDtaset.Goods(2).GoodsName="つやつや"

'追加
dim dr as OrderDataSet.GoodsRow
dr=OrderDataSet.Goods.newFoodsRow
dr.GoodsID ="Z0002"
dr.GoodsName = "花粉撃退マスク"
dr.price = 500
OrderDataSet.goods.Rows.add(dr)

'値を変更した行を取得
dim tb as DataTable
tb = OrderDataset.Goods.GetChanges(DataRowState.Modified)

'データベースを更新
goodsTabeleAdapter.Update(tb)
Messagebox.show("更新しました")


ポイント
tb = OrderDataset.Goods.GetChanges(DataRowState.Modified)
のModifiedが編集された行という意味

その他の状態一覧
  • 1Detached
    作成した後、DataRowCollectionに追加されていない行

  • 2Unchanged
    編集されていない行

  • 4Added
    追加された行

  • 8Deleted
    削除された行

  • 16Modified
    編集された行

【VB】DataTable内の変更のあった行だけを取り出して新しいDataTableを作成

'削除した行を取得
dim tb as DataTable
tb=dataset.dataTabele.GetChanges(DataRowState.Deleted)

【VB】行の状態(RowsStateでの管理)

  • 1Detached
    作成した後、DataRowCollectionに追加されていない行

  • 2Unchanged
    編集されていない行

  • 4Added
    追加された行

  • 8Deleted
    削除された行

  • 16Modified
    編集された行

【VB】検索したレコードをDataGridViewに表示する


【VB】主キー以外のフィールドでレコードを検索する

検索する値
dim key as string
key = inputbox("[GoodsName]"を入力","検索")

'検索
dim rr() as OederDtaset.gooodsRow
rr = OrderDtaSet.Goods.Select("GoodsName LIKE ' & "%'")

'確認
if dr Is Notheng then
messagebox.show("該当するレコードがありません")

Else
'検索したレコードを表示
dim s as string=""
dim i as integer
for i=0 to rr.length-1
s=s & rr(i).goodsID & ControlChars.Tab & rr(i).GoodsName & ControlChars.Tab & rr(i).Price & ControlChars.Tab
next
messagebox.show(s)
end if

【VB】主キーフィールドを使ってレコード検索(標準のデータセット)

検索する値
dim key as string
key = inputbox("[GoodsID]"を入力","検索")

'検索
dim dr as DataRow
dr = DtaSet.Tables.("goods").Rows.Find(key)

'確認
if dr Is Notheng then
messagebox.show("該当するレコードがありません")
Else
messagebox.show(dr.GoodsID & ControlChars.CrLf & dr.goodsName & ControlChars.CrLf & dr.Price)
end if

【VB】主キーフィールドを使ってレコード検索(型指定されたデータセット)

'検索する値
dim key as string
key = inputbox("[GoodsID]"を入力","検索")

'検索
dim dr as OederDtaset.gooodsRow
dr = OrderDtaSet.Goods.FindByGooodsID(key)

'確認
if dr Is Notheng then
messagebox.show("該当するレコードがありません")
Else
messagebox.show(dr.GoodsID & ControlChars.CrLf _
& dr.goodsName & ControlChars.CrLf _
& dr.Price)
end if

【VB】指定した行番号のレコードを削除する

'先頭レコードを選択
dim dr as DataRow
dr = orderDataSet.Goods(0)

'レコード削除
dr.Delete()

【VB】指定した行番号のレコードを編集

'先頭レコードを編集(型指定されたデータセットの場合)
OrderDataSet.Goods(0).rice=10000

''先頭レコードを編集(型指定されていないデータセットの場合)
DataSet.Tables("Goods").Rows(0)("Price") = 10000

【VB】空のDataRowにテーブルの構造(型)を継承(適用)する。

dim dr as DataRow

dr = dataset.tables("Goods").NewRow()

作成したDataRowは型指定されているわけではない。各フィールドに値を代入するときは次のようにする。

dr("gooodsID")="Z0001"

【VB】DataTable内のすべてのレコードにアクセスする

dim i as integer
for i = 0 toOrderDataset.Goods.rows.count-1
confole.writeLine(Orderdataset.goods(i).goodsID & ControlChars.tab _
& Orderdataset.goods(i).GoodsName& ControlChars.tab _
& Orderdataset.goods(i).Price)
next

【VB】自動で設定されたデータベースの接続文字列を使う(app.config)

My.Settings.OrderConnectionStringでアクセス可能


dim cn as new oleDbConnnection
cn.ConnectionString=My.Settings.OrderConnectionString

【VB】データベースから取得したデータをDataGridViewへ表示(非接続型)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'接続情報
Dim cn As New OleDbConnection
'接続情報
cn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;" _
& "data source=Order.mdb"

'DataAdapterの作成
Dim da As OleDbDataAdapter
da = New OleDbDataAdapter("select * from goods", cn)

'データを取得
Dim ds As New DataSet
da.Fill(ds, "goods")

'DataGridViewに表示
DataGridView1.DataSource = ds.Tables("goods")
End Sub


データベースに追加して更新

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

'接続情報
Dim cn As New OleDbConnection
'接続情報
cn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;" _
& "data source=Order.mdb"

'DataAdapterの作成
Dim da As OleDbDataAdapter
da = New OleDbDataAdapter("select * from goods", cn)

'データを取得
Dim ds As New DataSet
da.Fill(ds, "goods")

'値を変更
ds.Tables("Goods").Rows(0)("GoodsName") = "つやつや"

'更新用コマンドを作成
Dim cmdbuilder As New OleDbCommandBuilder
cmdbuilder.DataAdapter = da

'更新
da.Update(ds, "Goods")
MessageBox.Show("更新しました")

End Sub

【VB】レコード数を調べる

Goodsテーブルのレコード数を調べる
command.commandtext="select count(*) from goods"

priceフィールドの値が代入されているレコードをカウント
command.commandtext="select count(price) from goods"

【VB】更新したレコード数を調べる

returnValue=command.ExecuteNonQuery()

【VB】DdataReaderの使い方

1レコードづつ参照する。
DataReader.Read

レコード数の取得(0から数えるので+1多い値が返される)
DataReader.FileLdCount

【VB】DdataReaderにデータを取得させる

dataReader=command.ExecuteReader()で取得


Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

'接続情報
Dim cn As New System.Data.OleDb.OleDbConnection
cn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;" _
& "data source="Order.mdb"

'選択コマンド
Dim cmd As New OleDbCommand
cmd.Connection = cn
cmd.CommandText = "select * from goods"

'接続
cn.Open()
MessageBox.Show("接続しました")

Dim dreader As OleDbDataReader
dreader = cmd.ExecuteReader

'DataReaderの内容を確認
Dim i As Integer
Do While dreader.Read()
For i = 0 To dreader.FieldCount - 1
Console.Write(dreader(i) & ControlChars.Tab)
Next
Console.WriteLine()
Loop

'切断
cn.Close()
End Sub

【VB】データベースへ接続するための準備(ADO.NET)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'接続情報
Dim cn As New System.Data.OleDb.OleDbConnection

cn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;" _
& "data source=Order.mdb"

'接続
cn.Open()
MessageBox.Show("接続しました")
'切断
cn.Close()
MessageBox.Show("切断しました")

End Sub



SQLコマンドの宣言例
'選択コマンド
Dim cmd As New OleDbCommand
cmd.Connection = cn
cmd.CommandText = "select * from Foods"


実際にデータ取得
Dim dreader As OleDbDataReader
dreader = cmd.ExecuteReader
MessageBox.Show("取得しました")

2009年4月6日月曜日

【VB】データベースでキーワードを指定して絞り込み検索

検索機能を追加するにはBindingSource.Filterメソッドを使用する。


「Customers」というテーブルの「CustName」 列から「txtSearch」テキストボックス内のキーワードから検索
Me.CustomersBindingSource.Filter = "CustName LIKE '" & txtSearch.Text & "'"

※このままでは全文検索になる。(あいまい検索にはならない)

キーワードによるフィルターを解除するには
Me.CustomersBindingSource.RemoveFilter()

【VB】データベースを扱う上での役割

・BindingNavigator
データベースを操作するために使うツールバー

・BindingSource
フォーム上のコントロールとデータセットを結び透けるために使われる

・TableAdapter
データセットとデータベースとの間でデータをやり取りするために使われる

・TableAdapterManager
コントロールはデータベースの更新順序を変えるなどデータの保存をきめ細かく、簡単に実行するために使用する

参考
基礎VisualBasic2008 (インプレス出版)
Chapter10データベースを取り扱う p406

【VB】クリップボードを使う

使用例
lblFortune.Textの文字列をコピーする。
Clipboard.SetData(DataFormats.Text, lblFortune.Text)

クリップボードにコピーできるデータの形式
  • DataFormats.Bitmap
    Windowsビットマップ形式

  • DataFormats.EnhancedMetafile
    拡張メタファイル形式

  • DataFormats.Html
    HTMLテキスト

  • DataFormats.Text
    ANSIテキスト文字列

  • DataFormats.UnicodeText
    Unicodeテキスト文字列

【VB】変数で参照されたオブジェクトのイベントを利用するには

変数の宣言に Private WithEventsを追加する


Private WithEvents picFace As PictureBox

【VB】入力した値の範囲を指定する


1~10までの範囲を許可する。その範囲外の値を設定しようとしたら1~10までの値になる。
value     '入力された値が入っている変数
mGrowth  '範囲内の変数

mGrowth = Math.Min(10, Math.Max(1, value))

2009年4月3日金曜日

【VB】共有メンバを作成する。

基礎VisualBasic2008 p336

【VB】オブジェクト(クラス)が破棄されるときに任意のコードを実行する。

protected overrrides sub finalize()

【VB】数字を16進数文字列に変換

  • 大文字に変換表示
    ToString("X")

  • 小文字に変換
    ToString("x")

  • 大文字2桁で変換
    ToString("X2")
参考URL
ミリオンウェーブズ 「18.数値を16進数文字列に変換するには」
http://hiros-dot.net/PowerShell/string/string18.htm

【VB】フォーム上のコントロールなどの値(設定値)を保存(保持)する

  1. 保存したいコントロールのプロパティの「Application Settings」を選択し、「+」をクリック
  2. 「Property Binding」の欄をクリック
  3. 「…」をクリック。
  4. 保存したい項目(値)を選んで「▼」をクリック
  5. 「新規」をクリック
  6. 「新しいアプリケーションの設定」ダイアログボックスで「name」欄に自分で付けたい設定の名前を入力し、OKをクリックする。
参考
基礎VisualBacic2008(インプレス出版)
p.298 「プログラムの設定値を保存する」

2009年4月2日木曜日

【VB】現在の曜日を取得する

Today.DayOfWeek

0が日曜日
1が月曜日…
となる。

書式を指定するには
Today.DayOfWeek.ToString("ddd")
「Sun」~「Sat」

Today.DayOfWeek.ToString("dddd")
「Sunday」~「Saturday」

【VB】Subプロシージャを途中で抜ける

Exit Sub

【VB】配列変数の要素数を取得する

配列名.Length

【VB】配列変数の最大のインデックスを取得する

UBound(変数名)

これで取得できる。

【VB】配列変数のサイズ(要素数)を変更する

ReDim 配列変数名(最大要素数)

※だたし元のデータは破棄される

ReDim x(5)

破棄されない方法はPreserveを追加する。

ReDim Preserve x(5)

【VB】多次元配列を宣言する

Dim DataMatrix(2,3) As Integer

カンマで区切って宣言する。

【VB】For~Next/For Each~nextステートメントを途中で抜ける

Exit For
で抜ける

【VB】Do~Loopステートメントを途中で抜ける

Exit DO
で抜ける。

【VB】乱数を生成するには


Dim r As Random =New Randam()
Limit = r.Next(下限値,上限値)

【VB】書式を指定して数値を文字列へ変換(カンマ区切りの¥など)


変数名.ToString(#,##0円)

「3600」の場合「3,600円」へ変換される。
  • 「D5」で10進数5桁で表示
  • 「F3」は小数点以下3桁で出力
参考
基礎VisualBacic2008(インプレス出版)
p177

【VB】数値(整数)のみが入力されたがどうか調べる

文字列を整数に変換するには
Integer.TryParse(変換前の文字列,変換後の文字列)を使用する。もし整数でなければfalse値を返すので以下のように利用する。

使用例
If Integer.TryParse(変換前の文字列,変換後の文字列)=False Then
整数でない場合の処理(小数も含む)
Else

※下記のコードはうまくいかなかったことがある。
ValクラスとIsNumericを組み合わせて数値型に変換できるかチェックする。

If (TxtBox1.Text="") Or (IsNumeric(Val(TxtBox1.Text)) = False) then
数値型へ変換不可の場合
End if

【VB】文字列の文字数を数える

変数名.Length()

【VB】平方根(ルート)の値を求める

Math.Sqrt関数を使用する。

√5を求めるのであれば
Math.Sqrt(5)

【VB】数字(Integerなど)を文字列(String型など)に変換する

数字(Integerなど)を文字列(String型など)に変換

変換したい値または変数.ToString

または
CStr ( 変換したい値または変数)

【VB】文字型(Stringなど)を数値型(Integerなど)へ変換(小数は四捨五入)

Cintクラスを使う
使用例
Str= CInt(TxtBox1.Text)


Valクラスを使う
Str = Val(TxtBox1.Text)

Integer型に用意されているParseメソッドを利用する
使用例
TotalCount = Integer.Parse(OneLine)

※なお整数以外はFalseを返す。

【VB】自動で変数の型を変換するのを無効にする

Option Strict をOnにする

【VB】定数を利用する


Const MSLE As Integer = 0

【VB】イミディエイトウインドウ(プロンプトみたいなやつ)を表示させる

「デバック」→「ウインドウ」→「イミディエイト」を選択。

参考
  • 基礎VisualBacic2008(インプレス出版)
    p103 イミディエイトウインドウが表示されないときは

【VB】変数のデータ型

  • boolean
    TrueかFalse

  • Byte
    0から255までの整数

  • Single
    0から2の31乗(約20億)

  • Date
    西暦1年1月1日午前0:00:00~9999年12月31日午後11:59:59までの日付と時刻

  • Char
    1文字(0から65535までの文字コード)

  • Decimal
    小数点無であれば79228162514264337593543950335 ~ 79228162514264337593543950335
    小数の桁数が28桁であれば-7.9228162514264337593543950335 ~ 7.9228162514264337593543950335
    一番細かい値(分解能)は0.0000000000000000000000000001

  • Short
    -32768 ~ 32767までの数字(小数なし)

  • Integer
    -2147483648 ~ 2147483647までの数字(小数なし)

  • String
    0 個 ~ 約 20 億個の文字 (Unicode)
参考URL
VB中学校 - データ型
http://homepage1.nifty.com/rucio/main/kiso/DataType.htm

【VB】プログラムを最終的に完成し、配布できるようにする

  1. メニューから「ビルド」→「(プロジェクト名)のビルド」を選択。
  2. 「bin」フォルダ内の[Release」フォルダに配布用が作成される。

【VB】アプリケーション(フォーム)を終了(閉じる)させる。

Application.Exit()