khalid4775 Ответов: 2

Ожидает параметр '@customerphoto', который не был поставлен


<pre>I have this error during update of the customer table:

Procedure or function 'Update_Customer' expects parameter '@CustomerPhoto', which was not supplied.

Stored procedure code :<pre>


ALTER procedure [dbo].[Update_Customer]
    @CustomerID int output,
    @CustomerName nvarchar (50),
    @CustomerPhoto image,
    @CustomerEmail nvarchar(Max),
    @CustomerPhone1 nvarchar(12),
    @CustomerPhone2 nvarchar(12),
    @CustomerAddress nvarchar(Max),
    @CustomerFax nvarchar(12),
    @CustomerStatus bit,
    @CountryID int,
    @CityID int,
    @Notes nvarchar (Max),
    @ModifiedBy nvarchar (30)
AS
BEGIN
    UPDATE CustomersTbl 
    SET CustomerID = @CustomerID,
        CustomerName = @CustomerName,
        CustomerPhoto = @CustomerPhoto,
        CustomerEmail = @CustomerEmail,
        CustomerPhone1 = @CustomerPhone1,
        CustomerPhone2 = @CustomerPhone2,
        CustomerAddress = @CustomerAddress,
        CustomerFax = @CustomerFax,
        CustomerStatus = @CustomerStatus,
        CountryID = @CountryID,
        CityID = @CityID,
        Notes = @Notes,
        ModifiedDate = GETDATE(),
        ModifiedBy = @ModifiedBy
    WHERE
        CustomerID = @CustomerID
END 


Код класса уровень данных :


Friend Function Update_Customer(ByVal CustomerID As String, ByVal CustomerName As String, ByVal CustomerEmail As String, ByVal CustomerPhone1 As String, ByVal CustomerPhone2 As String, ByVal CustomerAddress As String, ByVal CustomerFax As String, ByVal CustomerStatus As Boolean, ByVal CountryID As Integer, ByVal CityID As Integer, ByVal Notes As String, ByVal ModifiedBy As String) As String
    Dim retval As String

    Dim cmd As New SqlCommand("Update_Customer")

    cmd.Parameters.AddWithValue("@CustomerID", CustomerID)
    cmd.Parameters.AddWithValue("@CustomerName", CustomerName)
    cmd.Parameters.AddWithValue("@CustomerPhoto", SqlDbType.Image).Value = photo
    cmd.Parameters.AddWithValue("@CustomerEmail", CustomerEmail)
    cmd.Parameters.AddWithValue("@CustomerPhone1", CustomerPhone1)
    cmd.Parameters.AddWithValue("@CustomerPhone2", CustomerPhone2)
    cmd.Parameters.AddWithValue("@CustomerAddress", CustomerAddress)
    cmd.Parameters.AddWithValue("@CustomerFax", CustomerFax)
    cmd.Parameters.AddWithValue("@CustomerStatus", CustomerStatus)
    cmd.Parameters.AddWithValue("@CountryID", CountryID)
    cmd.Parameters.AddWithValue("@CityID", CityID)
    cmd.Parameters.AddWithValue("@Notes", Notes)
    cmd.Parameters.AddWithValue("@ModifiedBy", ModifiedBy)

    retval = dm.executeNonQuery(cmd)

    Return retval
End Function



Код класса бизнес-уровня :

Public Function Update_Customer_WithOutPic(ByVal CustomerID As String, ByVal CustomerName As String, ByVal CustomerEmail As String, ByVal CustomerPhone1 As String, ByVal CustomerPhone2 As String, ByVal CustomerAddress As String, ByVal CustomerFax As String, ByVal CustomerStatus As Boolean, ByVal CountryID As Integer, ByVal CityID As Integer, ByVal Notes As String, ByVal ModifiedBy As String) As String
    Dim retval As String
    retval = p.Update_Customer_WithOutPic(CustomerID, CustomerName, CustomerEmail, CustomerPhone1, CustomerPhone2, CustomerAddress, CustomerFax, CustomerStatus, CountryID, CityID, Notes, ModifiedBy)
    Return retval
End Function


Обновить код кнопки :

Dim retval As String = p.Update_Customer(txtCustomerCode.Text, txtCustomerName.Text, txtCustomerEmail.Text, txtCustomerPhone1.Text, txtCustomerPhone2.Text, txtCustomerAddress.Text, txtCustomerFax.Text, CheckBox2.Checked, ComboCustomerCountry.SelectedValue, ComboCustomerCity.SelectedValue, txtCustomernote.Text, FrmMain.LblUserID.Text)


Модуль :
Public Function GetPhoto(ByVal filePath As String) As Byte()
    Dim stream As FileStream = New FileStream(filePath, FileMode.Open, FileAccess.Read)
    Dim reader As BinaryReader = New BinaryReader(stream)
    Dim photo() As Byte = reader.ReadBytes(stream.Length)
    reader.Close()
    stream.Close()
    Return photo
End Function


Public Function byteArrayToImage(ByVal byt As Byte()) As Image
    Dim ms As New System.IO.MemoryStream()
    Dim drwimg As Image = Nothing
    Try
        ms.Write(byt, 0, byt.Length)
        drwimg = New Bitmap(ms)
    Finally
        ms.Close()
    End Try
    Return drwimg
