【问题标题】:SQL Server stored procedure expects parameterSQL Server 存储过程需要参数
【发布时间】:2019-03-15 03:32:18
【问题描述】:

为什么我总是收到这个错误:

System.Data.SqlClient.SqlException:'过程或函数'getTicket'需要参数'@project_id',但未提供。'

我已经创建了程序:

ALTER PROCEDURE [dbo].[getTicket]
    @project_id INT
AS
BEGIN
    SELECT 
        ticket_id, 
        ticket_name, 
        ticket_description, 
        ticket_url, 
        ticket_date_posted, 
        ticket_status 
    FROM 
        ticket 
    WHERE 
        project_id = @project_id
END

这是我的vb代码:

Dim sqlCom As SqlCommand = New SqlCommand
sqlCom.Connection = SQLcon
sqlCom.CommandType = CommandType.StoredProcedure
sqlCom.CommandText = "getTicket"

sqlCom.Parameters.AddWithValue("@project_id", Request.QueryString("id"))

SQLcon.Open()

Dim DS As New DataSet
Dim SQLDA As SqlDataAdapter = New SqlDataAdapter(sqlCom.CommandText, SQLcon)
SQLDA.SelectCommand.CommandTimeout = 120

SQLDA.Fill(DS, "gvTable")
GridView1.DataSource = DS
GridView1.DataBind()

SQLcon.Close()

【问题讨论】:

  • 在这个sqlCom.Parameters.AddWithValue("@project_id", Request.QueryString("id"))里Request.QueryString("id")的数据类型是什么??

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


【解决方案1】:

这是错误的:

Dim SQLDA As SqlDataAdapter = New SqlDataAdapter(sqlCom.CommandText, SQLcon)

应该是这样的:

Dim SQLDA As SqlDataAdapter = New SqlDataAdapter(sqlCom)

问题是您正在创建一个SqlCommand 对象并向其添加参数,但随后您创建了一个不使用该命令的SqlDataAdapter。相反,您只需将 SQL 代码作为 String 传递给构造函数,因此数据适配器会使用它创建一个新的 SqlCommand 对象。当然,这个新命令没有添加参数。

您的代码的其他方面也不是最理想的。以下是我认为的两个明智的选择:

Dim sqlCom As SqlCommand = New SqlCommand("getTicket", SQLcon) 
    With {.CommandType = CommandType.StoredProcedure, .CommandTimeout = 120}
sqlCom.Parameters.AddWithValue("@project_id", Request.QueryString("id"))

Dim SQLDA As SqlDataAdapter = New SqlDataAdapter(sqlCom)

还有……

Dim SQLDA As SqlDataAdapter = New SqlDataAdapter("getTicket", SQLcon)
With SQLDA.SelectCommand
    .CommandType = CommandType.StoredProcedure
    .CommandTimeout = 120
    .Parameters.AddWithValue("@project_id", Request.QueryString("id"))
End With

即便如此,这还是忽略了应避免使用 AddWithValue 并将 Add 与 Value 属性的显式设置一起使用的事实,例如

.Parameters.Add("@project_id", SqlDbType.Int).Value = Request.QueryString("id"))

【讨论】:

  • 不是这样......你解决了它改变了这个
    Dim SQLDA As SqlDataAdapter = New SqlDataAdapter(sqlCom.CommandText, SQLcon)
    到这个
    Dim SQLDA As SqlDataAdapter = 新的 SqlDataAdapter(sqlCom)
【解决方案2】:

两种传递参数的多种方式。

sqlCom.Parameters.AddWithValue("@project_id", SqlDbType.Int,Convert.toInt32(Request.QueryString("id")))

OR

sqlCom.Parameters.Add("@project_id", SqlDbType.Int);
sqlCom.Parameters("@project_id").Value = Convert.toInt32(Request.QueryString("id"));

【讨论】:

    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多