【问题标题】:Stored Procedure not working from ASP.NET存储过程在 ASP.NET 中不起作用
【发布时间】:2021-02-28 11:02:34
【问题描述】:

我有以下存储过程:

alter proc SPCP_ProgramUpdate
    @ID int, 
    @UserID int,
    @Name nvarchar(150),
    @University int,
    @Level tinyint,
    @isActive bit
    as
    update tblUniversityProgram set University_Fkey = @University, Level_Fkey = @Level, Program_Name = @Name, EditDate = GETDATE(), EditUser = @UserID, isActive = @isActive
    where tblUniversityProgram.ID = @ID

当我从 SSMS 运行存储过程时,它按预期工作。

但是,当我使用此代码从 ASP.NET 运行该存储过程时:

Dim varDbconn As New SqlConnection
Dim varDbcomm As SqlCommand
Dim varDbRead As SqlDataReader
varDbconn.ConnectionString = ConfigurationManager.ConnectionStrings("CPDB_ConnectionString").ToString

varDbconn.Open()

If Request.QueryString("program") <> "" Then
    varDbcomm = New SqlCommand("SPCP_ProgramUpdate", varDbconn)
    varDbcomm.CommandType = CommandType.StoredProcedure
    varDbcomm.Parameters.AddWithValue("@ID", Request.QueryString("program")).DbType = DbType.Int32
    varDbcomm.Parameters.AddWithValue("@UserID", Session("UserID")).DbType = DbType.Int32
    varDbcomm.Parameters.AddWithValue("@University", Session("DecryptID")).DbType = DbType.Int32
    varDbcomm.Parameters.AddWithValue("@Level", ddlLevel.SelectedValue).DbType = DbType.Byte
    varDbcomm.Parameters.AddWithValue("@isActive", chkisActive.Checked).DbType = DbType.Boolean
    varDbcomm.Parameters.AddWithValue("@Name", txttitle.Text).DbType = DbType.String

    varDbcomm.ExecuteNonQuery()
    varDbcomm.Dispose()

Else
....

End IF

varDbconn.Close()

什么都没有发生。

有什么想法吗?

【问题讨论】:

  • 您需要调试它,这意味着在ExecuteNonQuery 行上放置一个断点并检查每个参数值并确认它应该是什么。你也是shouldn't use AddWithValue,而是应该明确设置所有参数的类型和精度。您还应该包含完整的 SP 代码而不是片段。而且你似乎没有错误处理,你应该有一个 try/catch 块,这样你就可以检测到发生的任何错误。
  • 使用 varDbcomm.Parameters.Add("@param", SqlDbType).value = value 可能会更好,这样您就可以精确地确定数据类型并将其放入 try catch 块中
  • ASP.NET 是一个 Web 堆栈,它不连接到数据库。这就是 ADO.NET 的工作。您会找到很多可追溯到 2002 年的教程,其中 none 使用了您尝试过的语法。在 all 中,连接和命令是在 using 块内创建的,从未显式处置或关闭。如果抛出异常,连接将保持打开状态,保留任何事务或锁定并阻止其他连接
  • 如果您将DbType 设置为DbType.Int32,ADO.NET 不会将字符串解析为整数。 更改参数类型在你设置它的值之后也不会解析它或引发任何错误。您必须解析代码中的值并将解析后的值设置为每个参数的 Value 属性。解析 ID 后,请改用 Add("@ID", DbType.Int32).Value=someInt
  • 因为您似乎在使用System.Data.SqlClient 使用SqlDbType 而不是DbType 例如varDbcomm.Parameters.Add("@UserID", SqlDbType.Int) = CInt(Session("UserID"))

标签: asp.net sql-server vb.net ado.net


【解决方案1】:

你所拥有的应该可以工作。我会使用 parmaters.Add 代替 addwith,但这并不重要。

尝试在设置完参数后立即添加此代码:

    Debug.Print("SQL = " & varDbcomm.CommandText)
    For Each p As SqlParameter In varDbcomm.Parameters
        Debug.Print(p.ParameterName & "->" & p.Value)
    Next

这样在调试窗口中(或立即取决于 VS 设置),您会看到参数值列表和参数名称。我怀疑其中一个 session() 值在这里搞砸了。

【讨论】:

    【解决方案2】:

    您的问题最有可能的答案是,您从程序的查询字符串中得到的值不是您期望的数据库中的 Id。

    此时,您的代码正在读取输入值并将它们传递给存储过程,而没有对您的预期值进行任何验证 - 例如,缺少会话可能会导致您出现各种意外问题。

    调试您的代码并准确查看您传递给数据库的参数。检查你的连接字符串,看看你访问的是你修改了存储过程的数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2021-10-31
      相关资源
      最近更新 更多