【发布时间】: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 useAddWithValue,而是应该明确设置所有参数的类型和精度。您还应该包含完整的 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