2011年7月28日木曜日

→→→正規検索

Dim r As New Regex("<p>(.*?),/p.")
Dim m As Match = r.Match( source )
while m.success
     m = m.NextMatch()
End while

----------------------------------------------

Dim r As RegEx
Dim m As Match
r = New RegEx( パターン文字列 )
m = r.Match( 検索対象の文字列 )
while m.success
     m = m.NextMatch()  '見つかった文字列に対する処理
End while


123abc1456abc 
 (23a)  (456a)だけを抜く

Dim i As Integer
Dim r As New Regex(" 1(.*?)bc1(.*?)b" )
Dim m As Match( "123abc1456abc" )
While Not ( m.Group(i).Value = "" )
           MsgBox( m.Group(i).Value, , i )
           i += 1
End While

-----------------------------------------

Dim results(20) As String
Dim As Integer
Dim j As New Regex( "<.*?""(.*?)"".*?>" )
Dim m As Match
m = r.Match( " <tr></tr><a href=""/news/****/.html""abcdwxyz</tr>\n<tr/>")
While not (m.Group(i).Value =  "")
     results(i) = m.Groups(i).Value
     MsgBox(results(i), , i)
End While


-----------------------------------------

位置を見つける(発見位置が2番目なのに1番目となるから注意)
Dim text1 As String = "テ"
Dim text2 As String = "イクテス"
Dim As New System.Text.RegularExpressions.Regex(text1)
Dim m As System.Text.RegularExpressions.Match = r.Match( text2 )
If m.Success Then
   MsgBox("Found match at position "& m.Index.ToString())   
End If

→→→OleDbCommandクラスについて

データソースに対して実行するSQLステートメント・ストアドプロシージャを表す
■OleDbCommandのインスタンスを作成すると
読み書き可能なプロパティが初期値に設定されます
実行するためのメソッド
1.ExecuteReader ------> 行を返すコマンド
2.ExecuteNonQuery ----> SqlのINSERT,DELETE,UPDATE,SETステートメントなどのコマンドを実行
3.ExecuteScalar -------> データベースから単一の値(集計値)を取得する

1.
例 OleDbCommandをOleDbDataAdapterおよびOleDbConnectionと共に使用して
Accessデータベースから行を選択する
Public Sub ReadMyData( ByVal ConnectionString As String)
      Dim queryString As String = "SELECT OrderID,CustomID FROM orders"
      Using connection As New OleDbConnection( ConnectionString )
           Dim command As New OleDbCommand( queryString, connection )
           connection.Open()
           Dim reader As OleDbDataReader = command.ExexuteReader()
           Whlie reader.Read()
                    ..................................................
           End While
           reader.Close()
      End Using
End Sub
2.
OleDbCommand.ExecuteNonQueryメソッド
    Dim instance As OleDbCommand
    Dim returnValue As Integer
    returnValue = instance.ExecuteNonQuery()


ExecuteNonQueryではカタログ操作を実行できる。(データベース構造の照会、オブジェクトの作成)
また、DataSetを使用せずにUpdate,Insert,Deleteステートメントを実行してデータベース内の
データを変更することもできる

Private Sub CreateOleDbCommand(ByVal queryString As String,
                                                 ByVal connectionString As String)
       Using connection As New OleDbConnection( ConnectionString )
              connection.Open()
              Dim command As New OleDbCommand(queryString, connection )
              command.ExecuteNonQuery()
       End Using
End Sub


3.
OleDbCommand.ExecuteScalarメソッド
クエリを実行し、そのクエリが返す結果セットの最初の行にある
最初の列を返します。残りの列または行は無視されます
Public Sub CreateMyOleDbCommand(queryString As String,connection As OleDbconnection)
    Dim command As New OleDbCommand ( queryString , connection )
    command.connection.open()
    command.ExecuteScalar()
    connection.close
End Sub







→→→VBテキスト読み込み

Dim sCom As SqlCilent.SqlCommand
Dim sCn As SqlCilent.SqlConnection = New SqlCilent.SqlConnection()
scn.ConnectionString = "Data Source=.\SQLEXPRESS; AttachDbFileName = " &
                                 & My.Application.Info.DirectoryPath &
                                "****.mdf; Integrated Security=True; Connect TimeOut=30;
                               User Instance = True"
Try
      sCn.Open()
      sCom = New SqlCilent.SqlCommand
        ("BULK INSERT 読込 FROM 'C:\テキスト.txt' WITH (Fieldterminator = ',' ,
          rowterminator = '\n' )" , sCn)

      sCom.ExecuteNonQuery()
Catch ex As Exception
      MessageBox.Show( ex.Message )
End Try

sCn.Close()

→→→VB2005Express SQLExpress 接続

