Несколько проблем с вашим кодом:
- MemoryStream не нужно объявлять на уровне класса, если вы используете его только в одном методе.
- Вам всегда нужно утилизировать поток после того, как вы закончите с ним (либо вызвав метод
Dispose()
, либо предпочтительно , заключив его в Using
блок). - Весь смысл использования параметризованных запросов заключается в предотвращении SQL-инъекции .Поэтому вам нужно использовать параметры для всех ваших значений, а не только для изображения.
Попробуйте это:
Dim img() As Byte
Using ms As New MemoryStream()
playerImage.Image.Save(ms, playerImage.Image.RawFormat)
img = ms.ToArray()
End Using
Dim strCmd As String =
"INSERT INTO playerData VALUES (@PlayerNumber, @PlayerId, @PlayerName, @Img)"
cmd.Parameters.AddWithValue("@PlayerNumber", playerNumberTB.Text)
cmd.Parameters.AddWithValue("@PlayerId", playerIdTB.Text)
cmd.Parameters.AddWithValue("@PlayerName", playerNameTB.Text)
cmd.Parameters.AddWithValue("@Img", img)
Runcommand(strCmd, "player has been added")
Примечание.удалите строку Dim ms As New MemoryStream
из ваших объявлений, потому что она больше не требуется.
Обновление:
То же самое относится к вашим OleDbConnection и OleDbCommand, они вам не нужны в объявлениитакже.Но если вы это сделаете, убедитесь, что, по крайней мере, вы не используете команду повторно.Удалите его и повторно инициализируйте или очистите его параметры .
Я бы порекомендовал что-то подобное для вашего RunCommand
метода:
Private ConnString As String =
"provider=microsoft.ace.oledb.12.0; Data Source=SoccerTimeDB.accdb"
Sub Runcommand(cmdText As String, Optional message As String = "")
Using conn As New OleDbConnection(ConnString)
Using cmd As New OleDbCommand(cmdText, conn)
Try
conn.Open()
cmd.ExecuteNonQuery()
If Not String.IsNullOrEmpty(message) Then MsgBox(message)
Catch ex As Exception ' Try to catch specific exceptions instead.
MsgBox(ex.Message)
End Try ' You don't need the `Finally` block anymore.
End Using
End Using
End Sub