Babai JermenKeller Sasmal Ответов: 1

Почему GDI+ ошибка при не обновлении образа ?


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

Я проверял свой проект, но понял, что в профильном разделе факультета есть некоторые ошибки.

Ошибка: общая ошибка произошла в GDI++

Я начал проверять свой код, но там не было ничего подозрительного. Проблема возникает в том, что
Форма Profile_Update.

Если я пытаюсь обновить его с помощью некоторых деталей, таких как имя или другие детали, только тогда я получаю эту ошибку. Теперь, если я обновлю имя, другое и фотографию профиля, то я не получу ошибку и обновление базы данных.

Так что в реальном случае владелец профиля в основном не обновляет свою фотографию периодически. Но я ищу реального решения этой проблемы.

Моя строка обновления такова
="SELECT * from [USERDATA] name=@name,dob=@dob,sex=@sex,addr=@addr,phone=@phone,avatar=@avatar WHERE [ID]='" & 
 IDBOX.Text & "'"
update.Parameters.AddWithValues("@name", SqlDbType.VarChar).Value = NameHere.Text
update.Parameters.AddWithValues("@dob", SqlDbType.VarChar).Value = DobSelect.Value.Date
update.Parameters.AddWithValues("@sex", SqlDbType.Int).Value = GenBox.Text
update.Parameters.AddWithValues("@addr", SqlDbType.VarChar).Value = AddrBox.Text
update.Parameters.AddWithValues("@phone", SqlDbType.VarChar).Value = Mobile.Text
update.Parameters.AddWithValues("@name", SqlDbType.VarChar).Value = NameHere.Text
Dim ms As New System.IO.MemoryStream
AvatarBox.Image.Save(ms,AvatarBox.Image.RawFormat)
update.Parameters.AddWithValues("@avatar", SqlDbType.Image).Value = ms.ToArrey
If update.ExecuteNonQuery() =1 Then
MsgBox("Faculty Update")

Он работает, если я выбираю новую картинку в AvatarBox, иначе его бросает ошибка GDI++.
Это бросает ошибку, если я изменяю некоторые поля, такие как имя, dob и т. д.
Его беспокойство без ошибок, если я обновлю все.

Любое исправление для этого. Надеюсь, я заставлю вас понять.

Еще одна вещь заключается в том, что моя форма обновления факультета заполняется DataGridView с именем FacultyDGV CellClick event.
Если я нажму на некоторые поля в FacultyDGV, то форма 2 откроется автоматически с заполненными данными.

Я могу добавить новое изображение без единой ошибки, но обновление не работает.

Проект получился код..

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

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Try
            If TextBox2.Text = "" Then
                Label25.Text = "* Faculty Name cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf ComboBox1.Text = "< Select >" Then
                Label25.Text = "* Gender must be selected."
                Label25.ForeColor = Color.Red
            ElseIf TextBox3.Text = "" Then
                Label25.Text = "* Address cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox4.Text = "" Then
                Label25.Text = "* District cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox5.Text = "" Then
                Label25.Text = "* State cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox14.Text = "" Then
                Label25.Text = "* Pin cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox6.Text = "" Then
                Label25.Text = "* Country cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox8.Text = "" Then
                Label25.Text = "* Contact No cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox10.Text = "" Then
                Label25.Text = "* Username cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox11.Text = "" Then
                Label25.Text = "* Password cannot be left blank."
                Label25.ForeColor = Color.Red
            ElseIf TextBox11.Text <> TextBox12.Text Then
                Label25.Text = "* Please, Check the passwords you've entered."
                Label25.ForeColor = Color.Red
            ElseIf ComboBox2.Text = "< Select Question >" Then
                Label25.Text = "* Security Question must be selected."
                Label25.ForeColor = Color.Red
            Else
                OpenConnection()
                Label25.Text = "* Updating your profile..."
                Label25.ForeColor = Color.Black
                Dim cmd2 As New SqlCommand("UPDATE [userdata] SET name=@name,dob=@dob,sex=@sex,addr=@addr,city=@city,state=@state,pin=@pin,country=@country,nat=@nat,mobile=@mobile,email=@email,dept=@dept,sub=@sub,username=@username,password=@password,security=@security,answer=@answer,avatar=@avatar,modified=@modified WHERE id='" & TextBox1.Text & "'", connection)
                cmd2.Parameters.AddWithValue("@name", SqlDbType.VarChar).Value = TextBox2.Text
                cmd2.Parameters.AddWithValue("@dob", SqlDbType.VarChar).Value = DateTimePicker1.Value.Date
                Dim gender As String
                Dim value As Integer
                gender = ComboBox1.Text
                If gender = "Male" Then
                    value = 1
                ElseIf gender = "Female" Then
                    value = 2
                ElseIf gender = "Others" Then
                    value = 3
                End If
                cmd2.Parameters.AddWithValue("@sex", SqlDbType.Int).Value = value
                cmd2.Parameters.AddWithValue("@addr", SqlDbType.VarChar).Value = TextBox3.Text
                cmd2.Parameters.AddWithValue("@city", SqlDbType.VarChar).Value = TextBox4.Text
                cmd2.Parameters.AddWithValue("@state", SqlDbType.VarChar).Value = TextBox5.Text
                cmd2.Parameters.AddWithValue("@pin", SqlDbType.VarChar).Value = TextBox14.Text
                cmd2.Parameters.AddWithValue("@country", SqlDbType.VarChar).Value = TextBox6.Text
                cmd2.Parameters.AddWithValue("@nat", SqlDbType.VarChar).Value = TextBox7.Text
                cmd2.Parameters.AddWithValue("@mobile", SqlDbType.VarChar).Value = TextBox8.Text
                cmd2.Parameters.AddWithValue("@email", SqlDbType.VarChar).Value = TextBox9.Text
                cmd2.Parameters.AddWithValue("@dept", SqlDbType.VarChar).Value = ComboBox3.Text
                cmd2.Parameters.AddWithValue("@sub", SqlDbType.VarChar).Value = ComboBox4.Text
                cmd2.Parameters.AddWithValue("@username", SqlDbType.VarChar).Value = TextBox10.Text
                cmd2.Parameters.AddWithValue("@password", SqlDbType.VarChar).Value = TextBox11.Text
                Dim question As String
                Dim data As Integer
                question = ComboBox2.Text
                If question = "Whats your nickname ?" Then
                    data = 5
                ElseIf question = "Whats your pet name ?" Then
                    data = 4
                ElseIf question = "Whats your birth place ?" Then
                    data = 3
                ElseIf question = "Whats your middle name ?" Then
                    data = 2
                ElseIf question = "Whos your childhood hero ?" Then
                    data = 1
                End If
                cmd2.Parameters.AddWithValue("@security", SqlDbType.Int).Value = data
                cmd2.Parameters.AddWithValue("@answer", SqlDbType.VarChar).Value = TextBox13.Text
                cmd2.Parameters.AddWithValue("@modified", SqlDbType.VarChar).Value = Date.Today
                Dim ms As New MemoryStream
                PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat)
                cmd2.Parameters.AddWithValue("@avatar", SqlDbType.Image).Value = ms.ToArray
                If cmd2.ExecuteNonQuery() = 1 Then
                    MsgBox("Updated")
                End If
                connection.Close()
                faculty_dgv()
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

