Imports MySql.Data.MySqlClient
Module MySqlMoudule

    Private Const LocalHostIP As String = "192.168.0.250"
    Private Const DataBaseName As String = "jomtOrderTestDB"
    Private Const UserName As String = "root"
    Private Const UserPasswrod As String = "JOMT1646db!!"

    Private Conn As String = "Server=" + LocalHostIP + ";DataBase=" + DataBaseName + ";user=" + UserName + ";password=" + UserPasswrod + ";"

    Private sqlCon As New MySqlConnection(Conn)
    Private sqlCmd As New MySqlCommand()
    Private sqlData As MySqlDataReader           '' SQL Server와 연결을 유지한 상태에서 한번에 한 레코드(One Row)씩 데이타를 가져오는데 사용된다

    Public sqlDataQuery() As Object

    Private Function DBOpen() As Boolean
        Try
            If sqlCon.State <> ConnectionState.Open Then       '' sqlCon.State 의 상태를 나타냄
                sqlCon.Open()
            End If
            Return True
        Catch ex As Exception
            MsgBox("MySQL Command Error:" + vbCrLf + Err.Description)
            Return False
        End Try
    End Function

    Private Function DBClose() As Boolean
        Try
            If sqlCon.State = ConnectionState.Open Then
                sqlCon.Close()
            End If
            Return True

        Catch ex As Exception
            MsgBox("MySQL Command Error:" + vbCrLf + Err.Description)
            Return False
        End Try
    End Function

    Private Function Database_Use() As Boolean
        Try
            DBOpen()

            sqlCmd.CommandText = "USE " & DataBaseName & ";"
            sqlCmd.Connection = sqlCon
            sqlCmd.ExecuteNonQuery()

            Return True
        Catch ex As Exception
            MsgBox("MySQL Command Error:" + vbCrLf + Err.Description)
            Return False
        End Try
    End Function

    Public Function DBCommand(cmdStr As String) As Boolean
        Try
            Database_Use() '' 연결에 대한 sql문 실행, 명령을 수행하고 영향을 받은 행의 수를 반환하는 메서드, 행 추가나 변경, 삭제 등의 명령을 수행할 때는 명령으로 영향받은 행의 수만 알면 되기 때문에 ExecuteNonQuery 메서드를 사용합니다. 리턴값은 INT32 형
            sqlCmd.CommandText = cmdStr
            sqlCmd.Connection = sqlCon
            sqlCmd.ExecuteNonQuery()
            DBClose()
            Return True

        Catch ex As Exception
            MsgBox("MySQL Command Error:" + vbCrLf + Err.Description)
            DBClose()
            Return False
        End Try
    End Function

    Public Function DBQueryScalar(cmdStr As String) As String
        Try
            Database_Use()
            sqlCmd.CommandText = cmdStr
            sqlCmd.Connection = sqlCon
            Dim objResult As Object = sqlCmd.ExecuteScalar()    'SQL 명령을 실행하고, Query 가 리턴하는 첫번째 행의 첫번째 열을 리턴한다. 결과가 딱 1개인 집계함수(count, sum, avg 등)에 사용한다. 반환값은 object 형

            If objResult Is Nothing OrElse IsDBNull(objResult) Then
                Return "False"
            End If
            Return objResult.ToString()

        Catch ex As Exception
            MsgBox("MySQL Command Error:" + vbCrLf + Err.Description)
            Return "False"
        End Try
    End Function

    Public Function DBQueryReader(cmdStr As String) As Integer
        Dim FieldCount As Integer
        Dim initRun As Boolean = True
        Dim DataTypeName As String
        Dim TmpData As Object
        Dim QueryCount As ULong

        Try
            Database_Use()

            sqlCmd.CommandText = cmdStr
            sqlCmd.Connection = sqlCon
            sqlData = sqlCmd.ExecuteReader       '' 어떤 쿼리에서도 적용이 가능하다. SELECT 쿼리를 이용할 경우 해당하는 값들이 DataReader 타입으로 온다. 값을 가져온 후에는 SqlDataReader객체의 read메서드를 통해 값을 읽어올 수 있고 , 사용 후에는 close메서드를 이용하여 실행을 끝내주어야 한다.

            FieldCount = sqlData.FieldCount      '' 현재 행의 열 수를 가져옵니다.

            While (sqlData.Read())
                If initRun Then
                    ReDim sqlDataQuery(FieldCount - 1)     '' 배열을 모든 필드를 담을 수 있는 양으로 맞추는 기능
                    initRun = False

                Else
                    ReDim Preserve sqlDataQuery(UBound(sqlDataQuery) + FieldCount)     '' 배열에 저장된 값을 보존하면서 배열의 길이만 재선언
                End If

                For cnt = 0 To FieldCount - 1
                    DataTypeName = sqlData.GetDataTypeName(cnt)               '' 지정된 열의 데이터 형식을 나타내는 문자열을 가져옵니다.

                    If DataTypeName = "DATE" Then
                        TmpData = sqlData.GetDateTime(cnt)
                    Else
                        TmpData = sqlData.GetValue(cnt)
                    End If

                    If DBNull.Value.Equals(TmpData) Or TmpData.Equals(String.Empty) Then
                        sqlDataQuery(QueryCount) = "0"
                    Else
                        sqlDataQuery(QueryCount) = TmpData
                    End If

                    QueryCount += 1
                Next
            End While

            DBClose()
            Return QueryCount

        Catch ex As Exception
            MsgBox(Err.Description)
            If sqlCon.State = ConnectionState.Open Then sqlCon.Close()
            Return 0
        End Try

    End Function

    Public Function getNowDate() As String
        Dim dateTime As String

        dateTime = Format(DateAndTime.Year(Now), "0000") & "-" & Format(DateAndTime.Month(Now), "00") & "-" & Format(DateAndTime.Day(Now), "00")

        Return dateTime

    End Function

End Module
