【问题标题】:Debugging a vb.net SQL command调试 vb.net SQL 命令
【发布时间】:2010-11-23 15:29:41
【问题描述】:

我正在尝试调用执行 INSERT 的 SQL 存储过程。然而,当我浏览我的 vb.net 代码时,我收到一条消息说 “过程或函数 sp_InsertARPlanner 指定了太多参数。”

我已经仔细检查过,但 VB 中的 SQL 字符串与存储过程中的参数数相同。

有什么想法可以调试吗?

更新

    SQLCmd.CommandText = "sp_InsertARPlanner"
    SQLCmd.CommandType = CommandType.StoredProcedure

SQLCmd.Parameters.AddWithValue("@Origin", Trim(txtOrigin.Text))
SQLCmd.Parameters.AddWithValue("@Destination", Trim(txtDest.Text))
SQLCmd.Parameters.AddWithValue("@Miles", iMiles)
SQLCmd.Parameters.AddWithValue("@Rate", iAvgRateperMile)
SQLCmd.Parameters.AddWithValue("@MinCost", dMinCost)
SQLCmd.Parameters.AddWithValue("@Zone", sZone)
SQLCmd.Parameters.AddWithValue("@LaneHaulCost", dLaneHaulCost)
SQLCmd.Parameters.AddWithValue("@TotalCost", dTotalCost)              
SQLCmd.Parameters.AddWithValue("@TotalWithSurch", dTotalWithSurch)
SQLCmd.Parameters.AddWithValue("@AvgTypeRate", sAvgTypeRate)    
SQLCmd.Parameters.AddWithValue("@AvgLoads", sAvgLoads)          
SQLCmd.Parameters.AddWithValue("@FuelLevel", dFuelPercent)    
SQLCmd.Parameters.AddWithValue("@Fuel", dFuelAmount)      
SQLCmd.Parameters.AddWithValue("@AverageRateAmount", dAverageRateAmount)
SQLCmd.Parameters.AddWithValue("@Floor", decFloor)
SQLCmd.Parameters.AddWithValue("@RainBulkRate", decBulkRate)
SQLCmd.Parameters.AddWithValue("@RateComments", txtRateDesc..Text)
SQLCmd.Parameters.AddWithValue("@PremiumField", txtPremium.Text)
SQLCmd.Parameters.AddWithValue("@EquipCategory", Trim(cboEquipType.Text))
SQLCmd.Parameters.AddWithValue("@UpdateDate", DateTime.Now)
SQLCmd.Parameters.AddWithValue("@FreightDesc", "txtFreightDesc.Text")

Try
    SQLCmd.ExecuteNonQuery()
Catch ex As Exception
    MsgBox(ex.Message)
    SQLCon.Close()
    SQLCmd.Parameters.Clear()
    Exit Sub
End Try  

ALTER PROCEDURE [dbo].[sp_InsertARPlanner]
    (@Origin nvarchar(150)
           ,@Destination nvarchar(150)
           ,@Miles nvarchar(50)
           ,@Rate nvarchar(5)
           ,@MinCost decimal(5,2)
           ,@Zone varchar(3)
           ,@LaneHaulCost decimal(5, 2)
           ,@TotalCost decimal(5, 2)
           ,@TotalWithSurch decimal(5, 2)
           ,@AvgTypeRate varchar(50)
           ,@AvgLoads varchar(4)
           ,@FuelPercent decimal(5,2)
           ,@FuelAmount decimal(5,2)
           ,@AverageRateAmount decimal(5,2)
           ,@Floor decimal(5, 2)
           ,@RainBulkRate decimal(5, 2)
           ,@RateComments nvarchar(50)
           ,@PremiumField nvarchar(50)
           ,@EquipCategory nvarchar(50)
           ,@UpdateDate datetime
           ,@FreightDesc nvarchar(50))

【问题讨论】:

  • 如果您可以发布代码和 SQL 过程,也许这里有人可以为您找到额外的参数;)
  • 您使用的是参数化查询还是直接字符串 INSERT?

标签: sql-server vb.net stored-procedures .net-2.0


【解决方案1】:

试试这个:

  1. 不要以sp_开始你的存储过程名称,它代表sql server中的系统过程,并且会导致sql server做额外的工作来寻找你的过程(虽然这不是你的问题,但这是一个好习惯)。
  2. 获取程序创建的过程字符串并将其粘贴到 sql server management studio 窗口中,以确保它在那里工作。如果没有,那么您知道问题出在哪里。
  3. 如果是这样,请确保您使用的是您认为的数据库。如果您有多个环境,则您所访问的数据库可能不是具有正确数量参数的数据库。

【讨论】:

  • 疯狂的解析,但是 cmd 对象在之前的例程中没有被关闭,所以指向另一个存储过程。
【解决方案2】:

在单步执行代码时,存储过程及其参数会被填充,可能在 SqlCommand 对象中。您可以在断点处捕获该存储过程调用。然后,将其复制到您的查询工具中,调用 EXEC 并粘贴 sproc 调用。然后运行它。这样,您将执行代码发送的确切存储过程调用。

如果您提供代码的更多详细信息,我们可以更具体地说明如何捕获 sproc 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多