Friend Function ret(ByVal argConnectionString As String,
ByVal argDataTable As DataTable) As Integer
Try
_logger.MethodStart()

' クエリ生成
Dim query As New System.Text.StringBuilder
gf_AddQueryInformation(query, System.Reflection.MethodBase.GetCurrentMethod)
With query
.AppendLine("SELECT *")
.AppendLine(" FROM aaa")
.AppendLine(" ORDER BY aaa ASC")
End With

Try
Using DB As New OracleAccess(argConnectionString),
oraCmd As New OracleCommand(Convert.ToString(query))
DB.Open()

' パラメーター設定
' なし

' ★SELECT
Return DB.GetDataTable(oraCmd, argDataTable)

End Using

Catch ex As Exception
Throw
End Try
Finally
_logger.MethodEnd()
End Try
End Function



Friend Function us_Save(ByVal argParamSave As aaa_ConfigPopBC.ParamSave,
ByVal argDB As OracleAccess) As Integer?
Try
_logger.MethodStart()

' クエリ生成
Dim query As New System.Text.StringBuilder
gf_AddQueryInformation(query, System.Reflection.MethodBase.GetCurrentMethod)
With query
.AppendLine("UPDATE aaa")
.AppendLine(" SET aaa" & argParamSave.KitColumnName & " = :Kit,")
.AppendLine(" MOD = :ModifyId,")
.AppendLine(" MOD = :ModifyDate")
.AppendLine(" WHERE aaa = :aaa")
End With

Dim returnCount As Integer?
Try
Using oraCmd As New OracleCommand(query.ToString)

' パラメーター設定
oraCmd.Parameters.Add("aaa", argParamSave.sss)
oraCmd.Parameters.Add("mod", argParamSave.ModifyId)
oraCmd.Parameters.Add("mod", argParamSave.ModifyDate)
oraCmd.Parameters.Add("id", argParamSave.Id)

' ★UPDATE
returnCount = argDB.ExecuteNonQuery(oraCmd)
Return returnCount
End Using
Catch oraex As OracleException
Throw
Catch ex As Exception
Throw
End Try

Return returnCount
Finally
_logger.MethodEnd()
End Try

End Function


Imports System.Windows.Forms
Imports log4net
Imports log4net.Appender
Imports log4net.Layout

''' ---------------------------------------------------------------------
'''
''' Log4netをラップした、ログ出力用クラス。
'''

'''
''' ローカルログは暗号化する都合上、
''' ログへのクラス名出力はlog4netの標準機能ではなく
''' 呼び出し元から引数で渡す方式にしています。
'''

''' ---------------------------------------------------------------------
Public Class Logger

''' ログの出力先(アプリケーション実行パス配下の記述を指定します)
Private Const LOG_OUTPUT_PATH As String = "\Log\NetShoppingV2.log"

''' ログのUDP送信先IPアドレス
Private Const UDP_SEND_IP_ADDRESS As String = "192.168.200.47" ' 192.168.200.47 NetShoppingV2エラー受信端末(仮想環境)

' ''' ログファイルの暗号化可否
' Private Property IsEncrypt As Boolean