End Function


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

Я уверен, что коробка с картинками не пуста

Bryian Tan

где код, который устанавливает значение фотографии?

УМК.Параметры.AddWithValue ("@CustomerPhoto", SqlDbType.Изображение).Значение = фотография

khalid4775

Публичная функция GetPhoto (ByVal filePath As String) As Byte()
Дим трансляция как FileStream = новый хранилище FileStream(путь к файлу, содержит filemode.Открытия, Флагами Fileaccess.Читать)
Dim reader As BinaryReader = новый BinaryReader(поток)
Тусклое фото() Как байт = читатель.ReadBytes(трансляция.Длина)
читатель.Закрывать()
течение.Закрывать()
Вернуть фото
Конечная Функция


ByteArrayToImage общественную функцию(как byval быт как Byte()) в качестве изображения
Дим мс, так как новая система.ИО.Потоке MemoryStream()
Dim drwimg как изображение = ничего
Попробуй
МС.Писать(быт 0, БЮТ.Длина)
drwimg = новое растровое изображение (МС)
Окончательно
МС.Рядом()
Конец Попытки
Возврат drwimg
Конечная Функция


Bryian Tan

Где вызывается функция GetPhoto?

khalid4775

в модуле

Richard Deeming

cmd.Parameters.AddWithValue("@CustomerPhoto", SqlDbType.Image).Value = photo;

Ты сбиваешь с толку AddWithValue и Add. Измените эту строку на:
cmd.Parameters.AddWithValue("@CustomerPhoto", photo);

2 Ответов

Рейтинг:
2

OriginalGriff

Используйте отладчик и проверьте, что находится внутри photo когда ты попадаешь в Update_Customer - потому что вы не передаете значение в качестве параметра метода.
Если он равен null - а я готов поспорить, что это так, - вы получите эту ошибку и лучше всего передадите ее в качестве параметра функции, а не полагаться на переменную уровня класса.


khalid4775

http://store6.up-00.com/2017-04/149183753091961.jpg

Но образ есть


http://store6.up-00.com/2017-04/149183753103342.jpg

OriginalGriff

Нет, это не так. Вот что говорит вам отладчик: "фото" - это " ничто"

Теперь вам предстоит выяснить, почему, и мы не можем сделать это за вас, потому что не можем запустить ваш код. Почти наверняка вы устанавливаете поле "фото" совершенно другого экземпляра класса.
Серьезно, это должен быть параметр вашей функции, а не переменная уровня класса.

Рейтинг:
2

Ramesh Kumar Barik

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

Когда этот тип проблемы произошел, то он уверен, что некоторые параметры, которые вы передаете из приложения в БД через SP, равны нулю.
Если вы считаете, что @CustomerPhoto не должен быть null, то выполните проверку null перед вызовом SP.

Если вы считаете, что некоторые параметры могут содержать значение или нет, то установите этот тип параметров как Null.
Пример: @CustomerPhoto image= null.


khalid4775

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


@ CustomerID int output,
@CustomerName nvarchar (50),
@CustomerPhoto image = null,
@CustomerEmail nvarchar(макс.),
@CustomerPhone1 nvarchar(12),
@CustomerPhone2 nvarchar(12),
@Атрибута типа customeraddress тип nvarchar(Макс),
@CustomerFax nvarchar(12),
Бит @ CustomerStatus,
@CountryID int,
@CityID int,
@Notes nvarchar (макс.),
@ModifiedBy nvarchar (30)


как

НАЧАТЬ
обновление набора CustomersTbl
CustomerID=@CustomerID,
CustomerName=@CustomerName,
CustomerPhoto=@CustomerPhoto,
CustomerEmail=@CustomerEmail,
CustomerPhone1=@CustomerPhone1,
CustomerPhone2=@CustomerPhone2,
Атрибута Типа Customeraddress=@Атрибута Типа Customeraddress,
CustomerFax=@CustomerFax,
CustomerStatus=@CustomerStatus,
CountryID=@CountryID,
CityID=@CityID,
Примечания=@Notes,
ModifiedDate=getdate(),
Поле Modifiedby=@Поле Modifiedby
где CustomerID=@CustomerID

КОНЕЦ


Но изображение было установлено на ноль

Ramesh Kumar Barik

Она будет прекрасно работать.
Но вы хотите передать значение @CustomerPhoto в SP. Поэтому со стороны приложения проверьте, содержит ли файл изображения значение или нет.

khalid4775

http://store6.up-00.com/2017-04/149183753091961.jpg

Но образ есть


http://store6.up-00.com/2017-04/149183753103342.jpg

Ramesh Kumar Barik

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

Измените тип данных параметра на Varchar(200);
Пример: @CustomerPhoto varchar(200)

из приложения передайте сгенерированное имя файла этому параметру, и он сохранит вновь сгенерированное имя файла в БД.
Когда вы извлекаете изображение из БД, вы можете добавить физический путь со значением столбца.
Экс:

Выберите 'http://store6.up-00.com/2017-04/'+ CustomerPhoto as CustomerPhoto from CustomersTbl where where CustomerID=@CustomerID.

Проверьте этот код он может вам помочь :)