C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 接続エラーの原因及び処置方法


(過去ログ 29 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■13607 / inTopicNo.1)  接続エラーの原因及び処置方法
  
□投稿者/ NORTH (14回)-(2008/01/31(Thu) 21:06:28)

分類:[VB.NET/VB2005] 

SQLサーバー2005
VB.NET


販売管理システムの起動で最初ログイン画面を表示するのですが、20回に1回ぐらい
の割合で接続エラーになります。
プログラムは下記の通りです。
原因はたまたまタイミングが悪いからなんでしょうか?
LAN環境はVPN接続(ルータ有)と社内LAN(ルータ無し)の2種類ですが
VPN接続環境で時々エラーが出るようです。
原因がわかれば教えて下さい。
また、わからない場合は2回程リトライしようと思っているのですが、下記の
Openメッソッドでループ処理をしたいのですが、書き方がわかりません。
わかる方教えて下さい。
Openメッソッドの中に記述して下さい。
(ログイン画面でループするのはNG。他にも同じようなPGがたくさんあるため)



DB接続プログラム
Public Function Open() As Boolean

Dim blnRet As Boolean = False
Try
Select Case Mode
Case 0, 1
Command = Connection.CreateCommand
Command.Connection = Connection
DataAdapter = New SqlDataAdapter(Command)
DataAdapter.SelectCommand = Command
Connection.Open()
IsOpen = True
Case 1
Case 2
End Select
blnRet = True
Catch ex As SqlException
If ex.ErrorCode = -2146232060 Then
Select Case Mode
Case 0, 1
Command = Nothing
DataAdapter = Nothing
Connection = Nothing
IsOpen = False
Case 1
Case 2
End Select
MessageBox.Show("接続に失敗しました1。再度クリックして下さい。", MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
'Throw ex
KillMe()
End If
Catch ex As Exception
Select Case Mode
Case 0, 1
Command = Nothing
DataAdapter = Nothing
Connection = Nothing
IsOpen = False
Case 1
Case 2
End Select
MessageBox.Show("接続に失敗しました2。再度クリックして下さい。", MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
'Throw ex
KillMe()
Finally
Open = blnRet
End Try

End Function



ログイン画面起動プログラム
Public Sub Main()

Try
If Not ClsCommonChk.FncRepertStart(Process.GetCurrentProcess) Then
End
End If

PRG_ID_C = My.Application.Info.AssemblyName

param.Param.PRG_ID_C = PRG_ID_C
param.Param.Para1 = "#"
param.Param.Para2 = "#"
param.Param.Para3 = "#"
param.Param.Para4 = "#"
param.Param.Para5 = "#"

If ClsParameter.GetConfig(Application.StartupPath) Then
clsDB = New ClsDataBase(ClsParameter.ConnectionString)
clsDB.Open()
clsMsg = New ClsMessage(clsDB, param)
clsExclusive = New ClsExclusive(clsDB)

Application.EnableVisualStyles()
Application.Run(ログイン)
Else
MessageBox.Show("AAA.xmlが見つかりません。", MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
Catch ex As Exception
MessageBox.Show(ex.Message, MessageTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Finally
If clsDB.IsOpen Then
clsDB.Close()
End If
clsDB = Nothing
clsMsg = Nothing
End Try

End Sub

引用返信 編集キー/
■13620 / inTopicNo.2)  Re[1]: 接続エラーの原因及び処置方法
□投稿者/ 七曜 (64回)-(2008/01/31(Thu) 23:19:23)
No13607 (NORTH さん) に返信
> 販売管理システムの起動で最初ログイン画面を表示するのですが、20回に1回ぐらい
> の割合で接続エラーになります。
> プログラムは下記の通りです。
> 原因はたまたまタイミングが悪いからなんでしょうか?
> LAN環境はVPN接続(ルータ有)と社内LAN(ルータ無し)の2種類ですが
> VPN接続環境で時々エラーが出るようです。
> 原因がわかれば教えて下さい。

例外の中身を見てみないとなんとも・・・。

> また、わからない場合は2回程リトライしようと思っているのですが、下記の
> Openメッソッドでループ処理をしたいのですが、書き方がわかりません。

        Const RETRY_MAX As Integer = 2

        Dim open As Boolean = False
        Dim retry As Integer = 0

        While ((Not (open)) And (retry < RETRY_MAX))
            Try
                '   処理が成功したらフラグを立てる(ここではリトライさせるのでコメントアウトしておきます。)
                '   open = True
                '   サンプルなので強制的に例外を発生させます。
                Throw New ApplicationException("サンプル例外")

            Catch ex As Exception
                If (retry < RETRY_MAX) Then
                    retry += 1
                    '   リトライ時にしておきたい処理
                    MessageBox.Show(String.Format("{0}回目", retry))
                Else
                    '   リトライ回数を超えた時にしておきたい処理
                End If
            End Try
        End While

引用返信 編集キー/
■13627 / inTopicNo.3)  Re[2]: 接続エラーの原因及び処置方法
□投稿者/ NORTH (15回)-(2008/02/01(Fri) 00:12:59)
No13620 (七曜 さん) に返信
> ■No13607 (NORTH さん) に返信
>>販売管理システムの起動で最初ログイン画面を表示するのですが、20回に1回ぐらい
>>の割合で接続エラーになります。
>>プログラムは下記の通りです。
>>原因はたまたまタイミングが悪いからなんでしょうか?
>>LAN環境はVPN接続(ルータ有)と社内LAN(ルータ無し)の2種類ですが
>>VPN接続環境で時々エラーが出るようです。
>>原因がわかれば教えて下さい。
>
> 例外の中身を見てみないとなんとも・・・。
>
>>また、わからない場合は2回程リトライしようと思っているのですが、下記の
>>Openメッソッドでループ処理をしたいのですが、書き方がわかりません。
>
> Const RETRY_MAX As Integer = 2
>
> Dim open As Boolean = False
> Dim retry As Integer = 0
>
> While ((Not (open)) And (retry < RETRY_MAX))
> Try
> ' 処理が成功したらフラグを立てる(ここではリトライさせるのでコメントアウトしておきます。)
> ' open = True
> ' サンプルなので強制的に例外を発生させます。
> Throw New ApplicationException("サンプル例外")
>
> Catch ex As Exception
> If (retry < RETRY_MAX) Then
> retry += 1
> ' リトライ時にしておきたい処理
> MessageBox.Show(String.Format("{0}回目", retry))
> Else
> ' リトライ回数を超えた時にしておきたい処理
> End If
> End Try
> End While
>

早速の回答ありがとうございます。
サンプルプログラムを参考にして、試してみます。
一般的にやはりSQLサーバーへの接続処理はリトライ処理を
いれるものなのでしょうか?
それとも、原因を究明しリトライなんかしなくてもうまくいくように
するべきなのでしょうか?


原因についてなんですが、例外の中身とは、何を調べればいいんでしょうか?
教えて下さい。

引用返信 編集キー/
■13658 / inTopicNo.4)  Re[3]: 接続エラーの原因及び処置方法
□投稿者/ 七曜 (65回)-(2008/02/01(Fri) 10:53:01)
2008/02/01(Fri) 10:54:06 編集(投稿者)
No13627 (NORTH さん) に返信
> 原因についてなんですが、例外の中身とは、何を調べればいいんでしょうか?
> 教えて下さい。


例外についての大まかなことはここら辺をみるとよろしいかと思います。

[例外の処理とスロー]
http://msdn2.microsoft.com/ja-jp/library/5b2yeyab(VS.80).aspx

で、私の言っている例外の中身というのは、

[Exception クラスとプロパティ]
http://msdn2.microsoft.com/ja-jp/library/5whzhsd2(VS.80).aspx

を見て頂くとご理解いただけるかな、と思いますが、先に提示しているコードで言いますと

Catch ex As Exception

で、例外をExceptionクラスとして受けていますので、
このexの実体の型(という表現が正しいのかな?)の判別をする必要があるでしょう。
例えば、
[SqlException クラス (System.Data.SqlClient)]
http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqlexception(VS.80).aspx
なんかがexの実体だったりするわけです。
実際の型がわかると、その例外のプロパティ(Message、StackTrace、InnerExceptionなど)から
もう少し例外の内容がわかるので・・・これを「中身」と言いました。

で、Catchブロックは複数かけるので、想定出来る例外と想定してない例外(微妙な表現ですが)の処理を
わけておくことも出来ます。

        Try
            'Throw New ApplicationException("例外発生1!!!")
            Throw New ArgumentException("例外発生2!!!")
        Catch ea As ApplicationException
            MessageBox.Show(String.Format("{0}が発生しました。Message({1})", ea.GetType().Name, ea.Message))
        Catch ex As Exception
            MessageBox.Show(String.Format("{0}が発生しました。Message({1})", ex.GetType().Name, ex.Message))
        End Try

ですので、先の例外の中身がわかっていて、接続エラー時の例外の型やプロパティ値が特定出来るのであれば
それだけをリトライ対象にする・・・なんてことも出来ますね。

引用返信 編集キー/
■13704 / inTopicNo.5)  Re[3]: 接続エラーの原因及び処置方法
□投稿者/ 七曜 (70回)-(2008/02/01(Fri) 20:45:13)
No13627 (NORTH さん) に返信
> 一般的にやはりSQLサーバーへの接続処理はリトライ処理を
> いれるものなのでしょうか?
> それとも、原因を究明しリトライなんかしなくてもうまくいくように
> するべきなのでしょうか?