''' 実際にログ出力に使用する「呼び出し元クラス名」
Private Property CallerName As String

Private _logger As ILog
Private Shared _log As Logger = Nothing '自分自身のインスタンス

Private _Caller As Type
Private Property Caller As Type ' 呼び出し元クラス
Set(value As Type)
_Caller = value

' 名前空間が「Dhc.NetShoppingV2.」の場合→名前空間カットしてログ出力
' 名前空間が「Dhc.NetShoppingV2.」以外の場合→名前空間付きでログ出力
If IsNothing(Caller) Then
CallerName = ""
ElseIf _Caller.FullName.Length < 18 Then
CallerName = _Caller.FullName
ElseIf _Caller.FullName.Substring(0, 18).ToUpper = "DHC.NETSHOPPINGV2." Then
CallerName = _Caller.Name
Else
CallerName = _Caller.FullName
End If

End Set
Get
Return _Caller
End Get
End Property


''' ----------------------------------------------------------------------------------------------------
'''
''' Log4Netの各種設定を行います。アプリケーション起動時に一度だけ実行されます。
'''

'''
''' ----------------------------------------------------------------------------------------------------
Public Sub SettingLogConfig()
'Dim h As Hierarchy = DirectCast(LogManager.GetRepository, Hierarchy)
'h.LoggerFactory.CreateLogger(h, "logger")
'Dim logger As Repository.Hierarchy.Logger = h.GetLogger("logger", h.LoggerFactory)

Dim repositories As Repository.ILoggerRepository() = LogManager.GetAllRepositories()
For Each Repository As Repository.ILoggerRepository In repositories

' ファイル出力の設定 --->
' ログの書式
Dim fileAppenderLayout As New PatternLayout With
{.ConversionPattern = "%date [%-2thread] %-5level - %message %newline"}
fileAppenderLayout.ActivateOptions()

Dim fileAppender As New RollingFileAppender With
{.Name = "RollingFileAppender",
.File = Application.StartupPath + LOG_OUTPUT_PATH,
.StaticLogFileName = True,
.AppendToFile = True,
.RollingStyle = RollingFileAppender.RollingMode.Size,
.MaximumFileSize = "500kb",
.MaxSizeRollBackups = 1,
.Layout = fileAppenderLayout}
fileAppender.ActivateOptions()

' 設定の説明
' StaticLogFileName : ログファイル名を固定する場合true/変動する場合false
' AppendToFile : 追記する場合true/上書きする場合false,
' MaxSizeRollBackups : バックアップログ数(アクティブなログは含まない)

' ファイル出力の設定 <---


' UDP出力の設定 --->
' ログの書式
Dim udpAppenderLayout As New PatternLayout With {
.ConversionPattern = """%date"",""%username"",""%thread"",""%level"",""%message""%newline"}
udpAppenderLayout.ActivateOptions()

' ログ出力レベルの設定(ログのレベルは Debug < Info < Warn < Error < Fatal という順番)
Dim udpAppenderFilter As New Filter.LevelRangeFilter With {
.LevelMin = Core.Level.Warn,
.LevelMax = Core.Level.Fatal}
udpAppenderFilter.ActivateOptions()

Dim udpAppender As New UdpAppender With {
.Name = "UdpAppender",
.RemoteAddress = System.Net.IPAddress.Parse(UDP_SEND_IP_ADDRESS),
.RemotePort = 8080,
.Encoding = New System.Text.UTF8Encoding,
.Layout = udpAppenderLayout}
udpAppender.AddFilter(udpAppenderFilter)
udpAppender.ActivateOptions()
' UDP出力の設定 <---

'' 出力レベルの設定
'logger.Level = Core.Level.All

'' どのログ出力先を使用するか
'logger.AddAppender(fileAppender)
'logger.AddAppender(udpAppender)

'Config.BasicConfigurator.Configure(h, fileAppender)
'Config.BasicConfigurator.Configure(h, udpAppender)

If Debugger.IsAttached Then
Config.BasicConfigurator.Configure({fileAppender})
Else
Config.BasicConfigurator.Configure({fileAppender, udpAppender})
End If
Next

End Sub


''' ---------------------------------------------------------------------
'''
''' パラメータを使用して、log4net.LogManager.GetLoogerメソッドの呼び出しを行うコンストラクタ
'''

''' 呼び出し元クラスのインスタンス
'''
''' 1.デフォルトコンストラクタの呼び出しを行う
''' 2.パラメータを引数にlog4net.LogManager.GetLoggerメソッドの呼び出しを行う
'''

''' ---------------------------------------------------------------------
Private Sub New(ByVal obj As Object)
If IsNothing(obj) Then
Caller = Nothing
_logger = LogManager.GetLogger("")
Else
Caller = obj.GetType
_logger = LogManager.GetLogger(obj.GetType)
End If
End Sub


''' ---------------------------------------------------------------------
'''
''' 呼び出し元クラスの名前を直接指定して、log4net.LogManager.GetLogerメソッドの呼び出しを行うコンストラクタ。
''' 通常は使用しません。呼び出し元クラスのインスタンスを指定できない場合に使用します。
'''

''' 呼び出し元クラスの名前
'''
''' 1.デフォルトコンストラクタの呼び出しを行う
''' 2.パラメータを引数にlog4net.LogManager.GetLoggerメソッドの呼び出しを行う
'''

''' ---------------------------------------------------------------------
Private Sub New(ByVal argCallerName As String)
Caller = Nothing
CallerName = argCallerName
_logger = LogManager.GetLogger(CallerName)
End Sub


''' ---------------------------------------------------------------------
'''
''' Loggerクラスのインスタンス化を行い、生成したインスタンスを返します。
'''

''' 呼び出し元クラスのインスタンス
''' Loggerのインスタンス
'''
''' 1.パラメータを引数にLoggerのコンストラクタを呼び出す
''' 2.Loggerのインスタンスを呼び出し元に返す
'''

''' ---------------------------------------------------------------------
Public Shared Function GetLogger(ByVal obj As Object) As Logger
_log = New Logger(obj)
Return _log
End Function


''' ---------------------------------------------------------------------
'''
''' Loggerクラスのインスタンス化を行い、生成したインスタンスを返します。
'''

''' インスタンス名
''' Loggerのインスタンス
'''
''' 1.パラメータを引数にLoggerのコンストラクタを呼び出す
''' 2.Loggerのインスタンスを呼び出し元に返す
'''

''' ---------------------------------------------------------------------
Public Shared Function GetLogger(ByVal str As String) As Logger
_log = New Logger(str)
Return _log
End Function


''' ---------------------------------------------------------------------
'''
''' メソッド開始のログを出力します。
'''

'''
''' 1.呼び出し元のメソッド名を取得する
''' 2.log4netのログレベルlnfoにて、下記のログを出力する
''' 「メソッド開始:呼び出し元メソッド名」
'''

''' ---------------------------------------------------------------------
Public Sub MethodStart()
Info("MethodStart : " + GetMethodName())
End Sub


''' ---------------------------------------------------------------------
'''
''' メソッド終了のログを出力する
'''

'''
''' 1.呼び出し元のメソッド名を取得する
''' 2.log4netのログレベルlnfoにて、下記のログを出力する
''' 「メソッド終了:呼び出し元メソッド名」
'''

''' ---------------------------------------------------------------------
Public Sub MethodEnd()
Info("MethodEnd : " + GetMethodName())
End Sub


''' ---------------------------------------------------------------------
'''
''' ログレベルDebugのログを出力する
'''

'''
''' ログ出力対象のオブジェクト
''' 1.log4netのログレベルDebugにて、パラメータのデータを出力する
'''

''' ---------------------------------------------------------------------
Public Sub Debug(ByVal obj As Object)
Dim logMessage As String = CallerName + " - " + Convert.ToString(obj)

If GlobalVariable.Instance.IsEncrypt Then logMessage = EncryptString(logMessage)

_logger.Debug(logMessage)
End Sub


''' ---------------------------------------------------------------------
'''
''' ログレベルInfoのログを出力する
'''

'''
''' ログ出力対象のオブジェクト
''' 1.log4netのログレベルInfoにて、パラメータのデータを出力する
'''

''' ---------------------------------------------------------------------
Public Sub Info(ByVal obj As Object)
Dim logMessage As String = CallerName + " - " + Convert.ToString(obj)

If GlobalVariable.Instance.IsEncrypt Then logMessage = EncryptString(logMessage)

_logger.Info(logMessage)
End Sub


''' ---------------------------------------------------------------------
'''
''' 文頭にクラス名を付加せず、ログレベルInfoのログを出力する。
'''

'''
''' ログ出力対象のオブジェクト
''' 1.log4netのログレベルInfoにて、パラメータのデータを出力する
'''

''' ---------------------------------------------------------------------
Public Sub NativeInfo(ByVal obj As Object)
Dim logMessage As String = Convert.ToString(obj)

If GlobalVariable.Instance.IsEncrypt Then logMessage = EncryptString(logMessage)

_logger.Info(logMessage)
End Sub


''' ---------------------------------------------------------------------
'''
''' ログレベルErrorのログを出力する
'''

'''
''' ログ出力対象のオブジェクト
''' 1.log4netのログレベルErrorにて、パラメータのデータを出力する
'''

''' ---------------------------------------------------------------------
Public Sub [Error](ByVal obj As Object)
Dim logMessage As String = CallerName + " - " + Convert.ToString(obj)

If GlobalVariable.Instance.IsEncrypt Then logMessage = EncryptString(logMessage)

_logger.Error(logMessage)
End Sub


''' ---------------------------------------------------------------------
'''
''' ログレベルWarnのログを出力する
'''

'''
''' ログ出力対象のオブジェクト
''' 1.log4netのログレベルWarnにて、パラメータのデータを出力する
'''

