объявить переменную в хранимой процедуре sql 2008

#sql #vb.net #sql-server-2008 #stored-procedures #declare

#sql #vb.net #sql-server-2008 #хранимые процедуры #объявить

Вопрос:

Я работаю над проектом, который использует хранимую процедуру. Когда я пытаюсь использовать хранимую процедуру в проекте, я получаю эту ошибку:

 The formal parameter "@Mode" was not declared as an OUTPUT parameter, but the actual parameter passed in requested output.
  

Пожалуйста, помогите мне в решении этой проблемы.

Это моя хранимая процедура:

 alter PROCEDURE [ITAssets_sp_IT_Assets]
-- Add the parameters for the stored procedure here

    (@Mode varchar(12)='ADD',
    @ID integer , @AssetCode nvarchar(20)=null, @Description nvarchar(70)=null,
    @Site nvarchar(10)=null)
AS
Begin

    IF @Mode='ADD'
        Begin
  Begin Tran
      INSERT INTO [IT_Assets]
          ([ID]
                ,[AssetCode]
                ,[Description]
                ,[Site])
                    values
    (@ID, @AssetCode, @Description, @Site
    )
     If @@ERROR <> 0  
            ROLLBACK TRAN 
        Else
            COMMIT TRAN

    Select  @ID
End
ELSE 
Begin
        Begin Tran
                UPDATE [IT_Assets]
                    SET 
    AssetCode = @AssetCode, Description = @Description, Site = @Site 
    WHERE ID = @ID      
    If @@ERROR <> 0  
            ROLLBACK TRAN 
        Else
            COMMIT TRAN
        Select  @ID 
End
End
  

Я вызываю хранимую процедуру в приведенном ниже коде:

 Dim ht As New Hashtable

ht.Add("@Mode", "ADD")
ht.Add("@ID", txtID.Text)
ht.Add("@AssetCode", txtAssetCode.Text)
ht.Add("@Description", txtDescription)
ht.Add("@Site", ddlSite.SelectedValue.ToString())

AppExecuteNonQuery(CommandType.StoredProcedure, "IT_Assets", , ht)
  

AppExecuteNonQuery код:

  Public Shared Function AppExecuteNonQuery(ByVal SQLCommandType As CommandType, ByVal Command As String, Optional ByVal ParamTable As Hashtable = Nothing, Optional ByRef OutputParamTable As Hashtable = Nothing, Optional ByVal UsePrimaryConnection As Boolean = True, Optional ByVal ConnName As String = "", Optional ByVal ConnString As String = "") As Integer
        Dim cmd As SqlCommand
        Try
            If UsePrimaryConnection Then
                cmd = AppGetSQLCommand(SQLCommandType, Command, ParamTable, OutputParamTable, AppProperties.ConnectionString, True, UsePrimaryConnection, ConnName, ConnString)
            Else
                cmd = AppGetSQLCommand(SQLCommandType, Command, ParamTable, OutputParamTable, AppProperties.ConnectionString1, True, UsePrimaryConnection, ConnName, ConnString)
            End If

            Dim res As Integer = cmd.ExecuteNonQuery

            For Each param As SqlParameter In cmd.Parameters
                If param.Direction = ParameterDirection.Output Then
                    OutputParamTable(param.ParameterName) = param.Value
                End If
            Next

            Return res
        Finally
            If Not cmd Is Nothing Then
                If Not cmd.Connection Is Nothing Then
                    If cmd.Connection.State = ConnectionState.Open Then
                        cmd.Connection.Close()
                    End If
                End If
            End If
        End Try
    End Function
  

Комментарии:

1. Как вы вызываете хранимую процедуру?

2. @shree.pat18 отредактированный вопрос

3. И не могли бы вы также поделиться кодом AppExecuteNonQuery метода? Ошибка, похоже, указывает на то, что оператор, вызывающий вашу процедуру, имеет проблемы.

4. Это может быть стандартизировано, но это не значит, что это не источник ошибки. Ошибка явно указывает на «фактический параметр, переданный в запрошенном выводе» — поэтому нам нужно увидеть код, который генерирует фактические параметры.

5. @Damien_The_Unbeliever ответ отредактирован

Ответ №1:

У вас есть это в вашем коде:

 AppExecuteNonQuery(CommandType.StoredProcedure, "IT_Assets", , ht)
  

Поскольку ht находится в позиции 4, ей присваивается OutputParamTable значение, которое добавляет OUTPUT параметры в хранимую процедуру. Это именно то, что говорится и в сообщении об ошибке.

Чтобы исправить это, переместите ее в позицию 3, т.е.

 AppExecuteNonQuery(CommandType.StoredProcedure, "IT_Assets", ht)
  

Комментарии:

1. Я получил эту ошибку No mapping exists from object type System.Web.UI.WebControls.TextBox to a known managed provider native type.

2. @7alhashmi — это потому, что вы добавляете txtDescription , а не txtDescription.Text в качестве @Description параметра.

3. @Damien_The_Unbeliever Спасибо! Я пропустил это.