ああ、こちらの質問への回答をしてませんでしたね。
例外の内容によっては、リトライする事に意味があるかもしれませんが、
リトライしても同じ例外が発生する様な原因である場合、意味がないので、
一般的にどうか、は、わかりませんが、私は(自動)リトライは基本的にしない派です。
システムエラー系はログを書いて詳細追跡出来る様にしておいて、
原因を分析する方が本質的な解決策への近道だったりする事が多いと思うからです。
引用返信 編集キー/
■13717 / inTopicNo.6)  Re[4]: 接続エラーの原因及び処置方法
□投稿者/ NORTH (16回)-(2008/02/03(Sun) 01:46:25)
No13704 (七曜 さん) に返信
> ■No13627 (NORTH さん) に返信
>>一般的にやはりSQLサーバーへの接続処理はリトライ処理を
>>いれるものなのでしょうか?
>>それとも、原因を究明しリトライなんかしなくてもうまくいくように
>>するべきなのでしょうか?
>
> ああ、こちらの質問への回答をしてませんでしたね。
> 例外の内容によっては、リトライする事に意味があるかもしれませんが、
> リトライしても同じ例外が発生する様な原因である場合、意味がないので、
> 一般的にどうか、は、わかりませんが、私は(自動)リトライは基本的にしない派です。
> システムエラー系はログを書いて詳細追跡出来る様にしておいて、
> 原因を分析する方が本質的な解決策への近道だったりする事が多いと思うからです。

回答ありがとうございます。
例外の中身を調べて原因を調べてみます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -