2013-07-02 2 views
0

Этот запрос отлично работает в Sql Server Management Studio, но когда я пытаюсь запустить его в наборе данных & pass Date (@ Param2 & @ Pram3) из сборщика данных, его выброс исключений. Ошибка конверсии. Я не знаю, что в этом плохого, мои другие вопросы работают нормально. Это происходит из-за UNION ALL?Ошибка конверсии при преобразовании даты и/или времени из символьной строки

.NET Код

startDatePicker.Format = DateTimePickerFormat.Short; 
endDatePicker.Format = DateTimePickerFormat.Short; 
DataTable ntwTable = ntw.GetData(owner,start,end); 
start = startDatePicker.Value.ToShortDateString(); 
end = endDatePicker.Value.ToShortDateString(); 

SQL

SELECT  o.Name, SUM(sq.SQuantity * sq.SRate) AS TotalSale, SUM(sq.PrQuantity * sq.PrRate) AS TotalPurchase, (SUM(sq.PQuantity) - SUM(sq.SQuantity)) 
           * (SUM(sq.PQuantity * sq.PRate)/SUM(sq.PQuantity)) AS Inventory 
     FROM   (SELECT  OwnerId, CompanyId, Quantity AS PQuantity, RatePerShare AS PRate, 0 AS SQuantity, 0 AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   Purchase 
            UNION ALL 
            SELECT  OwnerId, CompanyId, 0 AS PQuantity, 0 AS PRate, 0 AS SQuantity, 0 AS SRate, Quantity AS PrQuantity, RatePerShare AS PrRate, Date 
            FROM   Purchase AS pr 
            UNION ALL 
            SELECT  OwnerId, CompanyId, Quantity AS PQuantity, 0 AS PRate, 0 AS SQuantity, 0 AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   Bonus 
            UNION ALL 
            SELECT  OwnerId, CompanyId, Quantity AS PQuantity, CostOfShare AS PRate, 0 AS SQuantity, 0 AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   RightShare 
            UNION ALL 
            SELECT  OwnerId, CompanyId, 0 AS PQuantity, 0 AS PRate, Quantity AS SQuantity, RatePerShare AS SRate, 0 AS PrQuantity, 0 AS PrRate, Date 
            FROM   Sales) AS sq INNER JOIN 
           Owner AS o ON o.OwnerId = sq.OwnerId 
     WHERE  (o.OwnerId = @Param1) AND (sq.Date BETWEEN @Param2 AND @Param3) 
     GROUP BY sq.CompanyId, o.Name 
+0

Что представляют собой типы данных '@ Param2' и' @ Param3'? Как вы вызываете запрос в своем коде? – LittleBobbyTables

+0

Вы не указали код вызова. Но это почти наверняка, потому что (в какой-то момент) вы вызываете ненужное преобразование значения 'datetime' в строку. И тогда что-то не так с переводом обратно в значение 'datetime' –

+0

Можем ли мы увидеть код, в котором вы его передаете .... если он работает в SSMS, а не в C#, то это, вероятно, проблема с его передачей. – logixologist

ответ

1

В коде есть два (очевидно) возможности отказа.

Первый будет в неявной ошибке преобразования в столбце date. Это произошло бы, если purchase.date были значением даты/времени, но один из столбцов в union all не является: bonus.date, rightshares.date , or sales.date . To be honest, I would be surprised if this is the case. However, it is easy enough to check for. Just run the Объединение всех запросов в SSMS, чтобы узнать, произошла ли ошибка.

Вторая возможность - это что-то не так с @Param1 или @Param2. Кажется, что они передаются как строки. Вы можете проверить это, глядя на строке и просто делать:

select cast(@Param1 as datetime), cast(@Parame2 as datetime) 

Одна из возможных проблем являются различными форматами даты в операционной системе и уровне базы данных. В одном, например, 20/01/2013 может быть 20 января, а в другом - ошибке. Если это проблема, вы можете использовать convert() для преобразования параметров в нужный формат (в базе данных) или их преобразования перед их передачей.

+0

Я пробовал, но все же не повезло – user2516394

+0

(CONVERT (CHAR (10), sq.Date, 111) BETWEEN @ Param2 AND @ Param3) спасибо большое за ваш ответ! – user2516394

0

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

start = startDatePicker.Value.ToShortDateString(); 
end = endDatePicker.Value.ToShortDateString(); 

To:

start = startDatePicker.Value.ToString("yyyy-MM-dd HH:mm:ss") 
end = endDatePicker.Value.ToString("yyyy-MM-dd HH:mm:ss") 

Тогда я считаю, что это должно работать нормально.

0

(CONVERT (CHAR (10), sq.Date, 111) МЕЖДУ @ Param2 И @ Param3)

Просто нужно конвертировать.

Смежные вопросы

 Смежные вопросы