Dim sCom As SqlClient.SqlCommandBuilder
Dim dSet As DataSet = New DataSet()
Dim dAdp As SqlClient.SqlDataAdapter
Dim scn As SqlClient.SqlConnection = New SqlClient.SqlConnection()
scn.ConnectionString = "Data Source=.\SQLEXPRESS;AttchDbFile name=" &
                                My.Application.Info.DirectoryPath &
                                "\***.mdf; Integrated Security = True; Connect TimeOut=30;
                                  User Instance = True"
dAdp = New SqlClient.SqlDataAdapter("SELECT * FROM テーブル" , scn)
dAdp.Fill( dSet, "t_テーブル" )
sCom = New SqlClient.SqlCommandBuilder( dAdp )

For i As Integer = 0 To dSet.Tables("t_テーブル").Rows.Count - 1
      dSet.Tables("t_テーブル").Rows(i)("項目") = "代入値"
Next

dAdp.Update( dSet, "t_テーブル")
scn.Close()
-----------------------------------------------------------------------
データセットに取得したレコードの更新をデータベースに反映するには
SqlCommandBuilderオブジェクトを生成してから
SqlDataAdapterオブジェクトのUpdateメソッドを実行する

SqlCommandBuilderオブジェクトの生成はNewキーワードを使い
引数にSqlDataAdapterオブジェクトを指定する

New SqlCilent.SqlCommandBuilder( SqlDataAdapter )

SqlCommandBuilderオブジェクトはデータセットの変更に対応するSQL文を自動的に作成します

データセットのレコード更新はDataRowオブジェクトに、フィールドのインデックスまたは名前を指定し
新たな値を代入します
DataTableオブジェクト.Rows( レコードのインデックス )( フィールドのインデックス/名前 ) = 値

更新後,SqlDataAdapterオブジェクトのUpdateメソッドを実行すると
データセットの変更がデータベースに反映される

Updateメソッドの引数には、DataSetオブジェクトとテーブル名を指定する

SqlDataAdapterオブジェクト.Update( DataSetオブジェクト, テーブル名 )

2011年7月27日水曜日

→→→VB.NET ACCESS97との接続

Dim cCom As OleDbCommandBuilder
Dim dSet As DataSet = New DataSet()
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection()
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
                                  DataSource=D:\***.mdb;Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テーブル", ocn)
dAdp.Fill( dSet , "t" )

Dim i As Integer
For i = 0 To 999
   dSet.Tables("t").Rows(i)("列名")  = dSet.Tables("t").Rows(i)("列名") & " 様"
Next

cCom = New OleDbCommandBuilder(dAdp)
dAdp.Update( dSet , "t" )

→→→SQL命令のサンプル

SELECT 住所, 住所 & ' 町' FROM テーブル
SELECT 住所, Right(住所, 2) FROM テーブル
SELECT 住所, Len(住所) FROM テーブル

SELECT TOP10 * FROM テーブル
SELECT TOP10 PERCENT * FROM テーブル

SELECT * FROM テーブル WHERE ID<= 50
SELECT * FROM テーブル WHERE 住所 = '北海道'
SELECT * FROM テーブル WHERE カナ住所 LIKE 'ホ%'
SELECT * FROM テーブル WHERE カナ住所 LIKE '[カ-コ]%'

SELECT * FROM テーブル WHERE LEN(住所) = 4
SELECT * FROM テーブル WHERE ID>=5 AND ID<=19
SELECT * FROM テーブル WHERE ID BETWEEN 5 AND 19

→→→VB2008 ACCESS2007との接続

Imports System.Data.OleDb

Dim cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\**.accdb)
Dim SQLcm As OleDbCommand = cn.CreateCommand
Dim Adapter As New OleDbDataAdapter(SQLcm)
Dim Table As New DataTable

'SQL命令
Adapter.Fill( Table )
'データグリッドに表示
DataGridView1.DataSource = Table

Table.Dispose()
Adapter.Dispose()
SQLcm.Dispose()
cn.Dispose()

→→→VB2005 ACCESSとの接続

Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:\**.mdb")
Dim SQLcm As OleDbCommand = cn.CreateCommand
Dim Adapter As New OleDbAdapter(SQLcm)
Dim Table As New DataTable

SQLcm.CommandText = "SELECT * FROM テーブル"
Adapter.Fill(Table)

'データグリッドにデータを表示する
DataGridView1.DataSource = Table

Table.Dispose()
Adapter.Dispose()
SQLcm.Dispose()
cn.Dispose()

--------------------------------------------------------------
'Tableの内容をテキストにして書き出す
Dim Writer As New IO.StreamWriter("D:\Data.csv")
Dim LineText As String

