7月のページ閲覧ランキング

7月によく見られたページのランキングです。

1.[VB.NETde業務アプリ]
2.[VB-Reportのまとめ]@[VB.NETde業務アプリ]
3.[.NET FrameworkのPrintDocumentについてのまとめ]@[VB.NETde業務アプリ]
4.[ADO.NETの基本的なコード:「非接続型アクセス」の接続とデータ更新]@[VB.NETde業務アプリ]
5.[ADO.NETの基本的なコード:「非接続型アクセス」の接続とデータ参照]@[VB.NETde業務アプリ]
6.[帳票印刷について考える]@[VB.NETde業務アプリ]
7.[レコードを登録するコード]@[VB.NETde業務アプリ]
8.[ADO.NETの基本的なコード:トランザクション処理]@[VB.NETde業務アプリ]
9.[DataSet(DataTable)の更新]@[VB.NETde業務アプリ]
10.[UIで共通に使われるコードを作成する]@[VB.NETde業務アプリ]
11.[5月の検索フレーズ]@[VB.NETde業務アプリ]
12.[データベースへのアクセスのクラス]@[VB.NETde業務アプリ]
13.[ADO.NETの基本的なコード:「接続型アクセス」の接続とデータ更新]@[VB.NETde業務アプリ]
14.[プレースホルダ使ってますか?]@[VB.NETde業務アプリ]
15.[ADO.NETの基本的なコード:「接続型アクセス」の接続とデータ参照]@[VB.NETde業務アプリ]

この記事の全文を読む....

ADO.NETの基本的なコード:「SQLの非同期実行」(その2)

実際にコードを書いてみるとこんな感じ

 Dim SqlCommand As New Data.SqlClient.SqlCommand("処理の重いSQL文")
 Using asyncDBConnection As New System.Data.SqlClient.SqlConnection(DBConnectionString)
 ※DBConnectionStringには「async=true」を加えておく
  Try
   asyncDBConnection.Open()
   SqlCommand.Connection = asyncDBConnection

   Dim result As IAsyncResult = SqlCommand.BeginExecuteNonQuery()
   While Not result.IsCompleted
    ※SQL文が完了するまで待つループ
    Threading.Thread.Sleep(100)
    System.Windows.Forms.Application.DoEvents()
    ※とりあえずDoEventsでUIが固まらないようにするよ
   End While

   SqlCommand.EndExecuteNonQuery(result)
  Catch ex As Exception
   MsgBox(ex.Message)
   ※発生した例外のメッセージを表示してみる
  End Try
 End Using
書いてみると結構簡単
これで処理が重いSQL文を発行してもUIが固まらなくなった。

この記事の全文を読む....

ADO.NETの基本的なコード:「SQLの非同期実行」(その1)

扱うデータ件数が多くなってきたり、複雑な問い合わせをデータベースにさせると、だんだんレスポンスが悪くなり「UIが固まる」ことがよくあります。

それを防ぐためにADO.NET 1.xでは別スレッドで処理したりしていたのですが、ADO.NET 2.0とSqlServerの組み合わせでは「SQLの非同期実行」ができるようになっています。
これを効果的に使うことで、実行時間のかかるクエリを実行するときに「UIが固まる」ことがなくなります。

データの件数が増えてきたり、複雑な問い合わせをさせる機会が増える頻度に合わせて
mdbファイル(デプロイが簡単なので手放せない)→SqlServer
とアップサイズしていく訳ですが、特に「非接続型アクセス」を多用するスタイルでは「UIが固まる」頻度が高いです。
ともかく(応答なし)と出てしまうのはみっともないですし...

そこで本題
今回は「ExecuteNonQuery」の非同期化から
ADO.NET 2.0になって非同期実行用の「BeginExecuteNonQuery」と「EndExecuteNonQuery」が増えています。
「BeginExecuteNonQuery」で実行を開始して「EndExecuteNonQuery」で結果を拾います。

・非同期実行をするためには?
接続文字列に「async=true」を加えて接続すると非同期実行が使えます。
この状態でも同期実行用の「ExecuteNonQuery」は実行できます。(パフォーマンスは落ちますが...)

・非同期実行完了の検出
「BeginExecuteNonQuery」を実行すると結果が出た出ないにかかわらず、すぐに処理が戻ってきます。
ここが同期実行用の「ExecuteNonQuery」との大きな違いです。
同期実行の場合はデータベースの処理が完了しないと処理が戻ってきません。
処理が戻ってこない→UIの処理がされない→「UIが固まる」
となってしまう訳です。
逆に非同期実行ではそのようなことがない代わりにいつデータベース側で処理が終わったかわかりません。
したがって非同期実行完了の検出をしてあげる必要があります。

今回は一番処理が簡単そうな「ポーリング」で処理完了の検出を行うことにしました。

この記事の全文を読む....

合計請求書(請求書の表紙)を印刷する簡単なプログラムに手を入れる(その3)

今回は
・登録した発行履歴を使って入力を簡易化する
です。

