diablo22 Ответов: 2

ВБ вам инфо/ магазин информация


Привет, у меня тут небольшая проблема.

Во-первых, когда моя форма загружается, она получает информацию из базы данных (ms accsses)
Но если я внесу некоторые изменения в текстовые поля и нажму кнопку Сохранить, он не прочитает picturebox, что на нем есть изображение.

Потому что когда форма загружается, она загружает изображение в Picturebox , тогда я просто хотел отредактировать какой-то текст и нажать кнопку Сохранить, а он мне этого не позволит, потому что picturebox для него пуст.

Давайте начнем с прочитанной информации:
Try
            With cmd
                Dim stream As New IO.MemoryStream()
                conn.Open()
                .Connection = conn
                .CommandText = "select cPicture from Table where ID=@uID"
                .Parameters.Add("@uID", OleDbType.Integer, 50).Value = TextBox6.Text
                Dim image As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
                stream.Write(image, 0, image.Length)
                Dim bitmap As New Bitmap(stream)
                PictureBox1.Image = bitmap '--->I have used another picturebox to display image from database.
                stream.Close()
                .Parameters.Clear()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            If conn IsNot Nothing Then
                conn.Close()
            End If
        End Try


Здесь мне покажут картинку внутри picturebox (результат в порядке)
Теперь о спасении :
Try
            With cmd
                Dim ms As New IO.MemoryStream()
                PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
                Dim arrimage() As Byte = ms.GetBuffer

                If Not PictureBox1.Image Is Nothing Then
                    MsgBox("missing")
                Else
                    MsgBox("has")
                End If
                conn.Open()
                .Connection = conn
                .CommandText = "UPDATE Table SET cName = @uName,cNumber = @uNumber,cSupplier = @uSupp,cStore = @uStore,cCount = @uCount,cPicture = @picture WHERE ID = 1"
                '.Parameters.Add("@uID", OleDbType.Integer).Value = TextBox6.Text
                .Parameters.Add("@uName", OleDbType.VarChar, 50).Value = TextBox1.Text
                .Parameters.Add("@uNumber", OleDbType.BigInt, 50).Value = TextBox2.Text
                .Parameters.Add("@uSupp", OleDbType.VarChar, 50).Value = TextBox3.Text
                .Parameters.Add("@uStore", OleDbType.VarChar, 50).Value = TextBox4.Text
                .Parameters.Add("@uCount", OleDbType.Integer, 50).Value = TextBox5.Text
                .Parameters.Add("@Picture", OleDbType.Binary).Value = arrimage
                .ExecuteNonQuery()
                .Parameters.Clear()
                ms.Close()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            If conn IsNot Nothing Then
                conn.Close()
            End If
        End Try


И вот он дает мне сообщение:
MsgBox("missing")


И запрос требовал 6 вещей, чтобы внести изменения.
Как ее решить?

Что я уже пробовал:

не знаю точно, откуда берется проблема

0x01AA

Должно ли это быть так
If Not PictureBox1.Image Is Nothing Then
не будь таким
If PictureBox1.Image Is Nothing Then ?

diablo22

да, моя ошибка в копии здесь, но это только для теста, я добавляю это, чтобы увидеть ... что он не распознает, чтобы иметь картинку.
Проблема возникает при выполнении запроса, он не запускает его, потому что ожидает 6 аргументов

0x01AA

"это не работает" означает что? Есть ли сообщение об ошибке/исключении?

Richard MacCutchan

Вы добавили uID как первый параметр в вашем наборе, но этого нет в вашем наборе. INSERT команда. Если столбец id объявлен автоматически сгенерированным, то вам не следует пытаться добавить его вручную. Если он не генерируется автоматически, то вам нужно включить его в INSERT заявление.

0x01AA

жидкость закомментирован. И эта команда называется UPDATE

Richard MacCutchan

Спасибо, что я пропустил этот (смехотворно бесполезный) комментарий Марка.

Переформатировал вопрос (добавил тип языка в тег <pre>), Чтобы четко показать закомментированную часть.

0x01AA

:недурно:
Кстати: вы получаете уведомления в Q/A, например, когда я пишу это?
Я все еще не получаю уведомлений в Q/A, даже с задержкой.

Richard MacCutchan

Я получаю письмо с этим сообщением. И он появляется в списке комментариев выше (выпадающий список в маленьком красном квадрате).

0x01AA