For Each Row As DataRow In Table.Rows
        LineText =  ""
        For i As Integer = 0 To Table.Columns.Count - 1
           If Len(LineText) > 0 Then
               LineText &= ","
           End If
           LineText &= Row(i)
        Next
        Writer.WriteLine(LineText)
Next
Writer.Close()
Writer.Dispose()

---------------------------
'S-JIS
Dim Writer As New IO.StreanWriter
                    ("C:\*****.csv", False, System.Text.EncodingGetEncoding("Shift-Jis"))

-------------------------------------------------------

Dim cCom As OleDbCommandBuilder
Dim dSet As DataSet = New DataSet()
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
                                 DataSource=D:\***.mdb;Persist Security Info=False")
dAdp = New OleDbDataAdapter("SELECT * FROM テーブル", ocn)
dAdp.Fill( dSet , "t_テーブル" )

cCom = New OleDbCommandBuilder(dAdp)

Dim i As Integer
For i = 0 To 999 (----> dSet.Tables("t_テーブル").Rows.Count - 1)
   dSet.Tables("t_テーブル").Rows(i)("列名")  = "代入物"
Next

dAdp.Update( dSet, "t_テーブル")

dAdp.Update( dSet , "t" )

→→→前回のフォームの位置をおぼえて、再度開いた時同じ位置にする

フォームプロパティを保存

Form1→「プロパティ」ウィンドウの上の方にある
(PropertyBinding)の欄の[.....]ボタンをクリック












[...]ボタンをクリックするとダイアログボックスが表示される
プロパティの一覧の中から「Location」を探し右側の下矢印ボタンをクリックする

ここで「新規」を選べば設定項目との対応付けができる























Nameのところに「Pos」と入力



これでウィンドウの位置を保存するための設定ができる

2011年7月26日火曜日

→→→ListBoxに表示された列をダブルクリックで実行させる

TextBoxとListBoxを貼り付け
TextBoxに検索する文字列を入力
  ↓
指定したフォルダから一致するファイルを検索し一致したらListBoxに表示
  ↓
ListBoxら表示された列をダブルクリックすると実行する



Imports System.IO
Dim Folder As New DirectoryInfo("C:\USER\Documents")

