Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储过程无法从ASP.NET运行_Asp.net_Sql Server_Vb.net_Ado.net - Fatal编程技术网

存储过程无法从ASP.NET运行

存储过程无法从ASP.NET运行,asp.net,sql-server,vb.net,ado.net,Asp.net,Sql Server,Vb.net,Ado.net,我有以下存储过程: 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,

我有以下存储过程:

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()
Dim varDbconn作为新的SqlConnection
Dim varDbcomm As SqlCommand
Dim varDbRead作为SqlDataReader
varDbconn.ConnectionString=ConfigurationManager.ConnectionString(“CPDB_ConnectionString”).ToString
varDbconn.Open()
如果Request.QueryString(“程序”),则
varDbcomm=newsqlcommand(“SPCP\u程序更新”,varDbconn)
varDbcomm.CommandType=CommandType.StoredProcess
varDbcomm.Parameters.AddWithValue(@ID),Request.QueryString(“程序”)).DbType=DbType.Int32
varDbcomm.Parameters.AddWithValue(“@UserID”,会话(“UserID”))。DbType=DbType.Int32
varDbcomm.Parameters.AddWithValue(“@University”,Session(“DecryptID”)).DbType=DbType.Int32
varDbcomm.Parameters.AddWithValue(“@Level”,ddlevel.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()
其他的
....
如果结束
varDbconn.Close()
什么也没发生


有什么想法吗?

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

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


调试您的代码,并查看您要传递给DB的参数。检查您的连接字符串,查看您正在访问已修改存储过程的数据库。

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

在完成Parmater设置后,尝试添加以下代码:

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

这样,在调试窗口中(或根据VS设置立即),您将看到参数值和参数名称的列表。我怀疑这里有一个session()值出错。

您需要调试它,这意味着在行
ExecuteNonQuery
上放置一个断点,检查每个参数值,并确认其正确性。此外,您应该明确地设置所有参数的类型和精度。您还应该包含完整的SP代码,而不是片段。而且您似乎没有错误处理,您应该有一个try/catch块,以便能够检测发生的任何错误。最好使用varDbcomm.Parameters.Add(“@param”,SqlDbType)。value=value,这样您就可以精确地处理数据类型并将其放入try-catch块中。ASP.NET是一个web堆栈,它不连接到数据库。这是ADO.NET的工作。你会发现很多关于它的教程可以追溯到2002年,但没有一个使用你尝试过的语法。在所有这些系统中,连接和命令都是在
内部使用
块创建的,从不显式地释放或关闭。如果引发异常,则连接将保持打开状态,如果将
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(会话(“UserID”)