''' ---------------------------------------------------------------------
Public Sub Warn(ByVal obj As Object)
Dim logMessage As String = CallerName + " - " + Convert.ToString(obj)

If GlobalVariable.Instance.IsEncrypt Then logMessage = EncryptString(logMessage)

_logger.Warn(logMessage)
End Sub


''' ---------------------------------------------------------------------
'''
''' ログレベルFatalのログを出力する
'''

'''
''' ログ出力対象のオブジェクト
''' 1.log4netのログレベルFatalにて、パラメータのデータを出力する
'''

''' ---------------------------------------------------------------------
Public Sub Fatal(ByVal obj As Object)
Dim logMessage As String = CallerName + " - " + Convert.ToString(obj)

If GlobalVariable.Instance.IsEncrypt Then logMessage = EncryptString(logMessage)

_logger.Fatal(logMessage)
End Sub


''' ---------------------------------------------------------------------
'''
''' スタックトレースより呼び出し元のメソッド名を取得し、メソッド名を返す
'''

''' メソッド名
'''
''' スタックトレースクラスから呼び出し元(1つ前のクラス)を取得し、メソッド名を返す
'''

''' ---------------------------------------------------------------------
Private Function GetMethodName() As String
Dim st As New StackTrace(False)
'呼び出し元のフレームを取得する
'st.GetFrame(0)でフレームを取得し、sf.GetMethod.Nameを取得すると、このラッパークラスのこのメソッド名()
'st.GetFrame(1)でフレームを取得し、sf.GetMethod.Nameを取得すると、このラッパークラスのこのメソッドを読んでるメソッド名()
'st.GetFrame(2)でフレームを取得し、sf.GetMethod.Nameを取得すると、このラッパークラスのこのメソッドを読んでるメソッドを読んでるメソッド名()
'つまり、ラッパークラスのメソッドを呼んでいるメソッド名
Dim sf As StackFrame = st.GetFrame(2)

Return sf.GetMethod.Name
End Function


''' ---------------------------------------------------------------------
'''
''' 文字列を暗号化する
'''

''' 暗号化する文字列
''' 暗号化された文字列
''' ---------------------------------------------------------------------
Public Shared Function EncryptString(ByVal sourceString As String) As String

'RijndaelManagedオブジェクトを作成
Dim rijndael As New System.Security.Cryptography.RijndaelManaged()

'パスワードから共有キーと初期化ベクタを作成
Dim key() As Byte = System.Text.Encoding.ASCII.GetBytes("1234567890123456")
Dim iv() As Byte = System.Text.Encoding.ASCII.GetBytes("1234567890123456")
rijndael.Key = key
rijndael.IV = iv

'文字列をバイト型配列に変換する
Dim strBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(sourceString)

'対称暗号化オブジェクトの作成
Dim encryptor As System.Security.Cryptography.ICryptoTransform = _
rijndael.CreateEncryptor()
'バイト型配列を暗号化する
Dim encBytes As Byte() = encryptor.TransformFinalBlock(strBytes, 0, strBytes.Length)

'閉じる
encryptor.Dispose()

'バイト型配列を文字列に変換して返す
Return System.Convert.ToBase64String(encBytes)
End Function


''' ---------------------------------------------------------------------
'''
''' 暗号化された文字列を復号化する
'''

''' 暗号化された文字列
''' 復号化された文字列
''' ---------------------------------------------------------------------
Public Shared Function DecryptString(ByVal sourceString As String) As String
'RijndaelManagedオブジェクトを作成
Dim rijndael As New System.Security.Cryptography.RijndaelManaged()

'パスワードから共有キーと初期化ベクタを作成
Dim key() As Byte = System.Text.Encoding.ASCII.GetBytes("1234567890123456")
Dim iv() As Byte = System.Text.Encoding.ASCII.GetBytes("1234567890123456")
rijndael.Key = key
rijndael.IV = iv

'文字列をバイト型配列に戻す
Dim strBytes As Byte() = System.Convert.FromBase64String(sourceString)

'対称暗号化オブジェクトの作成
Dim decryptor As System.Security.Cryptography.ICryptoTransform = _
rijndael.CreateDecryptor()
'バイト型配列を復号化する
'復号化に失敗すると例外CryptographicExceptionが発生
Dim decBytes As Byte() = decryptor.TransformFinalBlock(strBytes, 0, strBytes.Length)
'閉じる
decryptor.Dispose()

'バイト型配列を文字列に戻して返す
Return System.Text.Encoding.UTF8.GetString(decBytes)
End Function

End Class