Private Sub TextBox1_TextChanged(...
    ListBox1.Items.Clear()
    If TextBox1.Text.Length = 0 Then
       Return
    End If
    Dim File As FileInfo
    ListBox1.BeginUpdate()
    For Each File In Folder.GetFiles( TextBox1.Text & "*" )
          ListBox1.Items.Add( File.FullName )
    Next
    ListBox1.EndUpdate()
End Sub

Private Sub ListBox_DoubleClick( ....
       On Error Resume Next
       Process.Start( ListBox1.SelectedItem )
End Sub

→→→メール送信ひながた

Imports System.Net
Imports System.Net.Mail

Public Class Form1
  Private Sub Button1_Click( ・・・
       Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(50220)
       Try
            Dim message As New System.Net.MailMessage("****@**.**.ne.jp" , "***@***.ne.jp" )
            message.SubjectEncoding = enc
            message.BodyEncoding = enc
            message.Subject = Me.txtSubject.Text
            message.Body = Me.txtBody.Text
            Dim Client As New System.Net.Mail.SmptClient("mail.***.***.ne.jp")
            Client.Credentials = New NetWorkCredential("ユーザー名","パスワード")
            Client.Send(message)
            txtForm.Clear()
            txtTo.Clear()
            txtSubject.Clear()
            txtBody.Clear()
            messageBox.Show("メールを送信しました","送信終了")
Catch ex As Exception
           messageBox.Show("送信できませんでした","エラー")
End Try
         Me.Close()
    End Sub
End Class

→→→VB2005データベースの作成

1.[プロジェクト]→[新しい項目の追加]
2.SQLデータベースを選択
3.ファイル名決定
4.追加
5."データソース構成ウィザード"が表示
6.キャンセル
7.テーブル作成
7-1[表示]→[データベースエクスプローラ]
7-2データエクスプローラで「***.mdf」を選ぶ
7-3[データ]→[新規]→[テーブル]
7-4テーブルに表を(列作成)作る
7-5テーブルの作成が終わったら[ファイル]→[Tableを保存]→テーブル名を変え保存
7-6すべてを保存→1回終了
8データベースファイルのコピー
8-1データベースファイルをプログラムの出力先ディレクトリーにコピー
8-2ソリューションエクスプローラで「***.mdf」を選び
プロパティウィンドウ「出力ディレクトリーにコピー」「コピーしない」に設定
8-3VB2005を終了してプロジェクトのフォルダにある「***.mdf」ファイルを
コピーしてプロジェクトのフォルダ→binフォルダDebugフォルダに貼り付ける

2011年7月25日月曜日

→→→入力時の全半角チェック

Imports System
Imports System.Text
Imports.System.RegularExpressions

Private Sub Button1_Click(....
     Dim intRet As Integer
     Dim dr As DataSet1.入力Row = DataSet11.入力.NewRow()
     '5ケタ半角で入力
     If Regex.IsMatch( TextBox1.Text , "^[0-9]{5}$" ) Then
             Try
                    TextBox1.Text = TextBox1.Text
             Catch ex As Exception
                    MsgBox(ex.ToString)
             End Try
     Else
             MsgBox("半角5ケタで入力してください")
     End If

      dr.SEQ = TextBox1.Text
      dr.Zip   = TextBox2.Text   
      '全角で入力
      intRet = CHK(TextBox3.Text , 0 )
      If intRec > 0 Then
           MsgBox("全角で入力してください")
Exit Sub
      Else
            dr.住所 = TextBox3.Text
      End If
      DataSet11.入力.Rows.Add( dr )
      UpdateDatabase()
End Sub

Private Sub Form1_Load( ....
       oleDbDataAdapter1.Fill( DataSet11, "入力" )
End Sub

Private Sub UpdateDatabase()
        If Not DataSet11.HasChanges() Then Return
        oleDbDataAdapter1.Update( DataSet11 )
End Sub

Private Function CHK(ByVal AO As String , ByVal AKA As String) As Long
       Dim nagasa As Long
       Dim position As Long
       Dim moji  As String
       Dim sjisEnc As Encoding = Encoding.GetEncoding("Shift-JIS")
       CHK = 0
       nagasa = AO.Length
       position = 1
       Do
             If position > nagasa Then
                Exit do
             End If
             moji = Mid( AO , position , 1 )
             If sjisEnc.GetByteCount( moji ) = 1 Then
                 If AKA = 0 Then
                      CHK = position
                      Exit Function
                 End If
             Else
                 If AKA = 1 Then
                      CHK = position
                      Exit Function
                 End If
             End If
             position = position + 1
         Loop
End Function
----------------------------------------
新規フォームに
TextBox1 = SEQ
TextBox2 = Zip
TextBox3 = 住所
Button1  =    登録
を貼り付け

     



     

2011年7月23日土曜日

→→→イベントとプロシージャを動的に結びつける

状況に応じて動的に結びつけるには{AddHandlerステートメント・RemoveHandlerステートメント}を使う


(1)例えば MyClickプロシージャとButton2のClickイベントを結びつけるには


   AddHandler  変数.イベント名 AddressOf イベントの関数


   AddHandler  Button2.Click  , AddressOf  MyClick


フォームにButton1,2を貼り付けてから
Private Sub Button1_Click( .... ) Handles Button1.Click
      AddHandler Button2.Click , AddressOf MyClick
End Sub


Private Sub MyClick( .... ) 
      MsgBox( sender.name )
End Sub


このプログラムを実行するとはじめButton2をクリックしても何も起きない。
Button1をクリックしてからButton2をクリックすると
MyClickプロシージャが呼び出される


Private Sub Button1_Click( .... ) Handles Button1.Click
   MsgBox("はじめ")
        RemoveHandler Button1.Click , AddressOf Button1_Click
        AddHandler Button1.Click , AddressOf MyClick
End Sub


Private Sub MyClick( .... )
         MsgBox("2回目以降")
End Sub


Button1_ClickプロシージャにHandles句があるので、はじめはButton1をクリックするとこのプロシージャ
が呼び出されます。
ところが、このプロシージャの中でRemoveHandlerステートメントが使用されていて、
Button1のClickイベントとButton1_Clickプロシージャの結びつきが削除されてしまう
それで新たにAddHandlerステートメントを利用して
Button1のClickイベントはMyClickプロシージャに結びつけられる

→→→KeyPressイベント

このイベントプロシージャの第2引数はKeyPressEventArgs型で入力されたキーに関する情報が
取得できる。
また、このKeyPressEventArgs型のHandledプロパティは読み取りだけでなく設定することもでき、
Trueを設定した場合はキーボードからの入力もキャンセルすることができる。


(例)テキストボックスに数字以外入力できないようにする。
Private Sub TextBox1_KeyPress(ByVal sender As Object ,
                            ByVal e As System.Windows.Forms.KeyPressEventArgs)
                                  Handles TextBox1.KeyPress
     If IsNumeric(e.KeyChar) = False Then
          e.Handled = True
     End If
End Sub

→→→お絵かき

Private Sub PictureBox1_MouseMove(ByVal sender As Object,
                                        ByVal e As System.Windows.Forms.MouseEventArgs)
                                               Handles PictureBox1.MouseMove
    Dim g  As Graphics = sender.CreateGraphics()
    If e.Button = MouseButtons.Left Then
          g.FillEllipse( Brushes.Red , e.X , e.Y , 10 , 10)
    ElseIf e.Button = MouseButtons.Right Then
          g.FillEllipse( Brushes.Blue , e.X , e.Y , 10 , 10)
    End If
End Sub

2011年7月22日金曜日

→→→イベントプロシージャの第2引数の使い方

-----------------------------------------------------------------------------
Private Sub Button1_Click(Byval sender As System.Object,
                               ByVal e As System.EventArgs)Handles Buttin1.Click

End Sub
-----------------------------------------------------------------------------
1つ目はイベントとプロシージャを結びつけるHandlesキーワードがある
2つ目は引数
イベントプロシージャには必ず2つの引数があり、
第1引数はObject型、第2引数はEventArgs型
この2つの要件を満たしいるものはすべてイベントプロシージャです。

第1引数はイベントを発生させたクラスが渡されています。上記の
Clickイベントプロシージャの場合、第1引数のsenderには
Button1がセットされています。
第2引数はイベントの追加情報が渡されてきます

*イベントプロシージャの使い方
-------------------------------------------------------------------------------
①MouseEnterイベント(マウスがコントロールの上に入ったときに発生)
Private Sub Button1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs)
                                                  Handles Button1.MouseEnter
         Button1.BackColor = Color.Pink
End Sub
--------------------------------------------------------------------------------
②MouseLeaveイベント(マウスカーソルがコントロール外に離れていったときに発生)
Private Sub Button1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs)
                                                  Handles Button1.MouseLeave
         Button1.BackColor = Color.FromKnownColor(KnownColor.Control)
End Sub
--------------------------------------------------------------------------------

→→→リストボックスにフィールドの値を一覧表示

ListBox1.DataSource = dSet.Tables("t_テスト")
ListBox1.DisplayMember = "コード"
ListBox1.ValueMember = "コード"


DisPlayMemberプロパティにはListBoxコントロールに表示するフィールド

表示したそれぞれの項目に対してプログラム内で実際に使うフィールドの値を
ValueMemberプロパティで指定

→→→テキストボックス

Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
                                  Data Source = D:\**.mdb; Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet , "t_テスト" )

TextBox1.DataBindings.Add("Text" , dSet.tables("t_テスト") , "コード")
TextBox2.DataBindings.Add("Text" , dSet.tables("t_テスト") , "製品")

Add.(プロパティ名 , テーブル名 , フィールド名)

次のレコードを表示
Me.BindingContext.Item(  ).Position += 1

2011年7月21日木曜日

→→→DataGridを編集可能かつ行の追加を不可にする

Dim dSet As DataSet = New DataSet("t_テスト")
Dim dView As DataView
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4..0;
                                Data Source=D:\***.mdb;Persist Security Info = False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet, "t_テスト" )

dView = New DataView( dSet.Tables("t_テスト"))

'新しい行を追加できないようにする
dViewAllowNew = False

DataGrid1.DataSource = dView

------------------------------------------------------------------
<クリックされたセルの行番号、列番号を取得>
Private Sub DataGrid1_MouseUp(ByVal sender As Object
                    ByVal e As System.Windows.Forms.MouseEventArgs) 
                                                                 Handles DataGrid1.MouseUp

   Dim hitInfo As DataGrid.HitTestInfo
   hitInfo = sender.HitTest( e.X , e.Y )

    MessageBox.show("クリックした行:" & hitInfo.Row + 1 & ControlChars.NewLine &
                              "クリックした列:" & hitInfo.Column + 1, "通知結果")
End Sub

→→→DataGrid(すでに開かれているDataGridをいじる)

Dim dSet As DataSet
Dim dTbl As DataTable
Dim i As Integer

dSet = DataGrid1.DataSource
dTbl = dSet.Tables(DataGrid1.DataMember)

For i = 0 To  dTbl.Rows.Count - 1
     Debug.WriteLine( i.ToString() & ControlChars.Tab & dTbl.Rows(i).RowState.ToString())
Next

-----------------------------------------------------------
Add      ---->追加された行
Deleted ---->削除された行
Detached -->DataRowコレクションに追加されていない行
Modified --->変更された行
Unchanged ->前回のAcceptChangesメソッド以降変更されていない行
-------------------------------------------------------------


DataGridの行の編集を確定する



Dim dSet As DataSet
Dim dTbl As DataTable
Dim i As Integer

dSet = DataGrid1.DataSource
dTbl = dSet.Tables(DataGrid1.DataMember)

For Each dRow In dTbl.Rows
    If dRow.RowState <> DataRowState.Unchanged Then
          dRow.AcceptChanges()
    End If
Next

For Each dRow In  dTbl.Rows
     i += 1
     Debug.WriteLine( i.ToString() & "行目" & dRows.RowState.ToString())
Next

DataGridを編集できないようにする
---------------------------------
DataGrid1.ReadOnly = True
-------------------------------------
<DataGridのセルのクリックイベントを処理する>
・DataGridコントロールのセルをクリックしたときのイベントを処理するには
 DataGridコントロールのセルを表す
 DataGridTextBoxオブジェクトのTextChangedイベントを利用する

TextChangeイベントを処理するイベントハンドラを作成し、
TextChangeイベントをAddHandlerステートメントと
AddressOf演算子を使ってイベントハンドラに関連付けます
-------------------------------------------
AddHandler イベント AddressOf イベントハンドラ
-------------------------------------------


→→→DataGridにタイトルをつける

Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4..0;
                                Data Source=D:\***.mdb;Persist Security Info = False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet, "t_テスト" )

DataGrid1.SetDataBinding(dSet, "t_テスト")

DataGrid1.CaptionText = "社員情報"
DataGrid1.CaptionForeColor = Color.Red
DataGrid1.CaptionBackColor = Color.White

---------------------------------------------------------------------
<タイトルバーを表示しない>

DataGrid1.CaptionVisible = False

---------------------------------------------------------------------
<一行おきに背景色をつける>

DataGrid1.AlternatingBackColor = Color.Gray

---------------------------------------------------------------------
<DataGridの高さを変更する>

DataGrid1.PreferredRowHeight = 30

---------------------------------------------------------------------
<DataGridの列見出しクリック時に並べ替えないようにする>

DataGrid1.AllowSorting = False




2011年7月20日水曜日

→→→DataGridの特定の行にマークをつける

商品コード 単価 チェック
A001           150     ○
B001           100     ○
C001           500


Dim dCol As DataColumn
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider~"

dAdp = New OleDbDataAdapter ("SELECT * FROM テスト" , ocn)
dAdp.Fill( dSet, "t_テスト")


dCol = dSet.Tables("t_テスト").Columns.Add("チェック")

dCol.Expression = "IIF(単価<200 , '○' , ' ' )"

DataGrid1.SetDataBinding( dSet , "t_テスト")

