【发布时间】:2011-11-27 08:32:21
【问题描述】:
我正在尝试执行一条 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 分析器,这里是这个查询实际生成的输出。
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.”
有什么想法吗?
【问题讨论】:
-
我是在做白日梦,还是
--4 = Voided...会将字符串的其余部分视为注释,只留下一个 SET 命令? -
@BradChristie:回答这个问题!
标签: sql vb.net tsql ado.net sqlcommand