入力を簡易化するために(それだけではありませんが..)コード入力という手法がよく使われます。
ただコード決めることさえも面倒くさいことがちょくちょくありませんか?
そんな時には発行履歴を使って入力を簡易化してみましょう。
まず発行履歴を表示、選択するフォームを作成します。

FormにDataGridViewを1つ置いただけです。
「親コンテナにドッキングする」を選択しておきましょう。

これからコードを書いていきます。
まずは「発行履歴を表示、選択するフォーム」側から
  Public Class Form請求先選択
    Dim db As New database.MSAccess.DBAccess
    Dim SqlCommand As OleDb.OleDbCommand
    Dim dt As DataTable
  
    Private Sub Form_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
      Call dgvFill()
    End Sub
  
    Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      AddHandler Me.FormClosing, AddressOf CommonLib.Form_FormClosing
    End Sub
  
    Private Sub dgvFill()
      SqlCommand = New OleDb.OleDbCommand("SELECT DISTINCT [宛先1行目] & [宛先2行目] AS 宛先, 宛先1行目, 宛先2行目 FROM 発行履歴 ORDER BY [宛先1行目] & [宛先2行目];")
  
      dt = db.getDataTable(SqlCommand)
  
      If IsNothing(dt) Then
        Dim ex As Exception = db.SQLException
        MsgBox("請求先の取り出しでエラーが発生しました。" & vbNewLine & ex.Message, MsgBoxStyle.Information, "")
        Exit Sub
      Else
        Try
          dgv.Columns("宛先1行目").Visible = True
          dgv.Columns("宛先2行目").Visible = True
        Catch ex As Exception
          'なにもしない
        End Try
  
        dgv.DataSource = dt.DefaultView
  
        dgv.Columns("宛先1行目").Visible = False
        dgv.Columns("宛先2行目").Visible = False
  
        Call dgvFormat()
      End If
    End Sub
  
    Private Sub dgvFormat()
      'dgvの設定
      dgv.AllowUserToResizeRows = False
  
      '-----明細行の色を変える-----
      dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.LightCyan
      '----------------------------
  
      '-----明細行の選択は行選択にする-----
      dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect
      '----------------------------
  
      '-----列の各設定-----
      dgv.Columns("宛先").ReadOnly = True
  
      dgv.Columns("宛先").Width = 330
      '--------------------
  
    End Sub
  
    Private Sub dgv_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv.DoubleClick
      Try
        If dgv.CurrentRow.Index = -1 Then Exit Sub
      Catch ex As Exception
        Exit Sub
      End Try
  
      If dgv.Item(1, dgv.CurrentRow.Index).Value.ToString.Length = 0 Then
        Try
          frm合計請求書発行.tb1行目.Text = ""
          frm合計請求書発行.tb1行目.Visible = False
        Catch ex As Exception
          'なにもしない
        End Try
      Else
        frm合計請求書発行.tb1行目.Text = dgv.Item(1, dgv.CurrentRow.Index).Value.ToString
        frm合計請求書発行.tb1行目.Visible = True
      End If
  
      frm合計請求書発行.tb2行目.Text = dgv.Item(2, dgv.CurrentRow.Index).Value.ToString
      frm合計請求書発行.tb今回請求金額.Focus()
  
      Me.Close()
    End Sub
  End Class

つぎに呼び出す側も書いていきます。
今回は請求先の入力欄をダブルクリックすると、選択画面が表示されるようにしました。
  Private Sub tb2行目_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tb2行目.DoubleClick
    If IsNothing(frm請求先選択) Then
      frm請求先選択 = New Form請求先選択
      frm請求先選択.Owner = Me
    End If

    frm請求先選択.Show()
  End Sub

これで請求先の入力欄をダブルクリックすると選択画面が表示され、発行履歴の行をダブルクリックすると請求先の入力欄が入力されるようになりました。

この記事の全文を読む....

「Academia in 大阪」行ってきました

Infragistics社が主催するセミナー「Academia in 大阪」行ってきました


主な目的は本業で使うためのコンポーネント製品の情報収集だったんですが面白そうな製品群でした。
Silverlight使うと業務アプリケーションも一気に表現力が高まりますね
テクノロジーの採用に対するハードルはすごく下がったような気がします
ただセンスよく見せるために超えなくてはいけないハードルはまだまだ高そうです

残念ながらWindowsForms関連のネタがなかったので、このブログで扱えそうなものはありませんでした
もしWindowsForms関連のセミナーがあれば是非参加したいですね
Demo版ではモチベーション上がらないのでここで取り上げるのはかなり先の話になりそうですが、入手できたらすぐに使えそうなコントロール群がちらほら...
早くAdSenseの収益が貯まらないかなぁ(笑)

セミナー終了後ビンゴ大会があり、何名かの方が実際の製品を獲得されたようです
・[NetAdvantage for Silverlight Data Visualization]×1人
・[アイコン集]×2人位?
・ボールみたいなグッズ+スタバのカード×3人位?
だったかな?

もちろん当たるはずもなく、Demo版のDVDとTシャツをいただいて帰りました

この記事の全文を読む....