→→→DataGridにフィールドの値の1部を表示する

商品コード 種別
A001          CA
B001          IC
I005           BA


Dim dCol As DataColumn
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider~"

dAdp = New OleDbDataAdapter ("SELECT * FROM テスト" , ocn)
dAdp.Fill( dSet, "t_テスト")

dCol = dSet.Tables("t_テスト").Columns.Add(種別)
dCol.Expression = "SUBSTRING(商品コード,1,2)"
DataGrid1.SetDataBinding( dSet , "t_テスト")

→→→DataGridに集計値を表示する

<DataColumn><Expression>

仕入テーブル
伝票NO 仕入日 商品コード 数量
001       2008/7/1  A001        100
002       2008/7/5  B001        250

商品テーブル
商品コード 商品名 単価
A001           *****    270
B001           /////    500

--------------------------------------------------
Dim dCol As DataColumn
Dim dSet As DataSet = New DataSet("仕入")
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider~"


dAdp = New OleDbDataAdapter ("SELECT * FROM 仕入" , ocn)
dAdp.Fill( dSet, "t_仕入")

dAdp = New OleDbDataAdapter ("SELECT * FROM 商品" , ocn)
dAdp.Fill( dSet, "t_商品")

dSet.relations.Add("商品売上", dSet.Tables("t_商品").Columns("商品コード"),
                                            dSet.Tables("t_仕入").Columns("商品コード"))
dCol = dSet.Tables("t_商品").Columns.Add("仕入数")
dCol.Expression = "SUM(Child.数量)"
DataGrid1.SetDataBinding( dSet , "t_商品")


→→→DataGridにフィールドを連結した列を追加

Dim dCol As DataColumn
Dim dSet As DataSet = New DataSet("t_テスト")
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
                                Data Source=D:\***.mdb;Persist Security Info = False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト" , ocn)
dAdp.Fill( dSet , "t_テスト")

dCol = dSet.Tables("t_テスト").Columns.Add("[コード]製品名")
dCol.Expression = "コード + 製品名"

DataGrid1.SetDataBinding( dSet , "t_テスト")

-------------------------------------------------------
(1)DataGridコントロールに列を追加するには
           dCol = dSet.Tables("テーブル名").Columns.Add("見出し")
(2)既存の複数のフィールドを連結したものにするにはExpressionプロパティを使う

→→→DataGridに表示する

'スタンダード<DataGrid表示>

Dim dSet As DataSet = New DataSet("t_テスト")
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4..0;
                                Data Source=D:\***.mdb;Persist Security Info = False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet, "t_テスト" )

