UCP_2005 Ответов: 0

Vb.net сохранение образа базы данных SQL server


Всем привет,

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

Код приведен ниже и не дает никаких ошибок.

Любой совет будет рассматриваться как большое подспорье.

Спасибо.

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

<pre> Dim strSQL As String
        Dim lngID As Double

            lngID = SQLGetNumericFieldValue("SELECT IsNull(Max(RequestID), 0)+1 AS MaxVal From TravelApplicationRequest", "MaxVal")
        

            txtRequestNo.Text = lngID
            
            strSQL = "INSERT INTO TravelApplicationRequest (RequestID, ApplicationNo, CustomerCode, CustomerName, StoreName, Package, VisaType, " & _
                        "VisaNo, VisaIssuedate, VisaExpiryDate, PassportNo, PassportIssueDate, PassportExpiryDate, NIDNo, " & _
                        "HotelName, HotelCity, HotelCountry, HotelAddress, HotelChkInDate, Days, " & _
                        "Rooms, Meals, ChckOutdate, Notes, DepAirline, DepFlightNo, DepFromCity, DepToCity, DepFlightDate, DepTktNo, " & _
                        "ArrAirline, ArrFlightNo, ArrFromCity, ArrToCity, ArrFlightDate, ArrTktNo, isTravelWithDependents, IsApproved, SelectApprover, IsProcessed) VALUES ("


            strSQL = strSQL & "'" & txtRequestNo.Text & "', "

            strSQL = strSQL & "'" & txtApplicationNo.Text & "', "

            strSQL = strSQL & "'" & txtCustomerCode.Text & "', "
            strSQL = strSQL & "'" & txtCustomerName.Text & "', "
            strSQL = strSQL & "'" & txtBranch.Text & "', "
            strSQL = strSQL & "'" & txtPackage.Text & "', "
            strSQL = strSQL & "'" & txtVisaType.Text & "', "
            strSQL = strSQL & "'" & txtVisaNo.Text & "', "
            strSQL = strSQL & "'" & txtVisaIssueDate.Text & "', "
            strSQL = strSQL & "'" & txtVisaExpiry.Text & "', "
            strSQL = strSQL & "'" & txtPassportNo.Text & "', "
            strSQL = strSQL & "'" & txtPassportIssueDate.Text & "', "

            strSQL = strSQL & "'" & txtPassportExpiry.Text & "', "
            strSQL = strSQL & "'" & txtIDNo.Text & "', "
            strSQL = strSQL & "'" & txtHotelName.Text & "', "
            strSQL = strSQL & "'" & txtCity.Text & "', "
            strSQL = strSQL & "'" & txtCountry.Text & "', "

            strSQL = strSQL & "'" & txtAddress.Text & "', "
            strSQL = strSQL & "'" & txtChkInDate.Text & "', "
            strSQL = strSQL & "'" & txtStay.Text & "', "
            strSQL = strSQL & "'" & txtRooms.Text & "', "
            strSQL = strSQL & "'" & txtMeals.Text & "', "
            strSQL = strSQL & "'" & txtChkOut.Text & "', "
            strSQL = strSQL & "'" & txtDetails.Text & "', "
            strSQL = strSQL & "'" & txtDepAirLine.Text & "', "

            strSQL = strSQL & "'" & txtDepFlightNo.Text & "', "
            strSQL = strSQL & "'" & txtDepFrCity.Text & "', "
            strSQL = strSQL & "'" & txtDepToCity.Text & "', "
            strSQL = strSQL & "'" & txtDepFlightDate.Text & "', "
            strSQL = strSQL & "'" & txtDepTktNo.Text & "', "
            strSQL = strSQL & "'" & txtArrAirline.Text & "', "
            strSQL = strSQL & "'" & txtArrFlightNo.Text & "', "
            strSQL = strSQL & "'" & txtArrFCity.Text & "', "
            strSQL = strSQL & "'" & txtArrToCity.Text & "', "


            strSQL = strSQL & "'" & txtArrFlightDate.Text & "', "
            strSQL = strSQL & "'" & txtArrTktNo.Text & "', "
            strSQL = strSQL & "'" & txtDependents.Text & "', "
            strSQL = strSQL & "'" & txtIsApproved.Text & "', "
            strSQL = strSQL & "'" & txtApprovedBy.Text & "',"
            strSQL = strSQL & "'" & txtIsProcessed.Text & "')"

            
            ExecuteSQLQuery(strSQL)
          

        If TxtImageCust.BackgroundImage IsNot Nothing Then

          
            strSQL = "UPDATE TravelApplicationRequest SET Image = @Image WHERE RequestID = " & lngID

            '
            Dim SqlConn As New SqlClient.SqlConnection
            Dim Sqlcmmd As New SqlClient.SqlCommand
            Sqlcmmd.CommandTimeout = 1000
            Try
                SqlConn.ConnectionString = ConnectionStrinG
                SqlConn.Open()

                Dim cmd As New SqlCommand(strSQL, SqlConn)
                Dim ms As New MemoryStream()
                TxtImageCust.BackgroundImage.Save(ms, TxtImageCust.BackgroundImage.RawFormat)
                Dim data As Byte() = ms.GetBuffer()
                Dim p As New SqlParameter("@Image", SqlDbType.Image)
                p.Value = data
                cmd.Parameters.Add(p)
                cmd.ExecuteNonQuery()

            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                SqlConn.Close()
                SqlConn.Dispose()
            End Try

Richard Deeming

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

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

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

ZurdoDev

Отладьте его и выясните, что происходит. Мы не можем управлять им для вас.

David_Wimbley

Если ваш код не выдает никаких ошибок, то как вы узнаете, что он не работает?

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

Вам нужно сделать некоторую работу ног с вашей стороны, чтобы отладить ваш код, выяснить, где находится проблема, и попытаться решить ее. Если вы изменили свой код, я надеюсь, что вы используете контроль версий, чтобы вы могли увидеть, что именно изменилось, и вернуться к старой версии. Другой вариант-начать комментировать вещи или вытащить свой код в примерное консольное приложение proof of concept, чтобы медленно добавлять материал, чтобы увидеть, где может быть проблема.

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

UCP_2005

Спасибо за твою реоли Дэвид

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

Когда я проверяю таблицу в базе данных. Поле изображения имеет значение NULL. Раньше код работал нормально, и изображение также сохранялось в таблицу. Когда изображение сохраняется в таблице, то в столбце текст в столбце был "двоичные данные". Вы нашли что-нибудь неправильное в коде?

Я внесу поправки в свой пост, комментируя код.


David_Wimbley

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

Запустить его и обнаружить, что он пуст в БД, - это нормально, но делать одно и то же снова и снова и надеяться, что он начнет работать, это не исправит.

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

TxtImageCust.BackgroundImage.Save(ms, TxtImageCust.BackgroundImage.RawFormat)
                Dim data As Byte() = ms.GetBuffer()
                Dim p As New SqlParameter("@Image", SqlDbType.Image)
                p.Value = data



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

UCP_2005

Спасибо, Дэвид, я постараюсь.

0 Ответов