Ошибка преобразования при преобразовании значения nvarchar ‘abc’ в тип данных int в nopcommerce 4.3

#sql #sql-server #stored-procedures #nopcommerce #sqlexception

#sql #sql-сервер #хранимые процедуры #nopcommerce #исключение sqlexception

Вопрос:

Я хочу выполнить поиск опции GTIN в списке продуктов администратора. Итак, для этого я предоставляю значение GTIN в процедуре ProductLoadAllPaged store. Теперь, когда я ищу значение GTIN из списка продуктов в то время, выдает ошибку datatable и из консольного приложения получает сообщение, что

System.Data.SqlClient.SQLException (0x80131904): ошибка преобразования при преобразовании значения nvarchar ‘abc’ в тип данных int.

Вот добавленный код процедуры хранения,

 ALTER PROCEDURE [dbo].[ProductLoadAllPaged]
(
    @GTIN nvarchar(50) --AWAZ
)
AS
BEGIN
    .....
    
    --filter by vendor
    IF @VendorId > 0
    BEGIN
        SET @sql = @sql   '
        AND p.VendorId = '   CAST(@VendorId AS nvarchar(max))
    END
    
    --AWAZ
    IF @GTIN is not null
    BEGIN
        SET @sql = @sql   '
        AND p.Gtin = '    @GTIN             
    END

    --filter by warehouse
    IF @WarehouseId > 0
    BEGIN
        --we should also ensure that 'ManageInventoryMethodId' is set to 'ManageStock' (1)
        --but we skip it in order to prevent hard-coded values (e.g. 1) and for better performance
        SET @sql = @sql   '
        AND  
            (
                (p.UseMultipleWarehouses = 0 AND
                    p.WarehouseId = '   CAST(@WarehouseId AS nvarchar(max))   ')
                OR
                (p.UseMultipleWarehouses > 0 AND
                    EXISTS (SELECT 1 FROM ProductWarehouseInventory [pwi]
                    WHERE [pwi].WarehouseId = '   CAST(@WarehouseId AS nvarchar(max))   ' AND [pwi].ProductId = p.Id))
            )'
    END
    
    .....
END
 

Комментарии:

1. вам нужно заключить @GTIN в кавычки, чтобы это считалось изменением символа AND p.Gtin = ' @GTIN на И p.Gtin = » @GTIN «»

2. знаете ли вы, в каком из столбцов или параметров хранится значение «abc»? Вы проверяете, является ли «VendorID» и позже, если «WarehouseID» больше 0. Для выполнения этого сравнения SQL необходимо преобразовать «VendorID» / «WarehouseID» в тип данных integer. Остальная часть вашей процедуры, похоже, не вызывает эту ошибку, ИМХО.

3. @MathiasFogel в GTIN «abc» — это магазин. В противном случае нет связи с vendorid и warehouseid, которые я показываю, потому что вы можете знать, что между vendorid и warehouseid я добавил код.

4. @eshirvana Я использовал ваш код и его фильтрацию, но показывал пустые данные, в то время как данные были.

5. @s.k.Soni вы уверены?, Я предполагаю, что вам нужно использовать like

Ответ №1:

так что, похоже, вам нужно изменить эту часть кода :

    --AWAZ
    IF @GTIN is not null
    BEGIN
        SET @sql = @sql   '
        AND p.Gtin like ''%'   @GTIN   '%'''            
    END
 

Комментарии:

1. Идеальный. Большое спасибо за помощь. 🙂