#realJSOP

Во-первых, вы не сказали, какую ошибку GDI вы получаете. Во-вторых, попробуйте поместить блок try/catch вокруг вашего кода, чтобы вы могли определить, где происходит ошибка. В-третьих, узнайте, как использовать функции форматирования на этом прицеле, чтобы нам было легче различать текст вопроса и код.

Babai JermenKeller Sasmal

Я думаю, что вы должны взглянуть на мой вопрос, там четко написано, что я получаю ошибку в 3-й строке (ошибка: общая ошибка произошла в GDI++), и я также считаю, что нет другого способа получить ошибку без блока try catch. Ну, я снова обновляю свой вопрос с исходным кодом.

Babai JermenKeller Sasmal

Вопрос обновляется с исходным кодом, пожалуйста, решите ошибку GDI, которую я получаю. Это проект колледжа, так что я не беспокоюсь о атаке SQL-инъекций.

Jochen Arndt

Возникает ли ошибка в строке AvatarBox.Image.Save(ms,AvatarBox.Image.RawFormat)?

Это означает, что он содержит недопустимое изображение (или, возможно, пустое изображение), что изображение не может быть сохранено в указанном формате, или у вас есть проблема с потоком.

Но мы не знаем, что такое Аватарбокс, как создается поток и использовался ли он раньше (что не допускается при сохранении изображения в поток), а также Что такое Аватарбокс.Изображение.RawFormat-это (по крайней мере, в стандартном формате изображения).

Наконец несколько советов:
При ответе на комментарий используйте кнопку "ответить". Затем плакат с первоначальным комментарием получает уведомление по электронной почте. Этого не произойдет при публикации комментария к самому вопросу, и Джон, вероятно, не будет периодически проверять ваш вопрос, чтобы увидеть, обновили ли вы его.

Используйте copy & paste для добавления кода к вашему вопросу, а не для ввода кода. Это гарантирует, что мы видим действительно используемый код, а не код, который даже не будет компилироваться, как:
ms.ToArrey

Babai JermenKeller Sasmal

AvatarBox-это мой PictureBox1. Было предложено предотвратить sql-атаку. Я попробую сделать то, что вы предлагаете.

Jochen Arndt

Как бы окно с картинками предотвратило атаки SQL?

А как насчет других возможных источников проблем, которые я упомянул в своем комментарии? Не видя соответствующего кода, невозможно помочь.

Даже тогда только вы можете, наконец, узнать это, потому что такие общие ошибки GDI могут возникать по многим причинам.

Babai JermenKeller Sasmal

И спасибо, что рассказали мне о комментировании. Я новичок в codeproject.

Richard Deeming

"SELECT * from [USERDATA] name=@name,dob=@dob,sex=@sex,addr=@addr,phone=@phone,avatar=@avatar WHERE [ID]='" & 
 IDBOX.Text & "'"


Этот код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Вы уже знаете, как использовать параметры - вы делаете это для каждого другого параметра в этом запросе. :)

1 Ответов

Рейтинг:
6

#realJSOP

Попробовать это:

using (MemoryStream ms = new MemoryStream())
{
    PictureBox1.Image.Save(ms, PictureBox1.Image.RawFormat);
    byte[] arrImage = ms.GetBuffer();
    ms.Close();
    cmd2.Parameters.AddWithValue("@avatar", SqlDbType.Image).Value = arrImage;
}