VB.NET で MariaDB の blob にデータをインサート、セレクトする。1

会社で指紋照合システムを使用していますが、

現在は保存された指紋ファイルを照合に使っています。

 

セキュリティを考量し、ファイルのバイト配列をMariaDBにインサートし、

指紋チェック時に、DBに接続してバイナリで読みだして照合することにしました。

 

が、インサートしたデータを、VBで取得すると、

なぜかバイト配列の中身が、ASCIIコードになってしまっているのです。

 

もともとは 0,7 ~ → 48,55 ~

????? 何をやってもアスキーコードしか返ってきません。

どうしてでしょうか。

仕方がないので、数値に変換することにしました。

 

DBにインサートするサンプル ポイントを赤字で表示しています。

 

 '''ファイルをバイナリで読み込む

Private Function RaeadBinary(ByVal filePath As String) As Byte()
  Dim fs As New FileStream(filePath, FileMode.Open, FileAccess.Read)

  Dim fileSize As Integer = CInt(fs.Length) ' ファイルのサイズ
  Dim buf(fileSize - 1) As Byte ' データ格納用配列

  Dim readSize As Integer ' Readメソッドで読み込んだバイト数
  Dim remain As Integer = fileSize ' 読み込むべき残りのバイト数
  Dim bufPos As Integer = 0 ' データ格納用配列内の追加位置

  While remain > 0
    ' 1024Bytesずつ読み込む
    readSize = fs.Read(buf, bufPos, Math.Min(1024, remain))

    bufPos += readSize
    remain -= readSize
  End While
  Return buf
End Function

’’’読み取ったバイナリデータを16進表現に変換する
Private Function Get16Dump(ByVal val() As Byte) As String
  Dim s As String
  s = BitConverter.ToString(val)
  Return s
End Function

Public Function GetInsertValBinary16(ByVal filePath As String) As String
    Dim val() As Byte = Me.RaeadBinary(filePath)
    Dim StrVal16 As String = Get16Dump(val)

    Return StrVal16
End Function

 

'' '指紋データをDBにインサートする

Public Function InsertSimon(ByVal simonStr As String) As Boolean
  Try
      Dim sql As New System.Text.StringBuilder()
      sql.AppendLine("INSERT INTO ~ (")

  ・・・・・・・・・・・・・・・・・
       sql.AppendLine(")VALUES(")
       sql.AppendLine("@simdat,")
       sql.AppendLine("@created_at,")
       sql.AppendLine("@updated_at")
       sql.AppendLine(");")

      Dim myParams As New List(Of MySqlParameter)
      Dim myParam_simdat As New MySqlParameter("@simdat", MySqlDbType.Blob)
      Dim myParam_createdat As New MySqlParameter("@created_at", MySqlDbType.DateTime)
      Dim myParam_updatedat As New MySqlParameter("@updated_at", MySqlDbType.DateTime)

      myParam_simdat.Value = simonStr
      myParam_createdat.Value = DateTime.Now()
      myParam_updatedat.Value = DBNull.Value

      myParams.Add(myParam_simdat)
      myParams.Add(myParam_createdat)
      myParams.Add(myParam_updatedat)


      Dim result As Boolean = ExecuteSQLNonQuery(sql.ToString(), myParams)
      If result Then
           Return True
      Else
            Return False
      End If
      Return True
   Catch ex As Exception
      MessageBox.Show(ex.Message)
   Return False
End Try

End Function

 

'''SQLを実行するメソッド

Public Function ExecuteSQL(ByVal sql As String, Optional ByVal params As List(Of MySqlParameter) = Nothing) As DataTable
 Try
  Connect()
  Dim Table As New DataTable("Table")
  Dim cmd As New MySqlCommand(sql, _Connection)
  If Not params Is Nothing Then
    For Each p As MySqlParameter In params
     cmd.Parameters.Add(p)
    Next
  End If

  Dim DataAdapter As New MySqlDataAdapter(cmd)
  DataAdapter.Fill(Table)
  Return Table
 Catch ex As Exception
  MessageBox.Show(ex.Message)
  Return Nothing
 Finally
  Close()
 End Try
End Function

 

'''DBに接続するメソッド

Private Function Connect()
 Try
  Dim ConnectionString As String = ~
  _Connection = New MySqlConnection()
  _Connection.ConnectionString = ConnectionString
  _Connection.Open()
  Return True
 Catch ex As Exception
  MessageBox.Show(ex.Message)
  Return False
 End Try

End Function

'''DB接続を閉じる

Private Sub Close()
 Try
  _Connection.Close()
 Catch ex As Exception

  MessageBox.Show(ex.Message)

 End Try

 End Sub

'''登録ボタン

Private Sub RegistButton_Click(sender As Object, e As EventArgs) Handles RegistButton.Click

 Dim byteStr16 As String = rep.GetInsertValBinary16(_filePath)

 Dim result As Boolean = rep.Insert(byteStr16, SimonTable.Rows(i))

 


  If result = False Then
    MessageBox.Show("登録に失敗しました。", "ERROR",   MessageBoxButtons.OK, MessageBoxIcon.Error)
  End If


  MessageBox.Show("登録が完了しました。", "OK", MessageBoxButtons.OK,   MessageBoxIcon.Asterisk)

End Sub

 

取得して照合はまた次回にします。