#sql #vb.net #tsql #ado.net #sqlcommand
#sql #vb.net #tsql #ado.net #sqlcommand
Вопрос:
У меня есть команда SQL, которую я пытаюсь выполнить.
Синтаксис выглядит следующим образом
Public Shared Function CanRaiseWorkOrder(connection As IDbConnection, ProductID As Guid) As Boolean
Using sqlCmd As IDbCommand = connection.CreateCommand
With sqlCmd
.CommandTimeout = 30
.CommandType = CommandType.Text
.CommandText = "DECLARE @CanRaiseWorkOrder BIT, @WorkOrderQtyCount INT, @ProductAvailCount INT SET @WorkOrderQtyCount = (SELECT SUM(Qty) FROM WorkOrder WHERE ProductID = @ProductID AND WorkOrder.Status <> 4) --4 = Voided SET @ProductAvailCount = (SELECT Qty FROM Product WHERE ProductID = @ProductID) IF @WorkOrderQtyCount < @ProductAvailCount BEGIN SET @CanRaiseWorkOrder = 1 END ELSE BEGIN SET @CanRaiseWorkOrder = 0 END SELECT @CanRaiseWorkOrder AS CanRaiseWorkOrder"
Dim params As New List(Of IDbDataParameter)({
ProductDAL.CreateTSqlParameter("@ProductID", DbType.Guid, ProductID)
})
.Parameters.AddRange(params)
Return .ExecuteScaler(Of Boolean)()
End With
End Using
End Function
Как вы, вероятно, заметили, там есть некоторые настройки в отношении того, как создаются параметры и выполняется команда, но вы можете предположить, что эти аспекты системы работают по мере необходимости (у нас есть значительный объем кода, который корректно функционирует с использованием этих методов).
Вероятно, некоторые люди спросят, почему это не хранимая процедура, и ответ будет «потому что так сказал мой босс».
Я запустил SQL profiler, и вот результат, который фактически генерирует этот запрос.
exec sp_executesql N'DECLARE @CanRaiseWorkOrder BIT, @WorkOrderQtyCount INT, @ProductAvailCount INT SET @WorkOrderQtyCount = (SELECT SUM(Qty) FROM WorkOrder WHERE ProductID = @ProductID AND WorkOrder.Status <> 4) --4 = Voided SET @ProductAvailCount = (SELECT Qty FROM Product WHERE ProductID = @ProductID) IF @WorkOrderQtyCount < @ProductAvailCount BEGIN SET @CanRaiseWorkOrder = 1 END ELSE BEGIN SET @CanRaiseWorkOrder = 0 END SELECT @CanRaiseWorkOrder',N'@ProductID uniqueidentifier',@ProductID='0908C780-763F-4CE6-B074-CEC01F4451B4'
Запуск кода в анализаторе запросов (когда я его изначально создавал) работает нормально, но если я выполняю приведенный выше запрос как выводимый из команды SQL, все, что я получаю, это « Command(s) completed successfully.
«
Есть идеи?
Комментарии:
1. У меня есть несбыточные мечты, или я буду
--4 = Voided...
обрабатывать остальную часть строки как комментарий, оставляя вам только команду SET?2. @BradChristie: Сделайте это ответом!
Ответ №1:
Полагаю, я сделаю это ответом, но также хотел убедиться, что я был точен (учитывая, как долго я уже встал: grin:).
Из того, что я вижу (и это, вероятно, связано с сокращением вашего оператора, чтобы сделать его однострочным в файле кода), у вас есть объявление комментария в середине вашего оператора:
--4 = Voided [...]
Происходит то, что вы выполняете только свои команды DECLARE и first SET (которые выполняются без ошибок), но остальная часть вашего оператора игнорируется, поскольку она следует за объявлением комментария ( --
) .
Убедитесь, что при сжатии запроса вы удаляете строки с комментариями. Как только они находятся в одной строке, SQL не заботится и БУДЕТ игнорировать все, что за --
.
Комментарии:
1. Боже, каким идиотом я себя чувствую… Это было все. Я думаю, что я сам слишком долго. лол, я перепробовал все, что мог придумать, и ничего не добился. Каждый раз, когда я бы отлаживал ее в анализаторе запросов, я бы форматировал все, тем самым устраняя проблему. Извините, 2 потратили ваше время впустую.
2. @MaximGershkovich: Не беспокойтесь, у всех нас есть ладони после долгих сеансов кодирования. 😉