DataGrid1.SetDataBinding(dSet, "t_テスト")

→→→条件に合致したレコードのみDataGridに表示する

Dim dView As DataView
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
                                 Data Source=D:\***.mdb;Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト",ocn)
dAdp.Fill( dSet, "t_テスト")
dView = New DataView(dSet.Tables("t_テスト"),"コード2", "" , DataViewRowState.CurrentRows)
DataGrid1.DataSource = dView


*DataGridの行のヘッダの幅を変更する
       DataGrid1.RowHeaderWidth = 30

*DataGridの行ヘッダを表示しない
       DataGrid1.RowHeadersVisible = False

2011年7月19日火曜日

→→→DataGridにデータの内容を表示する

テーブルへのデータ追加
DataRow
      Dim dRow As DataRow
      dRow = dTbl.NewRow()
      dRow("Name") = "Smith"
      dTbl.Rows.Add( dRow )

dTbl -->  "id"<Column> "Name"<Column>  ---->   dRow("id") dRow("Name")

(A)
       Dim dTbl As DataTable = New DataTable
       Dim dRow As DataRow
       Dim dView As DataView
       Dim i As Integer

       dTbl.Columns.Add("id" , Type.GetType("SYstem.Int32"))
       dTbl.Columns.Add("Name" , Type.GetType("System.String"))
       For i = 0 To 9
            dRow = dTbl.NewRow()
            dRow(" id ") = i
            dRow(" Name ") = "item" & i
            dTbl.Rows.Add( dRow )
       Next
       dView = New DataView( dTbl )
       DataGrid1.DataSource = dView

(B)
       Dim dSet As DataSet = New DataSet("リス")
       Dim dTbl As DataTable
       dTbl = dSet.Tables.Add("種類")
       dTbl.Columns.Add("NO" , Type.GetType("System.Int32"))
       dTbl.Columns.Add("名前" , Type.GetType("System.String"))

       dTbl.Rows.Add( New Object() { 1 , "シマリス" })
       dTbl.Rows.Add( New Object() { 2 , "エゾリス" })
       dTbl.Rows.Add( New Object() { 3 , "シケリス" })
       DataGrid1.SetDataBinding( dSet , "種類" )

(C)
       Dim dSet As DataSet = New DataSet
       Dim dTbl As DataTable
       Dim dRow As DataRow
       Dim i As Integer
       dTbl = dSet.Tables.Add("種類")
       dTbl.Columns.Add("NO" , Type.GetType("System.String"))

       For i = 0 To  9
            dRow = dTbl.NewRow()
            dRow("NO") = i
            dTbl.Rows.Add( dRow )
       Next
       DataGrid1.SetDataBinding( dSet, "種類")

   

→→→トランザクションを開始/終了

トランザクションを使用することによってデータベース更新中にエラーが
発生した場合、データ整合性を保持することができる

BeginTransactionメソッド

トランザクションを終了するには、Commitメソッドを使う
Commitメソッドはトランザクション処理中のデータベース操作を確定して
トランザクションを終了する

Dim sTrans As OleDbTransaction
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OlEDB.4.0;
                                  DataSource=D:\**mdb;Persist Security Info=False"
ocn.open()

Try
    sTrans = ocn.BeginTransaction()
    MessageBox.show("トランザクションを開始しました")
    sTrans.Commit()
Catch ex As Exception
    MessageBox.show("トランザクションを開始できませんでした")
End Try
ocn.Close()

→→→まとめ②

1.データセット(データベースに非接続のキャッシュ)
データセットにデータを取得する( .Fill )
      < .Fillメソッド >
              第1引数 レコードの内容を取得するDataSetオブジェクト
              第2引数 テーブル名

2.データセットのデータを参照する
データベースのテーブル = DataTableオブジェクト
                                                ↓
レコードの内容としてRowsプロパティ

3.データセットのデータを配列に取得
DataRowオブジェクトはRowsプロパティにインデックスを指定して取得

DataRowオブジェクトのItemArrayプロパティを使うと
DataSetオブジェクトのテーブルデータ(レコード)を
配列に取得できる

-- 基本形 ----------------------------------------------------------------
Dim dSet As DataSet = New DataSet
Dim dAdp As OleDbDataAdapter
Dim ocn As OleDbConnection = New OleDbConnection
ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;
                                  Data Source = D:\**.mdb; Persist Security Info=False"
dAdp = New OleDbDataAdapter("SELECT * FROM テスト", ocn )
dAdp.Fill( dSet , "t_テスト" )
------------------------------------------------------------------------

'レコード数
   Dim rNum As Integer
   rNum = dSet.Tables("t_テスト").Rows.Count

'配列
   Dim dRow As DataRow
   Dim RecArray() As Object
      For Each dRow In dSet.Tables("t_テスト").Rows
            RecArray = dRow.ItemArray
      Next