Спасибо за ваш ответ. Похоже, мне нужно активировать уведомления по электронной почте, чтобы получить маленькую красную коробочку здесь, в Q/A. Я немного боюсь менять свои настройки, потому что в моем профиле всегда заранее выбран переключатель "забыть меня навсегда" :-)

Richard MacCutchan

Вау, это кажется неправильным. Вы сообщили об этом Крису?

0x01AA

До сих пор об этом не сообщалось. Но я изменил свой профиль, чтобы получить электронную почту для Q/A. Я все еще здесь, но все еще не получаю уведомлений :(
Ничего особенного, я могу с этим жить.
Еще раз большое вам спасибо за ваши отзывы.

diablo22

это правильно, и когда я пытаюсь обновить его, он терпит неудачу и говорит, что ему нужно 6 аргументов, и я думаю, что в picturebox не удается получить данные

0x01AA

Я не знаю. VB.NET, но может ли быть так, что параметры в VB.NET чувствительны ли они к регистру? Если да то это может быть проблемой:
.Parameters.Add("@Picture", OleDbType.Binary).Value = arrimage
против.
"UPDATE Table SET .... cPicture = @picture WHERE ID = 1"

Кстати: когда вы отвечаете на конкретный комментарий, пожалуйста, ответьте с помощью кнопки ответа комментария. Таким образом, ОП комментария будет проинформирован ;)

diablo22

я думаю, что нашел проблему, когда использую :
.Параметры.AddWithValue("@uName", TextBox1.Text)
.Параметры.AddWithValue("@uNumber", TextBox2.Text)
.Параметры.AddWithValue("@uSupp", TextBox3.Text)
.Параметры.AddWithValue ("@uStore", TextBox4.Text)
.Параметры.AddWithValue("@uCount", TextBox5.Text)
Работы исправляют все...Поэтому мне нужно проверить параметры

0x01AA

Вы проверили чувствительные к регистру вещи? Просто не устанавливая параметр, можно также неявно установить значение в null

2 Ответов

Рейтинг:
19

diablo22

.Parameters.Add("@uName", OleDbType.VarChar, 50).Value = TextBox1.Text
                .Parameters.Add("@uNumber", OleDbType.Integer, 50).Value = TextBox2.Text
                .Parameters.Add("@uSupp", OleDbType.VarChar, 50).Value = TextBox3.Text
                .Parameters.Add("@uStore", OleDbType.VarChar, 50).Value = TextBox4.Text
                .Parameters.Add("@uCount", OleDbType.Integer, 50).Value = TextBox5.Text
                .Parameters.Add("@Picture", OleDbType.Binary).Value = arrimage
                .Parameters.AddWithValue("@uID", TextBox6.Text)
.CommandText = "UPDATE Connectors SET cName = @uName,cNumber= @uNumber,cSupplier = @uSupp,cStore = @uStore,cCount = @uCount,cPicture = @Picture WHERE ID = @uID"
                .ExecuteNonQuery()


Я получил его параметры-это проблемы, но и порядок должен быть таким, чтобы работать правильно.


0x01AA

Сбивая с толку, я не понимаю, почему это должно сработать сейчас...

diablo22

я немного читал об этом, а также о порядке номеров в этом вызове, также вызовы должны быть перед командой , чтобы получить имена, также я исправил параметры, которые тоже создают проблемы в базе данных, теперь они равны и правильны тоже

Рейтинг:
1

CHill60

diablo22 написал в комментарии:
я немного читал об этом, а также о порядке номеров в этом вызове, также вызовы должны быть перед командой , чтобы получить имена, также я исправил параметры, которые тоже создают проблемы в базе данных, теперь они равны и правильны тоже
Порядок параметров вообще не имеет значения, когда они называются.

Однако вам представляется использование параметров объекта oledbcommand.
В документации говорится::
Поставщик OLE DB .NET не поддерживает именованные параметры для передачи параметров в инструкцию SQL или хранимую процедуру, вызываемую OleDbCommand, когда CommandType имеет значение Text. В этом случае необходимо использовать заполнитель вопросительного знака (?).
Видеть Объект oledbcommand.Свойство Параметров (System.Data.OleDb) | Microsoft Docs[^]
Таким образом, текст вашей команды должен быть
CommandText = "UPDATE Table SET cName = ?,cNumber = ?,cSupplier = ?,cStore = ?,cCount = ?,cPicture = ? WHERE ID = 1"


diablo22

я тоже читал об этом ? и @ и оба метода работают довольно хорошо для этого, и для меня @ гораздо лучше сделать код