Хранимая процедура SQL Server ожидает параметр - PullRequest
1 голос
/ 15 марта 2019

Почему я получаю эту ошибку:

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()

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Это неправильно:

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"))
0 голосов
/ 15 марта 2019

Много способов, два параметра передачи.

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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...