'指定した行番号のレコードを取得
   Dim dRow As DataRow
   dRow = dSet.Tables("t_テスト").Rows.Item(1)

'フィールドを指定して値を取得
   Dim dRow As DataRow
   For Each dRow In dSet.Tables("t_テスト").Rows
        Debug.Write( dRow("社員NO") & dRow("氏名")
    Next

'修正
   Dim cCon As OleDbCommandbuilder
   dSet.Tables("t_テスト").Rows(0)("製品名") = "修正内容"
   cCon = New OleDbCommandBuilder( dAdp )
   dAdp.Update( dSet , "t_テスト" )

'追加
   Dim dRow As DataRow
   Dim cCon As OleDbCommandBuilder
   dRow = dSet.Tables("t_テスト").NewRow
   dRow("社員NO") = "1999"
   dRow("氏名")  = "山田"
   dSet.Tables("t_テスト").Rows.Add( dRow )
   cCon = New OleDbCommandBuilder( dAdp )
   dAdp.Update( dSet, "t_テスト")

'削除
   Dim dRow As DataRow
   Dim cCom As OleDbCommandBuilder
   dRow = dSet.Tables("t_テスト").Rows(0)
   dRow.Delete()
   cCom = New OleDbCommandBuilder( dAdp )
   dAdp.Update( dSet, "t_テスト" )

Windows ------ データセット ------ データアダプタ ---- コネクション ---- DB



2011年7月18日月曜日

→→→まとめ①

1.データセットのテーブル数を取得
DataSetオブジェクト.Tables.Count
     Dim dSet As DataSet = New DataSet("~")
      Dim dTbl As DataTable
      dTbl = dSet.Tables.Add("ドリンク")
      Debug.writeLine("テーブル数:" & dSet.Tables.Count)
      dTbl = dSet.Tables.Add("デザート")
      Debug.WriteLine("テーブル数:" & dSet.Tables.Count)

2.データセットのテーブルを削除するには、Removeメソッド
     Dim dSet As DataSet = New DataSet("~")

      Dim dTbl As DataTable

      dTbl = dSet.Tables.Add("ドリンク")
      Debug.writeLine("テーブル数:" & dSet.Tables.Count)

      dSet.Tables.Remove("ドリンク")
      Debug.WriteLine("テーブル数:" & dSet.Tables.Count)

3.データセットのテーブル間にリレーションを設定
 DataSetオブジェクト.Relations.Add (リレーション名, 親フィールド, 子フィールド)
     Dim dSet As DataSet = New DataSet("~")
      Dim dTbl As DataTable

      dTbl = dSet.Tables.Add("ドリンク")
      dTbl.Columns.Add("ID", Type.GetType("System.Int32"))
      dTbl.Columns.Add("メニュー", Type.GetType("System.String"))
   
      dTbl = dSet.Tables.Add("売上")
      dTbl.Columns.Add("NO", Type.GetType("System.Int32"))
      dTbl.Columns.Add("個数", Type.GetType("System.String"))

      'リレーションを設定
      dSet.Relations.Add("メニュー別売上"
             ,  dSet.Tables("ドリンク").Columns("ID")
             ,  dSet.Tables("売上").Columns("NO"))

4.テーブルにフィルタを設定
   DataRowオブジェクトのSelectメソッドを使ってデータセットのテーブルにフィルタを
   設定した結果を得ることができる
   Selectメソッドの引数には、フィルタ基準となる条件式を
   「"フィールド名 > 100"」のように指定
   また、第2引数でフィールドの値に応じた並べ替えを指定
   並べ替えは昇順のときは「"フィールド名 ASC"」
          降順のときは「"フィールド名 DESC"」と指定できる

   Selectメソッドの戻り値はDataRowオブジェクトの配列

 Dim RetRows As DataRow()
 Dim dRow As DataRow
 Dim dCol As DataColumn
 Dim dSet As DataSet = New DataSet("~")
 Dim dAdp As OleDbDataAdapter
 Dim ocn As OleDbConnection = New OleDbConnection
 ocn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\***.mdb;Persist Security Info=False
 dAdp = New OleDbDataAdapter("SELECT * FROM 商品",ocn)
 dAdp.Fill( dSet , "t_商品" )
 RetRows = dSet.Tables("t_商品").Select("単価>=200", "単価 DESC")
 If RetRows.Length = 0 Then
        Debug.WriteLine("見つかりませんでした")
        Exit Sub
 End If
 For Each dRow In RetRows
     For Each dCol  In dRow.Table.Columns
            Debug.Write(ControlChars.Tab & dRow( dCol) )
     Next
     Debug.WriteLine("")
 Next